1<!DOCTYPE html><html class="light" lang="zh"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/><title>UTX èªå¨åå·¥å
·ä»ç»</title>
1<script type="module" src="https://openutx.cn/.webmcp/bridge.js" data-packs="c2pa,mcp-server-client"></script>
1<link rel="icon" href="https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp"/><meta name="description" content=" æä½³ç®ãæµè¯å¼åå¤è´§ãï¼ä¸æ³¨äºæµè¯å¼åé¢åææ¯å享ã"/><meta name="robots" content="index, follow"/><meta name="keywords" content="弿ºé¡¹ç®"/><meta name="next-head-count" content="7"/><link rel="preload" href="/_next/static/css/2e8f2903920e3d56.css" as="style"/><link rel="stylesheet" href="/_next/static/css/2e8f2903920e3d56.css" data-n-g=""/><link rel="preload" href="/_next/static/css/9ae4dde6b7ac938f.css" as="style"/><link rel="stylesheet" href="/_next/static/css/9ae4dde6b7ac938f.css" data-n-p=""/><link rel="preload" href="/_next/static/css/0db0828466c00f5b.css" as="style"/><link rel="stylesheet" href="/_next/static/css/0db0828466c00f5b.css" data-n-p=""/><link rel="preload" href="/_next/static/css/0711441c4e3c80d9.css" as="style"/><link rel="stylesheet" href="/_next/static/css/0711441c4e3c80d9.css"/><noscript data-n-css=""></noscript>
1<script defer="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script>
1<script src="/initTheme.js" defer="" data-nscript="beforeInteractive"></script>
1<script defer="" src="/_next/static/chunks/b032eac9.24d97d4a850d0206.js"></script>
1<script defer="" src="/_next/static/chunks/30301079.6eaa8133e6f76939.js"></script>
1<script defer="" src="/_next/static/chunks/579.7dd46b81306fe193.js"></script>
1<script src="/_next/static/chunks/webpack-062d0ccaa60c25a2.js" defer=""></script>
1<script src="/_next/static/chunks/framework-2647c7e378e02044.js" defer=""></script>
1<script src="/_next/static/chunks/main-07f3e9546a50d5ce.js" defer=""></script>
1<script src="/_next/static/chunks/pages/_app-4defada4b6a84c36.js" defer=""></script>
1<script src="/_next/static/chunks/5c6f9df4-222dcbb456633b3c.js" defer=""></script>
1<script src="/_next/static/chunks/dce46a15-62968ba2de7f8f2d.js" defer=""></script>
1<script src="/_next/static/chunks/426-909ad63f86439a6b.js" defer=""></script>
1<script src="/_next/static/chunks/11-e85653d868b202da.js" defer=""></script>
1<script src="/_next/static/chunks/640-06fe601a73ff6e81.js" defer=""></script>
1<script src="/_next/static/chunks/666-edd3f4d2e1406b6a.js" defer=""></script>
1<script src="/_next/static/chunks/390-3baf7084e1a0b56a.js" defer=""></script>
1<script src="/_next/static/chunks/178-5833a2c5a1b65a39.js" defer=""></script>
1<script src="/_next/static/chunks/pages/post/%5Bid%5D-a8cdae9081399362.js" defer=""></script>
1<script src="/_next/static/77JJh7CBRvlkoRHH7B3Ea/_buildManifest.js" defer=""></script>
1<script src="/_next/static/77JJh7CBRvlkoRHH7B3Ea/_ssgManifest.js" defer=""></script>
1</head><body><div id="__next"><div style="position:fixed;z-index:9999;top:16px;left:16px;right:16px;bottom:16px;pointer-events:none"></div><div class="fixed w-full h-full top-0 left-0 right-0 bottom-0 justify-center items-center flex" style="z-index:100;background-color:rgba(0,0,0,0.4);visibility:hidden"><div class="bg-white w-3/4 p-4 rounded-xl card-shadow dark:card-shadow-dark transition-all dark:bg-dark" style="min-height:280px;min-width:360px;max-width:710px;transform:scale(0)"><div class="flex items-center dark:text-dark text-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2305" width="24" height="24" fill="currentColor"><path d="M789.804097 737.772047 742.865042 784.699846 898.765741 940.600545 945.704796 893.672746Z" p-id="2306"></path><path d="M456.92259 82.893942c-209.311143 0-379.582131 170.282245-379.582131 379.582131s170.270988 379.570875 379.582131 379.570875c209.287607 0 379.558595-170.270988 379.558595-379.570875S666.210197 82.893942 456.92259 82.893942zM770.128989 462.477097c0 172.721807-140.508127 313.229934-313.206398 313.229934-172.720783 0-313.229934-140.508127-313.229934-313.229934s140.508127-313.229934 313.229934-313.229934C629.620861 149.247162 770.128989 289.75529 770.128989 462.477097z" p-id="2307"></path></svg><input placeholder="æç´¢å
容" class="w-full ml-2 text-base " style="height:32px;appearance:none;border:none;outline:medium;background-color:inherit" value=""/><div class="transition-all transform hover:scale-125 text-gray-600 dark:text-dark" style="visibility:hidden"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="currentColor" p-id="2258" width="20" height="20" class="cursor-pointer"><path d="M512 39.384615C250.092308 39.384615 39.384615 250.092308 39.384615 512s210.707692 472.615385 472.615385 472.615385 472.615385-210.707692 472.615385-472.615385S773.907692 39.384615 512 39.384615z m96.492308 488.369231l153.6 153.6c7.876923 7.876923 7.876923 19.692308 0 27.569231l-55.138462 55.138461c-7.876923 7.876923-19.692308 7.876923-27.569231 0L525.784615 610.461538c-7.876923-7.876923-19.692308-7.876923-27.56923 0l-153.6 153.6c-7.876923 7.876923-19.692308 7.876923-27.569231 0L261.907692 708.923077c-7.876923-7.876923-7.876923-19.692308 0-27.569231l153.6-153.6c7.876923-7.876923 7.876923-19.692308 0-27.569231l-155.56923-155.56923c-7.876923-7.876923-7.876923-19.692308 0-27.569231l55.138461-55.138462c7.876923-7.876923 19.692308-7.876923 27.569231 0l155.569231 155.569231c7.876923 7.876923 19.692308 7.876923 27.56923 0l153.6-153.6c7.876923-7.876923 19.692308-7.876923 27.569231 0l55.138462 55.138462c7.876923 7.876923 7.876923 19.692308 0 27.56923l-153.6 153.6c-5.907692 7.876923-5.907692 19.692308 0 27.569231z" p-id="2259"></path></svg></div><div class="flex items-center select-none ml-2"><span style="opacity:1;height:24px;line-height:17.73px" class="hidden sm:block text-gray-500 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md dark:text-dark dark:border-dark"><span class="sr-only">Press </span><kbd class="font-sans">esc</kbd><span class="sr-only"> to close</span></span></div></div><hr class="my-2 dark:border-hr-dark"/><div class="dark:text-dark" style="max-height:400px;overflow-y:auto"><div class="mt-16 text-center"><div class="text-gray-600 dark:text-dark select-none">请è¾å
¥å¹¶æç´¢</div></div></div></div></div><div id="nav" class=" bg-white sticky top-0 dark:bg-dark nav-shadow dark:nav-shadow-dark" style="z-index:90"><div class=" flex items-center w-full border-b border-gray-200 h-14 dark:border-nav-dark" style="height:56px"><div class="mx-4 flex items-center"><div class="cursor-pointer block md:hidden"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1340" width="24" height="24" class="dark:text-dark fill-gray-600"><path d="M904 160H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 784H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 472H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z" p-id="1341"></path></svg></span></div></div><a href="/"><div class="text-gray-800 cursor-pointer select-none text-lg dark:text-dark lg:text-xl font-medium mr-4 hidden md:block">æ¯æ¥æµè¯ææ¯å享</div></a><div class="flex justify-between h-full flex-grow nav-content"><div style="transform:translateX(30px)" class="cursor-pointer md:hidden flex-grow text-center flex items-center justify-center select-none dark:text-dark"><a href="/"><div>æ¯æ¥æµè¯ææ¯å享</div></a></div><ul class=" md:flex h-full items-center text-sm text-gray-600 dark:text-dark hidden">
1<li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/"><div class="h-full flex items-center px-2 md:px-4 ">é¦é¡µ</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/tag"><div class="h-full flex items-center px-2 md:px-4 ">æ ç¾</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/category"><div class="h-full flex items-center px-2 md:px-4 ">åç±»</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/timeline"><div class="h-full flex items-center px-2 md:px-4 ">æ¶é´çº¿</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/link"><div class="h-full flex items-center px-2 md:px-4 ">åé¾</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/about"><div class="h-full flex items-center px-2 md:px-4 ">å
³äº</div></a></li><li class="nav-item transform hover:scale-110 dark:border-nav-dark dark:transition-all ua"><a style="height:100%" href="/post/24"><div class="h-full flex items-center px-2 md:px-4 ">UTX</div></a></li></ul><div class="flex nav-action"><div title="æç´¢" class="flex group transform hover:scale-110 transition-all select-none cursor-pointer"><div class="flex items-center mr-0 sm:mr-2 hover:cursor-pointer transition-all dark:text-dark fill-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2305" width="20" height="20"><path d="M789.804097 737.772047 742.865042 784.699846 898.765741 940.600545 945.704796 893.672746Z" p-id="2306"></path><path d="M456.92259 82.893942c-209.311143 0-379.582131 170.282245-379.582131 379.582131s170.270988 379.570875 379.582131 379.570875c209.287607 0 379.558595-170.270988 379.558595-379.570875S666.210197 82.893942 456.92259 82.893942zM770.128989 462.477097c0 172.721807-140.508127 313.229934-313.206398 313.229934-172.720783 0-313.229934-140.508127-313.229934-313.229934s140.508127-313.229934 313.229934-313.229934C629.620861 149.247162 770.128989 289.75529 770.128989 462.477097z" p-id="2307"></path></svg></div><div class="flex items-center "><div class="flex items-center"><span style="opacity:1;height:24px" class="hidden sm:flex items-center text-gray-500 text-sm leading-5 py-0.5 px-1.5 border border-gray-300 rounded-md dark:text-dark dark:border-dark"><span class="sr-only">Press </span><kbd class="font-sans "><abbr class="no-underline ">Ctrl</abbr></kbd><span class="mx-1">+</span><span class="sr-only"> and </span><kbd class="font-sans ">K</kbd><span class="sr-only"> to search</span></span></div></div></div><div class="flex items-center mr-4 ml-4 sm:ml-2 lg:ml-6"><div class="dark:text-dark fill-gray-600"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 1024 1024" aria-label="auto icon"><path d="M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"></path></svg></div></div><div title="RSS 订é
" class="flex items-center justify-center cursor-pointer hover:scale-125 transform transition-all mr-4 md:mr-4 lg:mr-4"><div class="dark:text-dark text-gray-600"><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5489" width="20" height="20" fill="currentColor"><path d="M832.512 63.488q26.624 0 49.664 10.24t40.448 27.648 27.648 40.448 10.24 49.664l0 704.512q0 26.624-10.24 49.664t-27.648 40.448-40.448 27.648-49.664 10.24l-704.512 0q-26.624 0-49.664-10.24t-40.448-27.648-27.648-40.448-10.24-49.664l0-704.512q0-26.624 10.24-49.664t27.648-40.448 40.448-27.648 49.664-10.24l704.512 0zM188.416 923.648q19.456 0 36.864-7.168t30.208-19.968 19.968-30.208 7.168-36.864-7.168-36.864-19.968-30.208-30.208-19.968-36.864-7.168q-20.48 0-37.376 7.168t-30.208 19.968-20.48 30.208-7.168 36.864 7.168 36.864 20.48 30.208 30.208 19.968 37.376 7.168zM446.464 897.024l36.864 0q15.36 0 30.208 0.512t31.232 0.512 36.864-1.024q0-93.184-35.84-175.616t-97.28-143.872-143.872-96.768-175.616-35.328q-1.024 24.576-1.024 39.936l0 28.672q0 14.336 0.512 29.184t0.512 37.376q65.536 0 123.392 24.576t100.864 67.584 68.096 100.864 25.088 123.392zM707.584 894.976q36.864 0 49.152 0.512t18.432 1.536 15.872 1.024 41.472-2.048q0-145.408
1-55.296-272.896t-150.528-222.72-223.232-150.528-273.408-55.296q-1.024 25.6-1.024 36.864l0 16.384q0 4.096 0.512 5.632t0.512 7.168 0.512 18.432 0.512 40.448q119.808 0 224.768 45.056t183.296 123.392 123.392 183.296 45.056 223.744z" p-id="5490"></path></svg></div></div></div></div></div><div class="h-10 items-center hidden md:flex border-b border-gray-200 dark:border-nav-dark overflow-hidden"><div class="mx-5" style="width:52px"></div><ul class="flex h-full items-center text-sm text-gray-600 dark:text-dark "><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E6%B5%8B%E8%AF%95%E5%BC%80%E5%8F%91"><div>æµè¯å¼å</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/adb"><div>adb</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/redis"><div>redis</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/chatgpt"><div>chatgpt</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/python"><div>python</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7"><div>æµè¯å·¥å
·</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div>弿ºé¡¹ç®</div></a></li><li class="flex items-center h-full md:px-2 hover:text-gray-900 dark:hover:text-dark-hover transform hover:scale-110 cursor-pointer transition-all"><a href="/category/git"><div>git</div></a></li></ul></div></div><div><div><div class="bm-overlay" style="position:fixed;z-index:1000;width:100%;height:100%;background:rgba(0, 0, 0, 0.3);opacity:0;-moz-transform:translate3d(100%, 0, 0);-ms-transform:translate3d(100%, 0, 0);-o-transform:translate3d(100%, 0, 0);-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);transition:opacity 0.3s, transform 0s 0.3s"></div><div id="nav-mobile" class="bm-menu-wrap" style="position:fixed;right:inherit;z-index:1100;width:300px;height:100%;-moz-transform:translate3d(-100%, 0, 0);-ms-transform:translate3d(-100%, 0, 0);-o-transform:translate3d(-100%, 0, 0);-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);transition:all 0.5s" aria-hidden="true"><div class="bm-menu" style="height:100%;box-sizing:border-box;overflow:auto"><nav class="bm-item-list" style="height:100%"><ul class="bm-item sm:flex h-full items-center text-sm text-gray-600 hidden divide-y divide-dashed dark:text-dark " style="display:block" tabindex="-1"><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/"><div class="w-full inline-block px-4">é¦é¡µ</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/tag"><div class="w-full inline-block px-4">æ ç¾</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/category"><div class="w-full inline-block px-4">åç±»</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/timeline"><div class="w-full inline-block px-4">æ¶é´çº¿</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/link"><div class="w-full inline-block px-4">åé¾</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/about"><div class="w-full inline-block px-4">å
³äº</div></a></li><li class="side-bar-item dark:border-dark-2 dark:hover:bg-dark-2"><a href="/post/24"><div class="w-full inline-block px-4">UTX</div></a></li></ul></nav></div></div></div></div><div class=" mx-auto lg:px-6 md:py-4 py-2 px-2 md:px-4 text-gray-700 "><div class="flex mx-auto justify-center"><div class="flex-shrink flex-grow md:max-w-3xl xl:max-w-4xl w-full vanblog-main"><div class="post-card-wrapper"><div style="position:relative" id="post-card" class="overflow-hidden post-card bg-white card-shadow py-4 px-1 sm:px-3 md:py-6 md:px-5 dark:bg-dark dark:nav-shadow-dark"><div class="flex justify-center post-card-title "><a target="_self" style="width:90%" title="UTX èªå¨åå·¥å
·ä»ç»" href="/post/24"><div class="text-lg block font-medium overflow-hidden text-ellipsis whitespace-nowrap px-5 text-center mb-2 mt-2 dark:text-dark text-gray-700 md:text-2xl ua ua-link">UTX èªå¨åå·¥å
·ä»ç»</div></a></div><div class="text-center text-xs md:text-sm divide-x divide-gray-400 text-gray-400 dark:text-dark post-card-sub-title"><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-h
1over group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="11557" width="16" height="16"><path d="M853.333333 501.333333c-17.066667 0-32 14.933333-32 32v320c0 6.4-4.266667 10.666667-10.666666 10.666667H170.666667c-6.4 0-10.666667-4.266667-10.666667-10.666667V213.333333c0-6.4 4.266667-10.666667 10.666667-10.666666h320c17.066667 0 32-14.933333 32-32s-14.933333-32-32-32H170.666667c-40.533333 0-74.666667 34.133333-74.666667 74.666666v640c0 40.533333 34.133333 74.666667 74.666667 74.666667h640c40.533333 0 74.666667-34.133333 74.666666-74.666667V533.333333c0-17.066667-14.933333-32-32-32z" p-id="11558"></path><path d="M405.333333 484.266667l-32 125.866666c-2.133333 10.666667 0 23.466667 8.533334 29.866667 6.4 6.4 14.933333 8.533333 23.466666 8.533333h8.533334l125.866666-32c6.4-2.133333 10.666667-4.266667 14.933334-8.533333l300.8-300.8c38.4-38.4 38.4-102.4 0-140.8-38.4-38.4-102.4-38.4-140.8 0L413.866667 469.333333c-4.266667 4.266667-6.4 8.533333-8.533334 14.933334z m59.733334 23.466666L761.6 213.333333c12.8-12.8 36.266667-12.8 49.066667 0 12.8 12.8 12.8 36.266667 0 49.066667L516.266667 558.933333l-66.133334 17.066667 14.933334-68.266667z" p-id="11559"></path></svg></span>2023-11-02</span><span class="inline-flex px-2 items-center group dark:group cursor-pointer"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12516" fill="currentColor" width="16" height="16"><path d="M810.666667 85.333333a85.333333 85.333333 0 0 1 85.333333 85.333334v152.021333c36.821333 9.493333 64 42.88 64 82.645333v405.333334a128 128 0 0 1-128 128H192a128 128 0 0 1-128-128V298.666667a85.376 85.376 0 0 1 64-82.645334V170.666667a85.333333 85.333333 0 0 1 85.333333-85.333334h597.333334zM128.149333 296.170667L128 298.666667v512a64 64 0 0 0 60.245333 63.893333L192 874.666667h640a64 64 0 0 0 63.893333-60.245334L896 810.666667V405.333333a21.333333 21.333333 0 0 0-18.837333-21.184L874.666667 384H638.165333l-122.069333-101.717333a21.333333 21.333333 0 0 0-10.688-4.736l-2.986667-0.213334H149.333333a21.333333 21.333333 0 0 0-21.184 18.837334zM535.189333 213.333333l127.978667 106.666667H832V170.666667a21.333333 21.333333 0 0 0-18.837333-21.184L810.666667 149.333333H213.333333a21.333333 21.333333 0 0 0-21.184 18.837334L192 170.666667v42.666666h343.168z" p-id="12517"></path></svg></span><a target="_blank" href="/category/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div class="cursor-pointer group-hover:text-gray-900 dark:group-hover:text-dark-hover hover:font-medium ">弿ºé¡¹ç®</div></a></span><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15825" width="16" height="16"><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM512 766c-161.3 0-279.4-81.8-362.7-254C232.6 339.8 350.7 258 512 258c161.3 0 279.4 81.8 362.7 254C791.5 684.2 673.4 766 512 766z" p-id="15826"></path><path d="M508 336c-97.2 0-176 78.8-176 176s78.8 176 176 176 176-78.8 176-176-78.8-176-176-176z m0 288c-61.9 0-112-50.1-112-112s50.1-112 112-112 112 50.1 112 112-50.1 112-112 112z" p-id="15827"></path></svg></span><span>0</span></span><span class="inline-flex px-2 items-center"><span class="mr-1 fill-gray-400 dark:text-dark dark:group-hover:text-dark-hover group-hover:text-gray-900 "><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13953" width="16" height="16"><path d="M873.559 97.82h-723.12c-45.886 0-83.436 37.627-83.436 83.611v542.098c0 45.984 37.55 69.685 83.437 69.685h333.747c45.888 0 109.987 34.242 142.43 66.767l48.888 52.12c12.589 12.615 24.309 20.262 33.91 20.262 15.143 0 25.083-20.55 25.083-48.675 0-45.983 37.548-90.474 83.436-90.474h55.625c45.887 0 83.438-23.701 83.438-69.685V181.431c0-45.984-37.55-83.61-83.438-83.61z m27.813 625.71c0 15.105-12.738 15.307-27.813 15.307h-55.625c-61.382 0-113.612 46.353-132 101.74l-19.989-23.15c-42.914-43.016-121.055-78.59-181.758-78.59H150.44c-15.074 0-27.813
1-0.204-27.813-15.308V181.431c0-15.106 12.739-27.87 27.813-27.87h723.119c15.075 0 27.813 12.766 27.813 27.87v542.098zM261.689 348.652h278.124c15.358 0 27.812-12.48 27.812-27.87s-12.454-27.87-27.812-27.87H261.689c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.87 27.812 27.87z m472.81 83.613H261.69c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.87 27.812 27.87H734.5c15.357 0 27.812-12.48 27.812-27.87 0-15.392-12.455-27.87-27.812-27.87z m0 111.48H261.69c-15.357 0-27.812 12.48-27.812 27.87s12.455 27.871 27.812 27.871H734.5c15.357 0 27.812-12.48 27.812-27.87s-12.455-27.87-27.812-27.87z" p-id="13954"></path></svg></span><span class="waline-comment-count" data-path="/post/24">0</span></span></div><div class="text-sm md:text-base text-gray-600 mt-4 mx-2"><div class="warning-card text-gray-600 dark:text-dark"><div>请注æï¼æ¬æç¼åäº <!-- -->1064<!-- --> 天åï¼æåä¿®æ¹äº<!-- --> <!-- -->1064<!-- --> <!-- -->天åï¼å
¶ä¸æäºä¿¡æ¯å¯è½å·²ç»è¿æ¶ã</div></div><div class="block lg:hidden toc-mobile"><div class="relative" style="position:relative"><h2 style="font-weight:600;font-size:1.5em;margin-bottom:4px" class="text-gray-700 dark:text-dark ">ç®å½</h2><div class="markdown-navigation" style="position:relative"><div class="title-anchor title-level1 ">UTX</div><div class="title-anchor title-level2 ">logo</div><div class="title-anchor title-level2 ">å®è£
</div><div class="title-anchor title-level2 ">设计ç念</div><div class="title-anchor title-level2 ">项ç®ç»æ</div><div class="title-anchor title-level2 ">
1è°ç¨æµç¨å¾</div><div class="title-anchor title-level2 ">䏿³¨äºåèæ¬</div><div class="title-anchor title-level2 ">è½»å°è£ </div><div class="title-anchor title-level2 ">æ ¸å¿ä»·å¼</div><div class="title-anchor title-level2 ">åè½ä»ç»</div><div class="title-anchor title-level2 ">app使ç¨è¯´æ</div><div class="title-anchor title-level2 ">web使ç¨è¯´æ</div><div class="title-anchor title-level2 ">è¿è¡ç»æ</div></div><div style="margin-bottom:10px;margin-top:-2px"></div></div></div><div class="markdown-body"><div class="markdown-body"><h1 data-id="UTX" id="UTX" class="markdown-heading cursor-pointer">UTX</h1> 2<p><img src="/static/img/2f3288b09886e468ea84fb706e009507.image.webp" alt="image.png" class="undefined img-zoom"></p> 3<h2 data-id="logo" id="logo" class="markdown-heading cursor-pointer">logo</h2> 4<p><img src="/static/img/7b7d9d5a2ce791979470c6edbb285846.clipboard-2023-10-24.webp" alt="image.png" class="undefined img-zoom"></p> 5<h2 data-id="å®è£ " id="å®è£ " class="markdown-heading cursor-pointer">å®è£ </h2> 6<ul> 7<li>å½ä»¤è¡æ§è¡</li> 8</ul> 9<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px"></span><div class="code-copy-btn"></div></div><code class="code-inline">pip install -U utx 10</code></div></pre> 11<h2 data-id="设计ç念" id="设计ç念" class="markdown-heading cursor-pointer">设计ç念</h2> 12<p>å¾å¤§ç¨åº¦ä¸åé´äºHttpRunnerï¼ä¼ç§çæ¡æ¶ï¼ãä¸åçæ¯ï¼utxæ´çéåpythonï¼è䏿¯åyamlæä»¶ã</p> 13<ul> 14<li>ç®åæ¯æ´å¥½ç</li> 15<li>æ¯ä¸ªäººé½è½ç¨pythonåèªå¨å</li> 16<li>UIèªå¨åè·çä¸å²åºè¿ä»£åUIåæ´</li> 17</ul> 18<p>è¿å°±æ¯utxç设计ç念ã</p> 19<h2 data-id="项ç®ç»æ" id="项ç®ç»æ" class="markdown-heading cursor-pointer">项ç®ç»æ</h2> 20<p><img src="/static/img/28a69fb200577aa4ba8dad2e9c04f680.image.webp" alt="image.png" class="undefined img-zoom"></p> 21<ul> 22<li>utxæä¾äºå¿«éå建项ç®çè½åï¼ä¹å°±æ¯èææ¶ã</li> 23<li>ãappèææ¶ã</li> 24</ul> 25<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">utx startproject project_name 26</code></div></pre> 27<ul> 28<li>ãwebèææ¶ã</li> 29</ul> 30<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">utx startproject-web project_name 31</code></div></pre> 32<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">text</span><div class="code-copy-btn"></div></div><code class="hljs language-text">$ utx startproject demo 332021-09-01 12:39:16.491 | INFO | utx.cli.scaffold:create_scaffold:51 - Create new project: demo 34Project root dir: /PycharmProjects/demo 35 36Created folder: demo 37Created folder: demo/config 38Created folder: demo/logs 39Created folder: demo/packages 40Created folder: demo/report/airtest 41Created folder: demo/tests 42Created folder: demo/suites 43Created file: demo/.gitignore 44Created file: demo/conftest.py 45Created file: demo/pytest.ini 46Created file: demo/run.py 47Created file: demo/requirements.txt 48Created file: demo/config/conf.py 49Created file: demo/config/config.ini 50Created file: demo/config/__init__.py 51Created file: demo/tests/test_devices.py 52Created file: demo/tests/__init__.py 53Created file: demo/report/summary_template.html 54 55</code></div></pre> 56<h2 data-id="è°ç¨æµç¨å¾" id="è°ç¨æµç¨å¾" class="markdown-heading cursor-pointer">
56è°ç¨æµç¨å¾</h2> 57<p><img src="/static/img/375c2c897ffac4f5d8505f0d1d9cb3dd.image.webp" alt="image.png" class="undefined img-zoom"></p> 58<h2 data-id="䏿³¨äºåèæ¬" id="䏿³¨äºåèæ¬" class="markdown-heading cursor-pointer">䏿³¨äºåèæ¬</h2> 59<ul> 60<li>项ç®ç»æå¾æ¸ æ°ãå¨conftest.pyè¿è¡ä¸äºåå§å/åæ°å/æ¸ çå·¥ä½ï¼å¨suites/åæµè¯èæ¬ã</li> 61</ul> 62<blockquote> 63<p>å¨AirtestIDEä¸å好.airèæ¬ï¼ç¶åå°æä»¶æ¾å°suitesæä»¶ä¸ã</p> 64</blockquote> 65<ul> 66<li>æ´æ³¨éå¹³éºåèæ¬çæ¹å¼ï¼è¿æ ·å°±ç¦»âæ¯ä¸ªäººé½è½ç¨pythonåèªå¨åâæ´è¿ä¸æ¥ãæ¯ç«å°è£ ä¹åçç容ææï¼æä¹æã</li> 67<li>å»é¤ææ¡æ¶ç约æï¼ç»æ¯ä¸ªäººåpythonçèªç±ï¼å¨æµè¯èæ¬éä½ å¯ä»¥å°½æ åæ¥ä½ ç代ç 飿 ¼ï¼ä»£ç è½åï¼å人åé¢ã代价å¢ï¼å°±æ¯ä»£ç è´¨éåå·®ä¸é½ã</li> 68</ul> 69<p>大èåï¼è½åï¼ååºæ¥ï¼è·éï¼å°±å·²ç»æ¯å¨åèªå¨åï¼å°±å·²ç»æ¯å¨åé ä»·å¼äºï¼</p> 70<h2 data-id="è½»å°è£ " id="è½»å°è£ " class="markdown-heading cursor-pointer">è½»å°è£ </h2> 71<p>utxå°éåçç¨æ³ã</p> 72<p>airtestçå°è£ åªéè¿è£ 饰å¨è¿è¡äºè¿è¡æ¹å¼çè°æ´ï¼æ²¡æåä»»ä½å ¶ä»çåä½ä¿®æ¹ã</p> 73<ul> 74<li>fakerï¼é æ°æ®å·¥å ·</li> 75<li>pytestï¼æµè¯æ¡æ¶</li> 76<li>airtestï¼èªå¨åæµè¯å·¥å ·</li> 77<li>tideviceï¼iOS设å¤ç®¡çå·¥å ·</li> 78<li>pandasãnumpyï¼æ°æ®å¤çå·¥å ·</li> 79</ul> 80<p>å®è£ utxï¼èªå¨å°±æè¿äºå¼æºå©å¨å®è£ ä¸äºï¼æ éåç¬å®è£ ãæªæ¥ä¼éææ´å¤å®ç¨å·¥å ·å°utxä¸ã</p> 81<p>utxæ¬èº«æ¯å¾è½»çã</p> 82<h2 data-id="æ ¸å¿ä»·å¼" id="æ ¸å¿ä»·å¼" class="markdown-heading cursor-pointer">æ ¸å¿ä»·å¼</h2> 83<ul> 84<li>䏿 0 鍿§ï¼iOS/Android 设å¤åå®ç°å³æå³ç¨ï¼éåéè°</li> 85<li>æµè¯ç¨ä¾å¯è¯»æ§é«ï¼ç¼åææ¬ä½ï¼æ¯æpythonè¯æ³ï¼ä¾¿äºå ¬å ±æä½æ½è±¡ï¼è¿ä¸æ¥æé«ç¨ä¾å¯ç»´æ¤æ§</li> 86<li>ç¨ä¾æ§è¡é«é²æ£æ§ï¼å¤è®¾å¤æºå忢æ éæ´æ¹ç¨ä¾éé </li> 87<li>æ§è¡éå建ç®åï¼æ¯ææºè½å¹¶åãåç»åæ¨¡åæ§è¡ï¼æ´é«ææ´çµæ´»</li> 88</ul> 89<h2 data-id="åè½ä»ç»" id="åè½ä»ç»" class="markdown-heading cursor-pointer">åè½ä»ç»</h2> 90<ol> 91<li>æ¯æandroid,ios,web å¹³å°çèªå¨åæµè¯æ¡æ¶</li> 92<li>èæ¬æ¹éæ§è¡</li> 93<li>æ¯ä¸ªèæ¬æ§è¡æ¥å¿åå¼åæ¾</li> 94<li>æ¯ä¸ªèæ¬åç¬çæä¸ä¸ªhtmlæ¥åå¹¶å¨ç¶æä»¶å¤¹çæä¸ä¸ªè忥å</li> 95<li>èªå®ä¹çè忥åï¼è¯¦ç»å±ç¤ºè¿è¡ç»æ</li> 96<li>éè¯æºå¶ï¼è¿è¡å¤±è´¥èªå¨éè·ï¼å¯èªå®ä¹éè·æ¬¡æ°</li> 97<li>èªå®ä¹èæ¬è¿è¡ï¼å¯éæ©é¨å模ååç¬è¿è¡</li> 98<li>èªå¸¦èææ¶å·¥å ·å¯ä»¥å¿«éçææ¡æ¶ç®å½</li> 99</ol> 100<h2 data-id="app使ç¨è¯´æ" id="app使ç¨è¯´æ" class="markdown-heading cursor-pointer">app使ç¨è¯´æ</h2> 101<ul> 102<li>åªéå¨é ç½®æä»¶ä¸å¡«å¥½ç¸å ³å 容ï¼å³å¯è¿è¡ï¼</li> 103</ul> 104<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">ini</span><div class="code-copy-btn"></div></div><code class="hljs language-ini"><span class="hljs-section">[device_info]</span> 105<span class="hljs-comment">;设å¤è¿ç¨é¾æ¥URL 设å¤ip+ç«¯å£æè 设å¤å¯ä¸æ è¯idï¼å¤ä¸ªè®¾å¤ä»¥,åå²ï¼ä¾å¦ 设å¤1,设å¤2,设å¤3</span> 106<span class="hljs-attr">device</span> = <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">5555</span> 107<span class="hljs-comment">;设å¤å¹³å°iOSæè Android</span> 108<span class="hljs-attr">platform</span> = android 109<span class="hljs-comment">;ios设å¤é©±å¨å åï¼ä» æµè¯iOSæ¶éè¦</span> 110<span class="hljs-attr">wda</span> = com.facebook.WebDriverAgentRunner.utx.xctrunner 111<span class="hljs-comment">;æ¯å¦æ§è¡å®è£ å¸è½½æä½ True/False</span> 112<span class="hljs-attr">init</span> = <span class="hljs-literal">False</span> 113 114<span class="hljs-section">[app_info]</span> 115<span class="hljs-comment">;appå å</span> 116<span class="hljs-attr">package</span> = com.wx.mp.test 117<span class="hljs-comment">;apkæè ipaæä»¶å</span> 118<span class="hljs-attr">filename</span> = app_test.apk 119 120<span class="hljs-section">[reruns]</span> 121<span class="hljs-comment">;失败å忬¡è¿è¡æ¬¡æ°ï¼é»è®¤1次</span> 122<span class="hljs-attr">times</span> = <span class="hljs-number">1</span> 123 124<span class="hljs-section">[paths]</span> 125<span class="hljs-comment">;
125èªå®ä¹æ§è¡caseç®å½å±çº§ï¼æä»¶å¤¹åç§°ï¼ä¾å¦ï¼smokeï¼ï¼é»è®¤ä¸ºç©º</span> 126<span class="hljs-attr">name</span> = 127 128<span class="hljs-section">[mode]</span> 129<span class="hljs-comment">;False 表示 è¿è¡[suites][cases]éæ©çç¨ä¾ï¼True表示è¿è¡å ¨é¨ç¨ä¾</span> 130<span class="hljs-attr">is_all</span> = <span class="hljs-literal">True</span> 131<span class="hljs-comment">;æ¯å¦å½å¶è§é¢ True/False</span> 132<span class="hljs-attr">record</span> = <span class="hljs-literal">False</span> 133 134<span class="hljs-section">[suites]</span> 135<span class="hljs-comment">;å¡«åç¨ä¾çå ³é®å</span> 136<span class="hljs-attr">cases</span> = test.air 137</code></div></pre> 138<ul> 139<li>appå¯å¨å½ä»¤</li> 140</ul> 141<ol> 142<li>æ®éå¯å¨</li> 143</ol> 144<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py 145</code></div></pre> 146<ol start="2"> 147<li>åæ°åå¯å¨</li> 148</ol> 149<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell"><span class="hljs-meta prompt_"># </span><span class="bash">Android</span> 150python run.py --platform=Android --device=127.0.0.1:5555 --init=True 151<span class="hljs-meta prompt_"># </span><span class="bash">iOS</span> 152python run.py --platform=iOS --wda=com.facebook.WebDriverAgentRunner.utx.xctrunner --init=True 153</code></div></pre> 154<blockquote> 155<p>åæ°ä¼å 级大äºé ç½®æä»¶</p> 156<blockquote> 157<p>å¤ä¸ªè®¾å¤ä»¥,åå²; ä¾å¦ python run.py --platform=Android --device=设å¤1,设å¤2,设å¤3 --init=True</p> 158</blockquote> 159</blockquote> 160<h2 data-id="web使ç¨è¯´æ" id="web使ç¨è¯´æ" class="markdown-heading cursor-pointer">web使ç¨è¯´æ</h2> 161<ul> 162<li>æ éå ³æ³¨ chromeæµè§å¨é©±å¨</li> 163</ul> 164<blockquote> 165<p>注æï¼æ éé ç½® chromedriver ï¼ç³»ç»ä¼èªå¨åç»´æ¤å¹é çæ¬ã</p> 166</blockquote> 167<ul> 168<li>åªéå¨é ç½®æä»¶ä¸å¡«å¥½ç¸å ³å 容ï¼å³å¯è¿è¡ï¼</li> 169</ul> 170<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">ini</span><div class="code-copy-btn"></div></div><code class="hljs language-ini"><span class="hljs-section">[web_info]</span> 171<span class="hljs-comment">;被æµç主页url</span> 172<span class="hljs-attr">url</span> = https://www.baidu.com/ 173<span class="hljs-comment">;æ¯å¦æ çé¢è¿è¡</span> 174<span class="hljs-attr">headless</span> = <span class="hljs-literal">False</span> 175 176<span class="hljs-section">[reruns]</span> 177<span class="hljs-comment">;失败å忬¡è¿è¡æ¬¡æ°ï¼é»è®¤1次</span> 178<span class="hljs-attr">times</span> = <span class="hljs-number">1</span> 179 180<span class="hljs-section">[paths]</span> 181<span class="hljs-comment">;èªå®ä¹æ§è¡caseç®å½å±çº§ï¼æä»¶å¤¹åç§°ï¼ä¾å¦ï¼smokeï¼ï¼é»è®¤ä¸ºç©º</span> 182<span class="hljs-attr">name</span> = 183 184<span class="hljs-section">[mode]</span> 185<span class="hljs-comment">;False 表示 è¿è¡[suites][cases]éæ©çç¨ä¾ï¼True表示è¿è¡å ¨é¨ç¨ä¾</span> 186<span class="hljs-attr">is_all</span> = <span class="hljs-literal">True</span> 187 188<span class="hljs-section">[suites]</span> 189<span class="hljs-comment">;å¡«åç¨ä¾çå ³é®å</span> 190<span class="hljs-attr">cases</span> = chrome 191 192</code></div></pre> 193<ul> 194<li>webå¯å¨å½ä»¤</li> 195</ul> 196<ol> 197<li>æ®éå¯å¨</li> 198</ol> 199<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py 200</code></div></pre> 201<ol start="2"> 202<li>åæ°åå¯å¨</li> 203</ol> 204<pre><div class="code-block-wrapper relative"><div class="header-right flex" style="color: #6f7177"><span class="language-tag mr-1" style="line-height: 21px">shell</span><div class="code-copy-btn"></div></div><code class="hljs language-shell">python run.py --headless=True --driver=/Users/admin/driverpath 205</code></div></pre> 206<blockquote> 207<p>åæ°ä¼å 级大äºé ç½®æä»¶</p> 208</blockquote> 209<h2 data-id="è¿è¡ç»æ" id="è¿è¡ç»æ" class="markdown-heading cursor-pointer">è¿è¡ç»æ</h2> 210<ul> 211<li>æ¥åå±ç¤º</li> 212</ul> 213<p><img src="/static/img/bc6387d7b9f720991dd9e0aa5a007ae7.image.webp" alt="image.png" class="undefined img-zoom"></p></div></div></div><div class="mt-8"><div class="text-center select-none text-sm md:text-base mb-2 dark:text-dark">å¦æå¯¹ä½ æç¨çè¯ï¼å¯ä»¥æèµå¦</div><div class="flex justify-center mb-6 "><div class="text-sm md:text-base text-gray-100 bg-red-600 rounded px-4 select-none cursor-pointer hover:bg-red-400 py-1">æèµ</div></div><div class=" justify-center overflow-hidden transition-all" style="max-height:0px;margin-bottom:0"><div class="flex justify-center"><img alt="ali pay" src="https://openutx.cn/static/img/22dce95a52ba05dfde3eaf8e6834fafe.IMG_7229.webp" width="180" height="250"/><div class="w-4 inline-block"></div><img alt="wechat pay" src="https://openutx.cn/static/img/cb6ed61087eb2918e9f3ed8ac36e1262.IMG_7228.webp" width="180" height="250"/></div></div></div><div class="bg-gray-100 px-5 border-l-4 border-red-500 py-2 text-sm space-y-1 dark:text-dark dark:bg-dark "><p><span class="mr-2">æ¬æä½è :</span><span>æä½³ç®</span></p><p><span class="mr-2">æ¬æé¾æ¥:</span><span class="cursor-pointer border-b border-gray-100 hover:border-gray-500 dark:text-dark dark-border-hover dark:border-nav-dark" style="word-break:break-all"></span></p><p><span class="mr-2">çæå£°æ:</span><span>æ¬åå®¢æææç« é¤ç¹å«å£°æå¤ï¼åéç¨ BY-NC-SA 214 许å¯åè®®ã转载请注æåºå¤ï¼</span></p></div><div class="mt-4"><div class="text-sm flex-wrap text-gray-500 flex justify-center space-x-2 select-none dark:text-dark"><div><a target="_blank" href="/tag/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE"><div class=" border-b border-white hover:border-gray-500 dark:border-dark dark:hover:border-gray-300 dark:hover:text-gray-300">弿ºé¡¹ç®</div></a></div></div><hr class="mt-3 dark:border-hr-dark"/><div class="flex justify-between text-sm mt-2 whitespace-nowrap overflow-hidden "><div class="" style="max-width:50%"><a target="_blank" href="/post/23"><div style="white-space:break-spaces" class="dark:text-dark dark:border-dark dark-border-hover border-b pb border-dashed hover:border-gray-800 border-white hover:text-gray-800">< ç»æçå ¬ä¼å·æ·»å äºä¸ä¸ªAIæºå¨äººï½</div></a></div><div class="" style="max-width:50%"><a target="_blank" href="/post/25"><div style="white-space:break-spaces" class="dark:text-dark dark:border-dark dark-border-hover border-b pb border-dashed hover:border-gray-800 border-white hover:text-gray-800">å¦ä½å¨Pythonå 䏿§å¶åªå 许ç¹å®Pythonçæ¬ä½¿ç¨ ></div></a></div></div></div><div style="height:0"></div></div></div></div><div class="hidden lg:block flex-shrink-0 flex-grow-0 vanblog-sider w-52"><div class="sticky" id="toc-card"><div id="toc-container" class="bg-white w-60 card-shadow dark:card-shadow-dark ml-2 dark:bg-dark overflow-y-auto pb-2" style="max-height:calc(100vh - 200px)"><div class="relative" style="position:relative">
214<div class="text-center text-lg font-medium mt-4 text-gray-700 dark:text-dark cursor-pointer">ç®å½</div><div class="markdown-navigation" style="position:relative"><div class="title-anchor title-level1 ">UTX</div><div class="title-anchor title-level2 ">logo</div><div class="title-anchor title-level2 ">å®è£
</div><div class="title-anchor title-level2 ">设计ç念</div><div class="title-anchor title-level2 ">项ç®ç»æ</div><div class="title-anchor title-level2 ">è°ç¨æµç¨å¾</div><div class="title-anchor title-level2 ">䏿³¨äºåèæ¬</div><div class="title-anchor title-level2 ">è½»å°è£
</div><div class="title-anchor title-level2 ">æ ¸å¿ä»·å¼</div><div class="title-anchor title-level2 ">åè½ä»ç»</div><div class="title-anchor title-level2 ">app使ç¨è¯´æ</div><div class="title-anchor title-level2 ">web使ç¨è¯´æ</div><div class="title-anchor title-level2 ">è¿è¡ç»æ</div></div><div style="margin-bottom:10px;margin-top:-2px"></div></div></div></div></div></div><footer class="text-center text-sm space-y-1 mt-8 md:mt-12 dark:text-dark footer-icp-number"><p class="">ICP ç¼å·: <a href="https://beian.miit.gov.cn/" target="_blank" class="hover:text-gray-900 hover:underline-offset-2 hover:underline dark:hover:text-dark-hover transition">æICPå¤2023021831å·-1</a></p><p class="flex justify-center items-center footer-gongan-beian">å
¬å®å¤æ¡: <img src="https://openutx.cn/static/img/7c1b2ba07fa422f609484f6edef4205b.beian.webp" alt="å
¬å®å¤æ¡ logo" width="20" loading="lazy"/><a href="https://beian.mps.gov.cn/#/query/webSearch?code=11011402053524" target="_blank" class="hover:text-gray-900 hover:underline-offset-2 hover:underline dark:hover:text-dark-hover transition"> 京å
¬ç½å®å¤11011402053524å·</a></p><p><span>æ¬ç«å±
ç¶è¿è¡äº</span><span></span></p><p class="footer-powered-by-vanblog">Powered By <a href="https://vanblog.mereith.com" target="_blank" class="hover:text-gray-900 dark:hover:text-dark-hover transition ua ua-link">VanBlog <span>v0.54.0</span></a></p><p class="select-none footer-copy-right">© <!-- -->2023<!-- --> - <!-- -->2026</p><p class="select-none footer-viewer"><span class="flex justify-center items-center dark:text-dark fill-gray-600 divide-gray-600"><span class="flex items-center justify-center pr-2"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7211" width="14" height="14"><path d="M565.2 521.9c76.2-23 132.1-97.6 132.1-186.2 0-106.9-81.3-193.5-181.6-193.5s-181.6 86.6-181.6 193.5c0 87.6 54.6 161.6 129.5 185.4-142.2 23.1-250.8 146.5-250.8 295.3 0 2.9 0 5.8 0.1 8.7 0.9 31.5 26.5 56.7 58.1 56.7h482.1c31.2 0 57-24.6 58-55.8 0.1-3.2 0.2-6.4 0.2-9.6-0.1-147.1-106.2-269.4-246.1-294.5z" p-id="7212"></path></svg></span> <!-- -->0</span><span class="flex items-center justify-center pl-2"><span><svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9714" width="14" height="14"><path d="M508 512m-112 0a112 112 0 1 0 224 0 112 112 0 1 0-224 0Z" p-id="9715"></path><path d="M942.2 486.2C847.4 286.5 704.1 186 512 186c-192.2 0-335.4 100.5-430.2 300.3-7.7 16.2-7.7 35.2 0 51.5C176.6 737.5 319.9 838 512 838c192.2 0 335.4-100.5 430.2-300.3 7.7-16.2 7.7-35 0-51.5zM508 688c-97.2 0-176-78.8-176-176s78.8-176 176-176 176 78.8 176 176-78.8 176-176 176z" p-id="9716"></path></svg></span>0</span></span></p></footer></div><div>
214<script src="https://gcore.jsdelivr.net/gh/stevenjoezhang/live2d-widget@latest/autoload.js"></script>
214 215<div id="sakana-widget" style="position: fixed;bottom: 20px;right:40px;"></div>
216<script> 217 function initSakanaWidget() { 218 new SakanaWidget({ autoFit: true }) 219 .setState({ i: 0.001, d: 1 }) 220 .mount("#sakana-widget"); 221 } 222</script>
vendor: 1 bytes, line 222
222
223<script 224 async 225 onload="initSakanaWidget()" 226 src="https://gcore.jsdelivr.net/npm/[email protected]/lib/sakana.min.js" 227></script>
227</div></div>
227<script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"layoutProps":{"showFriends":"true","version":"v0.54.0","subMenuOffset":0,"showAdminButton":"false","headerLeftContent":"siteName","copyrightAggreement":"BY-NC-SA","ipcHref":"https://beian.miit.gov.cn/","ipcNumber":"æICPå¤2023021831å·-1","gaBeianNumber":" 京å
¬ç½å®å¤11011402053524å·","gaBeianLogoUrl":"https://openutx.cn/static/img/7c1b2ba07fa422f609484f6edef4205b.beian.webp","gaBeianUrl":"https://beian.mps.gov.cn/#/query/webSearch?code=11011402053524","since":"2023-09-26T09:04:30.566Z","logo":"https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp","favicon":"https://openutx.cn/static/img/c33b34619bc47966f93b4530f4afb658.pic.webp","siteName":"æ¯æ¥æµè¯ææ¯å享","siteDesc":" æä½³ç®ãæµè¯å¼åå¤è´§ãï¼ä¸æ³¨äºæµè¯å¼åé¢åææ¯å享ã","baiduAnalysisID":"","gaAnalysisID":"","logoDark":"","showExpirationReminder":"true","description":" æä½³ç®ãæµè¯å¼åå¤è´§ãï¼ä¸æ³¨äºæµè¯å¼åé¢åææ¯å享ã","menus":[{"id":0,"name":"é¦é¡µ","value":"/","level":0},{"id":1,"name":"æ ç¾","value":"/tag","level":0},{"id":2,"name":"åç±»","value":"/category","level":0},{"id":3,"name":"æ¶é´çº¿","value":"/timeline","level":0},{"id":4,"name":"åé¾","value":"/link","level":0},{"id":5,"name":"å
³äº","value":"/about","level":0},{"id":1698146933978,"level":0,"name":"UTX","value":"/post/24"}],"categories":["æµè¯å¼å","adb","redis","chatgpt","python","æµè¯å·¥å
·","弿ºé¡¹ç®","git"],"showSubMenu":"true","enableComment":"true","defaultTheme":"auto","openArticleLinksInNewWindow":"true","showCopyRight":"true","showDonateButton":"true","showRSS":"true","showEditButton":"false","enableCustomizing":"true","customHtml":"PHNjcmlwdCBzcmM9Imh0dHBzOi8vZ2NvcmUuanNkZWxpdnIubmV0L2doL3N0ZXZlbmpvZXpoYW5nL2xpdmUyZC13aWRnZXRAbGF0ZXN0L2F1dG9sb2FkLmpzIj48L3NjcmlwdD4KPGRpdiBpZD0ic2FrYW5hLXdpZGdldCIgc3R5bGU9InBvc2l0aW9uOiBmaXhlZDtib3R0b206IDIwcHg7cmlnaHQ6NDBweDsiPjwvZGl2Pgo8c2NyaXB0PgogIGZ1bmN0aW9uIGluaXRTYWthbmFXaWRnZXQoKSB7CiAgICBuZXcgU2FrYW5hV2lkZ2V0KHsgYXV0b0ZpdDogdHJ1ZSB9KQogICAgICAuc2V0U3RhdGUoeyBpOiAwLjAwMSwgZDogMSB9KQogICAgICAubW91bnQoIiNzYWthbmEtd2lkZ2V0Iik7CiAgfQo8L3NjcmlwdD4KPHNjcmlwdAogIGFzeW5jCiAgb25sb2FkPSJpbml0U2FrYW5hV2lkZ2V0KCkiCiAgc3JjPSJodHRwczovL2djb3JlLmpzZGVsaXZyLm5ldC9ucG0vc2FrYW5hLXdpZGdldEAyLjIuMi9saWIvc2FrYW5hLm1pbi5qcyIKPjwvc2NyaXB0Pg==","customHead":[]},"article":{"title":"UTX èªå¨åå·¥å
·ä»ç»","content":"# UTX\n\n\n## logo\n\n\n## å®è£
\n- å½ä»¤è¡æ§è¡\n```\npip install -U utx\n```\n\n\n## 设计ç念\n\nå¾å¤§ç¨åº¦ä¸åé´äºHttpRunnerï¼ä¼ç§çæ¡æ¶ï¼ãä¸åçæ¯ï¼utxæ´çéåpythonï¼è䏿¯åyamlæä»¶ã\n\n- ç®åæ¯æ´å¥½ç\n- æ¯ä¸ªäººé½è½ç¨pythonåèªå¨å\n- UIèªå¨åè·çä¸å²åºè¿ä»£åUIåæ´\n\n\nè¿å°±æ¯utxç设计ç念ã\n\n\u003c!-- more --\u003e\n\n\n## 项ç®ç»æ\n\n\n\n- utxæä¾äºå¿«éå建项ç®çè½åï¼ä¹å°±æ¯èææ¶ã\n- ãappèææ¶ã\n```shell\nutx startproject project_name\n```\n- ãwebèææ¶ã\n```shell\nutx startproject-web project_name\n```\n```text\n$ utx startproject demo\n2021-09-01 12:39:16.491 | INFO | utx.cli.scaffold:create_scaffold:51 - Create new project: demo\nProject root dir: /PycharmProjects/demo\n\nCreated folder: demo\nCreated folder: demo/config\nCreated folder: demo/logs\nCreated folder: demo/packages\nCreated folder: demo/report/airtest\nCreated folder: demo/tests\nCreated folder: demo/suites\nCreated file: demo/.gitignore\nCreated file: demo/conftest.py\nCreated file: demo/pytest.ini\nCreated file: demo/run.py\nCreated file: demo/requirements.txt\nCreated file: demo/config/conf.py\nCreated file: demo/config/config.ini\nCreated file: demo/config/__init__.py\nCreated file: demo/tests/test_devices.py\nCreated file: demo/tests/__init__.py\nCreated file: demo/report/summary_template.html\n\n```\n## è°ç¨æµç¨
227å¾\n\n\n\n\n## 䏿³¨äºåèæ¬\n\n- 项ç®ç»æå¾æ¸
æ°ãå¨conftest.pyè¿è¡ä¸äºåå§å/åæ°å/æ¸
çå·¥ä½ï¼å¨suites/åæµè¯èæ¬ã\n\u003eå¨AirtestIDEä¸å好.airèæ¬ï¼ç¶åå°æä»¶æ¾å°suitesæä»¶ä¸ã\n- æ´æ³¨éå¹³éºåèæ¬çæ¹å¼ï¼è¿æ ·å°±ç¦»âæ¯ä¸ªäººé½è½ç¨pythonåèªå¨åâæ´è¿ä¸æ¥ãæ¯ç«å°è£
ä¹åçç容ææï¼æä¹æã\n- å»é¤ææ¡æ¶ç约æï¼ç»æ¯ä¸ªäººåpythonçèªç±ï¼å¨æµè¯èæ¬éä½ å¯ä»¥å°½æ
åæ¥ä½ ç代ç 飿 ¼ï¼ä»£ç è½åï¼å人åé¢ã代价å¢ï¼å°±æ¯ä»£ç è´¨éåå·®ä¸é½ã\n\n大èåï¼è½åï¼ååºæ¥ï¼è·éï¼å°±å·²ç»æ¯å¨åèªå¨åï¼å°±å·²ç»æ¯å¨åé ä»·å¼äºï¼\n\n\n## è½»å°è£
\n\nutxå°éåçç¨æ³ã\n\nairtestçå°è£
åªéè¿è£
饰å¨è¿è¡äºè¿è¡æ¹å¼çè°æ´ï¼æ²¡æåä»»ä½å
¶ä»çåä½ä¿®æ¹ã\n\n- fakerï¼é æ°æ®å·¥å
·\n- pytestï¼æµè¯æ¡æ¶\n- airtestï¼èªå¨åæµè¯å·¥å
·\n- tideviceï¼iOS设å¤ç®¡çå·¥å
·\n- pandasãnumpyï¼æ°æ®å¤çå·¥å
·\n\nå®è£
utxï¼èªå¨å°±æè¿äºå¼æºå©å¨å®è£
ä¸äºï¼æ éåç¬å®è£
ãæªæ¥ä¼éææ´å¤å®ç¨å·¥å
·å°utxä¸ã\n\nutxæ¬èº«æ¯å¾è½»çã\n\n## æ ¸å¿ä»·å¼\n\n- 䏿 0 鍿§ï¼iOS/Android 设å¤åå®ç°å³æå³ç¨ï¼éåéè°\n- æµè¯ç¨ä¾å¯è¯»æ§é«ï¼ç¼åææ¬ä½ï¼æ¯æpythonè¯æ³ï¼ä¾¿äºå
Œ
±æä½æ½è±¡ï¼è¿ä¸æ¥æé«ç¨ä¾å¯ç»´æ¤æ§\n- ç¨ä¾æ§è¡é«é²æ£æ§ï¼å¤è®¾å¤æºå忢æ éæ´æ¹ç¨ä¾éé
\n- æ§è¡éå建ç®åï¼æ¯ææºè½å¹¶åãåç»åæ¨¡åæ§è¡ï¼æ´é«ææ´çµæ´»\n\n## åè½ä»ç»\n\n1. æ¯æandroid,ios,web å¹³å°çèªå¨åæµè¯æ¡æ¶\n2. èæ¬æ¹éæ§è¡\n3. æ¯ä¸ªèæ¬æ§è¡æ¥å¿åå¼åæ¾\n4. æ¯ä¸ªèæ¬åç¬çæä¸ä¸ªhtmlæ¥åå¹¶å¨ç¶æä»¶å¤¹çæä¸ä¸ªè忥å\n5. èªå®ä¹çè忥åï¼è¯¦ç»å±ç¤ºè¿è¡ç»æ\n6. éè¯æºå¶ï¼è¿è¡å¤±è´¥èªå¨éè·ï¼å¯èªå®ä¹éè·æ¬¡æ°\n7. èªå®ä¹èæ¬è¿è¡ï¼å¯éæ©é¨å模ååç¬è¿è¡\n8. èªå¸¦èææ¶å·¥å
·å¯ä»¥å¿«éçææ¡æ¶ç®å½\n\n\n## app使ç¨è¯´æ\n\n- åªéå¨é
ç½®æä»¶ä¸å¡«å¥½ç¸å
³å
容ï¼å³å¯è¿è¡ï¼\n```ini\n[device_info]\n;设å¤è¿ç¨é¾æ¥URL 设å¤ip+ç«¯å£æè
设å¤å¯ä¸æ è¯idï¼å¤ä¸ªè®¾å¤ä»¥,åå²ï¼ä¾å¦ 设å¤1,设å¤2,设å¤3\ndevice = 127.0.0.1:5555\n;设å¤å¹³å°iOSæè
Android\nplatform = android\n;ios设å¤é©±å¨å
åï¼ä»
æµè¯iOSæ¶éè¦\nwda = com.facebook.WebDriverAgentRunner.utx.xctrunner\n;æ¯å¦æ§è¡å®è£
å¸è½½æä½ True/False\ninit = False\n\n[app_info]\n;appå
å\npackage = com.wx.mp.test\n;apkæè
ipaæä»¶å\nfilename = app_test.apk\n\n[reruns]\n;失败å忬¡è¿è¡æ¬¡æ°ï¼é»è®¤1次\ntimes = 1\n\n[paths]\n;èªå®ä¹æ§è¡caseç®å½å±çº§ï¼æä»¶å¤¹åç§°ï¼ä¾å¦ï¼smokeï¼ï¼é»è®¤ä¸ºç©º\nname = \n\n[mode]\n;False 表示 è¿è¡[suites][cases]éæ©çç¨ä¾ï¼True表示è¿è¡å
¨é¨ç¨ä¾\nis_all = True\n;æ¯å¦å½å¶è§é¢ True/False\nrecord = False\n\n[suites]\n;å¡«åç¨ä¾çå
³é®å\ncases = test.air\n```\n\n- appå¯å¨å½ä»¤\n1. æ®éå¯å¨\n```shell\npython run.py\n```\n2. åæ°åå¯å¨\n```shell\n# Android\npython run.py --platform=Android --device=127.0.0.1:5555 --init=True\n# iOS\npython run.py --platform=iOS --wda=com.facebook.WebDriverAgentRunner.utx.xctrunner --init=True\n```\n\u003eåæ°ä¼å
级大äºé
ç½®æä»¶\n\u003e \u003eå¤ä¸ªè®¾å¤ä»¥,åå²; ä¾å¦ python run.py --platform=Android --device=设å¤1,设å¤2,设å¤3 --init=True\n\n## web使ç¨è¯´æ\n\n- æ éå
³æ³¨ chromeæµè§å¨é©±å¨\n\u003e 注æï¼æ éé
ç½® chromedriver ï¼ç³»ç»ä¼èªå¨åç»´æ¤å¹é
çæ¬ã\n- åªéå¨é
ç½®æä»¶ä¸å¡«å¥½ç¸å
³å
容ï¼å³å¯è¿è¡ï¼\n```ini\n[web_info]\n;被æµç主页url\nurl = https://www.baidu.com/\n;æ¯å¦æ çé¢è¿è¡\nheadless = False\n\n[reruns]\n;失败å忬¡è¿è¡æ¬¡æ°ï¼é»è®¤1次\ntimes = 1\n\n[paths]\n;èªå®ä¹æ§è¡caseç®å½å±çº§ï¼æä»¶å¤¹åç§°ï¼ä¾å¦ï¼smokeï¼ï¼é»è®¤ä¸ºç©º\nname = \n\n[mode]\n;False 表示 è¿è¡[suites][cases]éæ©çç¨ä¾ï¼True表示è¿è¡å
¨é¨ç¨ä¾\nis_all = True\n\n[suites]\n;å¡«åç¨ä¾çå
³é®å\ncases = chrome\n\n```\n\n- webå¯å¨å½ä»¤\n1. æ®éå¯å¨\n```shell\npython run.py\n```\n2. åæ°åå¯å¨\n```shell\npython run.py --headless=True --driver=/Users/admin/driverpath\n```\n\u003eåæ°ä¼å
级大äºé
ç½®æä»¶\n\n## è¿è¡ç»æ\n- æ¥åå±ç¤º\n\n\n\n\n","tags":["弿ºé¡¹ç®"],"top":0,"category":"弿ºé¡¹ç®","hidden":false,"author":"æä½³ç®","pathname":"","private":false,"viewer":289,"visited":289,"createdAt":"2023-11-02T11:02:14.520Z","updatedAt":"2023-11-02T11:04:48.727Z","id":24,"lastVisitedTime":"2026-09-27T03:11:21.124Z"},"pre":{"title":"ç»æçå
¬ä¼å·æ·»å äºä¸ä¸ªAIæºå¨äººï½","id":23,"pathname":""},"next":{"title":"å¦ä½å¨Pythonå
䏿§å¶åªå
许ç¹å®Pythonçæ¬ä½¿ç¨","id":25,"pathname":""},"pay":["https://openutx.cn/static/img/22dce95a52ba05dfde3eaf8e6834fafe.IMG_7229.webp","https://openutx.cn/static/img/cb6ed61087eb2918e9f3ed8ac36e1262.IMG_7228.webp"],"payDark":["",""],"author":"æä½³ç®","showSubMenu":"true"},"__N_SSG":true},"page":"/post/[id]","query":{"id":"24"},"buildId":"77JJh7CBRvlkoRHH7B3Ea","isFallback":false,"dynamicIds":[9272],"gsp":true,"scriptLoader":[]}</script>
227<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"c72bee5a3a3b45f6b358f07a2f08deed","r":1,"spa":2}' crossorigin="anonymous"></script>
227 228</body></html>
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.