From 06148fb9713b6f7d2fef1001190d347cbb0c0509 Mon Sep 17 00:00:00 2001 From: mikigo Date: Mon, 22 Jul 2024 07:07:19 +0000 Subject: [PATCH] deploy: 944f4fa0014792e040b23f4bedd1b1718102109a --- 404.html | 4 +-- assets/{app.w4ajM7s2.js => app.CenpHCDi.js} | 2 +- .../chunks/@localSearchIndexroot.BXd6ZsaL.js | 1 + .../chunks/@localSearchIndexroot.gI043LAz.js | 1 - ...xUzkwX.js => VPLocalSearchBox.Re7xpDUq.js} | 2 +- ...work.CoRJFuj9.js => framework.DPHCW6-_.js} | 2 +- .../{theme.D89Al4wk.js => theme.F2IToOfj.js} | 4 +-- ...ex.md.DHQYfbhW.js => index.md.DqShbTWU.js} | 2 +- ...fbhW.lean.js => index.md.DqShbTWU.lean.js} | 2 +- ...25\345\274\200\345\217\221.md.DrKhzEj9.js" | 2 +- ...5\274\200\345\217\221.md.DrKhzEj9.lean.js" | 2 +- ...13\345\274\200\345\217\221.md.DNazKAqh.js" | 2 +- ...5\274\200\345\217\221.md.DNazKAqh.lean.js" | 2 +- ...ON\346\212\245\345\221\212.md.Co0iG6_7.js" | 2 +- ...6\212\245\345\221\212.md.Co0iG6_7.lean.js" | 2 +- ...50\346\227\245\345\277\227.md.pf-_G9bM.js" | 2 +- ...6\227\245\345\277\227.md.pf-_G9bM.lean.js" | 2 +- ...16\351\222\251\345\255\220.md.gAnZB4uC.js" | 2 +- ...1\222\251\345\255\220.md.gAnZB4uC.lean.js" | 2 +- ...01\347\255\211\345\276\205.md.Ddzd3DvB.js" | 2 +- ...7\255\211\345\276\205.md.Ddzd3DvB.lean.js" | 2 +- ...14\344\272\244\344\272\222.md.DGt53oPK.js" | 2 +- ...4\272\244\344\272\222.md.DGt53oPK.lean.js" | 2 +- ...00\350\257\255\345\217\245.md.BMW7n5nx.js" | 16 ++++-------- ...0\257\255\345\217\245.md.BMW7n5nx.lean.js" | 2 +- ...26\347\256\241\347\220\206.md.ybzn751_.js" | 2 +- ...7\256\241\347\220\206.md.ybzn751_.lean.js" | 2 +- ...66\345\267\245\345\205\267.md.COef0uN8.js" | 2 ++ ...5\267\245\345\205\267.md.COef0uN8.lean.js" | 1 + ...66\345\267\245\345\205\267.md.DRa5p1HS.js" | 1 - ...5\267\245\345\205\267.md.DRa5p1HS.lean.js" | 1 - ...22\346\216\247\345\210\266.md.DkPsG4Yc.js" | 2 +- ...6\216\247\345\210\266.md.DkPsG4Yc.lean.js" | 2 +- ...52\345\212\250\345\214\226.md.CyB0yQ5u.js" | 2 +- ...5\212\250\345\214\226.md.CyB0yQ5u.lean.js" | 2 +- ...52\345\212\250\345\214\226.md.DL5_OxbD.js" | 2 +- ...5\212\250\345\214\226.md.DL5_OxbD.lean.js" | 2 +- ...ML\346\212\245\345\221\212.md.CwKyfJ2P.js" | 2 +- ...6\212\245\345\221\212.md.CwKyfJ2P.lean.js" | 2 +- ...52\345\212\250\345\214\226.md.BlmKJBRY.js" | 2 +- ...5\212\250\345\214\226.md.BlmKJBRY.lean.js" | 2 +- ...52\345\212\250\345\214\226.md.Df5fxio_.js" | 2 +- ...5\212\250\345\214\226.md.Df5fxio_.lean.js" | 2 +- ...26\346\217\222\344\273\266.md.DIHBrI0B.js" | 2 +- ...6\217\222\344\273\266.md.DIHBrI0B.lean.js" | 2 +- ...13\345\275\225\345\261\217.md.BTl-QwPF.js" | 2 +- ...5\275\225\345\261\217.md.BTl-QwPF.lean.js" | 2 +- ...22\346\216\247\345\210\266.md.Di_mii3F.js" | 2 +- ...6\216\247\345\210\266.md.Di_mii3F.lean.js" | 2 +- ...37\347\216\257\345\242\203.md.DTl0iVdm.js" | 2 +- ...7\216\257\345\242\203.md.DTl0iVdm.lean.js" | 2 +- ...37\347\216\257\345\242\203.md.Cje0lGaT.js" | 2 +- ...7\216\257\345\242\203.md.Cje0lGaT.lean.js" | 2 +- ...57\344\273\200\344\271\210.md.BbdMxJHl.js" | 2 +- ...4\273\200\344\271\210.md.BbdMxJHl.lean.js" | 2 +- ...5\274\200\345\247\213.md.DgOYFTsc.lean.js" | 1 - ...37\345\274\200\345\247\213.md.cQWGMWMJ.js" | 4 +-- ...5\274\200\345\247\213.md.cQWGMWMJ.lean.js" | 1 + ...6\211\247\350\241\214.md.D7xXXuqS.lean.js" | 1 - ...60\346\211\247\350\241\214.md.DxkWigr1.js" | 6 ++--- ...6\211\247\350\241\214.md.DxkWigr1.lean.js" | 1 + ...11\346\211\247\350\241\214.md.CJzKfzmA.js" | 1 - ...6\211\247\350\241\214.md.CJzKfzmA.lean.js" | 1 - ...11\346\211\247\350\241\214.md.DLLTwyK0.js" | 1 + ...6\211\247\350\241\214.md.DLLTwyK0.lean.js" | 1 + ...13\346\211\247\350\241\214.md.sHtTnJxD.js" | 1 + ...6\211\247\350\241\214.md.sHtTnJxD.lean.js" | 1 + ...13\346\211\247\350\241\214.md.tigHGXwZ.js" | 1 - ...6\211\247\350\241\214.md.tigHGXwZ.lean.js" | 1 - ...us\346\223\215\346\216\247.md.LyCalTTb.js" | 2 +- ...6\223\215\346\216\247.md.LyCalTTb.lean.js" | 2 +- ...25\346\212\245\345\221\212.md.Cll63v3M.js" | 2 +- ...6\212\245\345\221\212.md.Cll63v3M.lean.js" | 2 +- ...CR\350\257\206\345\210\253.md.BaITtS8Q.js" | 2 +- ...0\257\206\345\210\253.md.BaITtS8Q.lean.js" | 2 +- ...25\351\251\261\345\212\250.md.DIfYqa2Y.js" | 2 +- ...1\251\261\345\212\250.md.DIfYqa2Y.lean.js" | 2 +- ...52\345\212\250\345\214\226.md.BcYJKkcd.js" | 2 +- ...5\212\250\345\214\226.md.BcYJKkcd.lean.js" | 2 +- ...50\346\227\245\345\277\227.md.CIURC7__.js" | 2 +- ...6\227\245\345\277\227.md.CIURC7__.lean.js" | 2 +- ...17\350\257\206\345\210\253.md.VeoOW0r7.js" | 2 +- ...0\257\206\345\210\253.md.VeoOW0r7.lean.js" | 2 +- ...47\350\257\206\345\210\253.md.SazIGvfF.js" | 2 +- ...0\257\206\345\210\253.md.SazIGvfF.lean.js" | 2 +- ...66\345\210\227\350\241\250.md.DDEyx3Tf.js" | 2 +- ...5\210\227\350\241\250.md.DDEyx3Tf.lean.js" | 2 +- ...26\347\256\241\347\220\206.md.DaItR4Tn.js" | 2 +- ...7\256\241\347\220\206.md.DaItR4Tn.lean.js" | 2 +- ...13\345\275\225\345\261\217.md.CcZu9v2d.js" | 2 +- ...5\275\225\345\261\217.md.CcZu9v2d.lean.js" | 2 +- ...73\345\256\232\344\275\215.md.B2uoPN0f.js" | 2 +- ...5\256\232\344\275\215.md.B2uoPN0f.lean.js" | 2 +- ...40\346\223\215\344\275\234.md.jcIl2AmQ.js" | 2 +- ...6\223\215\344\275\234.md.jcIl2AmQ.lean.js" | 2 +- ...25\345\245\227\344\273\266.md.DKCRRhsG.js" | 2 +- ...5\245\227\344\273\266.md.DKCRRhsG.lean.js" | 2 +- ...25\347\224\250\344\276\213.md.CQpRJ8KI.js" | 2 +- ...7\224\250\344\276\213.md.CQpRJ8KI.lean.js" | 2 +- ...41\350\247\204\345\210\222.md.BjaGMZhM.js" | 2 +- ...0\247\204\345\210\222.md.BjaGMZhM.lean.js" | 2 +- hashmap.json | 2 +- index.html | 10 +++---- ...\346\263\225\345\274\200\345\217\221.html" | 12 ++++----- ...\344\276\213\345\274\200\345\217\221.html" | 12 ++++----- .../JSON\346\212\245\345\221\212.html" | 12 ++++----- ...\345\212\250\346\227\245\345\277\227.html" | 12 ++++----- ...\345\220\216\351\222\251\345\255\220.html" | 12 ++++----- ...\346\200\201\347\255\211\345\276\205.html" | 12 ++++----- ...\350\241\214\344\272\244\344\272\222.html" | 12 ++++----- ...\350\250\200\350\257\255\345\217\245.html" | 26 +++++++------------ ...\345\214\226\347\256\241\347\220\206.html" | 12 ++++----- ...\346\236\266\345\267\245\345\205\267.html" | 15 ++++++----- ...\344\272\222\346\216\247\345\210\266.html" | 12 ++++----- ...\350\207\252\345\212\250\345\214\226.html" | 12 ++++----- ...\350\207\252\345\212\250\345\214\226.html" | 12 ++++----- .../HTML\346\212\245\345\221\212.html" | 12 ++++----- ...\350\207\252\345\212\250\345\214\226.html" | 12 ++++----- ...\350\207\252\345\212\250\345\214\226.html" | 12 ++++----- ...\344\273\226\346\217\222\344\273\266.html" | 12 ++++----- ...\344\276\213\345\275\225\345\261\217.html" | 12 ++++----- ...\344\272\222\346\216\247\345\210\266.html" | 12 ++++----- ...\347\224\237\347\216\257\345\242\203.html" | 12 ++++----- ...\346\213\237\347\216\257\345\242\203.html" | 12 ++++----- ...\346\230\257\344\273\200\344\271\210.html" | 12 ++++----- ...\351\200\237\345\274\200\345\247\213.html" | 14 +++++----- ...\345\234\260\346\211\247\350\241\214.html" | 16 ++++++------ ...\344\271\211\346\211\247\350\241\214.html" | 12 ++++----- ...\347\250\213\346\211\247\350\241\214.html" | 12 ++++----- .../DBus\346\223\215\346\216\247.html" | 12 ++++----- ...\350\257\225\346\212\245\345\221\212.html" | 12 ++++----- .../OCR\350\257\206\345\210\253.html" | 12 ++++----- ...\345\215\225\351\251\261\345\212\250.html" | 12 ++++----- ...\350\207\252\345\212\250\345\214\226.html" | 12 ++++----- ...\345\212\250\346\227\245\345\277\227.html" | 12 ++++----- ...\345\203\217\350\257\206\345\210\253.html" | 12 ++++----- ...\346\200\247\350\257\206\345\210\253.html" | 12 ++++----- ...\344\273\266\345\210\227\350\241\250.html" | 12 ++++----- ...\345\214\226\347\256\241\347\220\206.html" | 12 ++++----- ...\344\276\213\345\275\225\345\261\217.html" | 12 ++++----- ...\347\247\273\345\256\232\344\275\215.html" | 12 ++++----- ...\351\274\240\346\223\215\344\275\234.html" | 12 ++++----- ...\346\263\225\345\245\227\344\273\266.html" | 12 ++++----- ...\350\257\225\347\224\250\344\276\213.html" | 12 ++++----- ...\350\256\241\350\247\204\345\210\222.html" | 12 ++++----- 145 files changed, 369 insertions(+), 379 deletions(-) rename assets/{app.w4ajM7s2.js => app.CenpHCDi.js} (90%) create mode 100644 assets/chunks/@localSearchIndexroot.BXd6ZsaL.js delete mode 100644 assets/chunks/@localSearchIndexroot.gI043LAz.js rename assets/chunks/{VPLocalSearchBox.uXxUzkwX.js => VPLocalSearchBox.Re7xpDUq.js} (99%) rename assets/chunks/{framework.CoRJFuj9.js => framework.DPHCW6-_.js} (99%) rename assets/chunks/{theme.D89Al4wk.js => theme.F2IToOfj.js} (99%) rename assets/{index.md.DHQYfbhW.js => index.md.DqShbTWU.js} (89%) rename assets/{index.md.DHQYfbhW.lean.js => index.md.DqShbTWU.lean.js} (89%) rename "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" => "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.js" (67%) rename "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" => "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.lean.js" (67%) rename "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" => "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.js" (67%) rename "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" => "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.lean.js" (67%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.Co0iG6_7.js" (98%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.Co0iG6_7.lean.js" (59%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.pf-_G9bM.js" (99%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.DAHkI26O.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.pf-_G9bM.lean.js" (88%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.gAnZB4uC.js" (97%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.9jPcVsFG.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\211\215\345\220\216\351\222\251\345\255\220.md.gAnZB4uC.lean.js" (59%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.Ddzd3DvB.js" (94%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.LG1pIdT8.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\212\250\346\200\201\347\255\211\345\276\205.md.Ddzd3DvB.lean.js" (59%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.DGt53oPK.js" (97%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.7SDsZBAk.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\345\221\275\344\273\244\350\241\214\344\272\244\344\272\222.md.DGt53oPK.lean.js" (60%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.BMW7n5nx.js" (96%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.BMW7n5nx.lean.js" (73%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.js" (98%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.lean.js" (60%) create mode 100644 "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.js" create mode 100644 "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.lean.js" delete mode 100644 "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" delete mode 100644 "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.js" (97%) rename "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js" => "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.lean.js" (62%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.lean.js" (70%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.js" (71%) rename "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js" => "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.lean.js" (71%) rename "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js" => "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DTl0iVdm.js" (87%) rename "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.lean.js" => "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DTl0iVdm.lean.js" (59%) rename "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.js" => "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.Cje0lGaT.js" (94%) rename "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.CYH44Dje.lean.js" => "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\350\231\232\346\213\237\347\216\257\345\242\203.md.Cje0lGaT.lean.js" (59%) rename "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.js" => "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.BbdMxJHl.js" (90%) rename "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.Bua1hpcO.lean.js" => "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_YouQu3\346\230\257\344\273\200\344\271\210.md.BbdMxJHl.lean.js" (59%) delete mode 100644 "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.lean.js" rename "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.DgOYFTsc.js" => "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.cQWGMWMJ.js" (83%) create mode 100644 "assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.cQWGMWMJ.lean.js" delete mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" rename "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" => "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.js" (87%) create mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.lean.js" delete mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" delete mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" create mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.js" create mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.lean.js" create mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.js" create mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.lean.js" delete mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" delete mode 100644 "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.lean.js" rename "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.js" => "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.LyCalTTb.js" (67%) rename "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.B46p_EM-.lean.js" => "assets/\346\217\222\344\273\266_DBus\346\223\215\346\216\247.md.LyCalTTb.lean.js" (67%) rename "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.js" => "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.Cll63v3M.js" (68%) rename "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.BO3ILMEt.lean.js" => "assets/\346\217\222\344\273\266_Html\346\265\213\350\257\225\346\212\245\345\221\212.md.Cll63v3M.lean.js" (68%) rename "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.js" => "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BaITtS8Q.js" (98%) rename "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BbvIdL2A.lean.js" => "assets/\346\217\222\344\273\266_OCR\350\257\206\345\210\253.md.BaITtS8Q.lean.js" (54%) rename "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.js" => "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.DIfYqa2Y.js" (69%) rename "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.C3RnWS9a.lean.js" => "assets/\346\217\222\344\273\266_PMS\346\265\213\350\257\225\345\215\225\351\251\261\345\212\250.md.DIfYqa2Y.lean.js" (69%) rename "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.js" => "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.BcYJKkcd.js" (68%) rename "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.DYY4Enyl.lean.js" => "assets/\346\217\222\344\273\266_WebUI\350\207\252\345\212\250\345\214\226.md.BcYJKkcd.lean.js" (68%) rename "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.js" => "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.CIURC7__.js" (99%) rename "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.BybnXbQR.lean.js" => "assets/\346\217\222\344\273\266_\345\205\250\350\207\252\345\212\250\346\227\245\345\277\227.md.CIURC7__.lean.js" (72%) rename "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.js" => "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.VeoOW0r7.js" (67%) rename "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.CUSgLZyr.lean.js" => "assets/\346\217\222\344\273\266_\345\233\276\345\203\217\350\257\206\345\210\253.md.VeoOW0r7.lean.js" (67%) rename "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.js" => "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.SazIGvfF.js" (67%) rename "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.BIoism-O.lean.js" => "assets/\346\217\222\344\273\266_\345\261\236\346\200\247\350\257\206\345\210\253.md.SazIGvfF.lean.js" (67%) rename "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.js" => "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.DDEyx3Tf.js" (95%) rename "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.uvT93bNC.lean.js" => "assets/\346\217\222\344\273\266_\346\217\222\344\273\266\345\210\227\350\241\250.md.DDEyx3Tf.lean.js" (54%) rename "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.js" => "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DaItR4Tn.js" (68%) rename "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.SKMSpBW6.lean.js" => "assets/\346\217\222\344\273\266_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DaItR4Tn.lean.js" (68%) rename "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.js" => "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.CcZu9v2d.js" (67%) rename "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.00QQ8nUD.lean.js" => "assets/\346\217\222\344\273\266_\347\224\250\344\276\213\345\275\225\345\261\217.md.CcZu9v2d.lean.js" (67%) rename "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.js" => "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.B2uoPN0f.js" (69%) rename "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.BcEKWi6-.lean.js" => "assets/\346\217\222\344\273\266_\347\233\270\345\257\271\344\275\215\347\247\273\345\256\232\344\275\215.md.B2uoPN0f.lean.js" (69%) rename "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.js" => "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.jcIl2AmQ.js" (67%) rename "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.Cd0N2NjF.lean.js" => "assets/\346\217\222\344\273\266_\351\224\256\351\274\240\346\223\215\344\275\234.md.jcIl2AmQ.lean.js" (67%) rename "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.js" => "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.DKCRRhsG.js" (98%) rename "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.1k7ez6Zn.lean.js" => "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\226\271\346\263\225\345\245\227\344\273\266.md.DKCRRhsG.lean.js" (64%) rename "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.js" => "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CQpRJ8KI.js" (97%) rename "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CjduEaF0.lean.js" => "assets/\350\247\204\345\210\222_UOS\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\347\224\250\344\276\213.md.CQpRJ8KI.lean.js" (61%) rename "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.js" => "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.BjaGMZhM.js" (99%) rename "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js" => "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.BjaGMZhM.lean.js" (75%) diff --git a/404.html b/404.html index 91d4b0b..de669b5 100644 --- a/404.html +++ b/404.html @@ -8,7 +8,7 @@ - + @@ -16,7 +16,7 @@
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.
- + \ No newline at end of file diff --git a/assets/app.w4ajM7s2.js b/assets/app.CenpHCDi.js similarity index 90% rename from assets/app.w4ajM7s2.js rename to assets/app.CenpHCDi.js index 847a812..4b3d493 100644 --- a/assets/app.w4ajM7s2.js +++ b/assets/app.CenpHCDi.js @@ -1 +1 @@ -import{R as i}from"./chunks/theme.D89Al4wk.js";import{j as o,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,ap as v,d as w,u as y,l as C,z as P,aq as R,ar as b,as as j,a4 as D}from"./chunks/framework.CoRJFuj9.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),E=w({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),j(),s.setup&&s.setup(),()=>D(s.Layout)}});async function S(){const e=x(),a=T();a.provide(l,e);const t=c(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function T(){return g(E)}function x(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&S().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{S as createApp}; +import{R as i}from"./chunks/theme.F2IToOfj.js";import{j as o,ag as u,ah as l,ai as c,aj as f,ak as d,al as m,am as h,an as g,ao as A,ap as v,d as w,u as y,l as C,z as P,aq as R,ar as b,as as j,a4 as D}from"./chunks/framework.DPHCW6-_.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),E=w({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{P(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&R(),b(),j(),s.setup&&s.setup(),()=>D(s.Layout)}});async function S(){const e=x(),a=T();a.provide(l,e);const t=c(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function T(){return g(E)}function x(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&S().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{S as createApp}; diff --git a/assets/chunks/@localSearchIndexroot.BXd6ZsaL.js b/assets/chunks/@localSearchIndexroot.BXd6ZsaL.js new file mode 100644 index 0000000..843e073 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.BXd6ZsaL.js @@ -0,0 +1 @@ +const t='{"documentCount":141,"nextId":141,"documentIds":{"0":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","1":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","2":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","3":"/youqu3/指南/与生俱来/JSON报告.html#environment","4":"/youqu3/指南/与生俱来/JSON报告.html#summary","5":"/youqu3/指南/与生俱来/JSON报告.html#collectors","6":"/youqu3/指南/与生俱来/JSON报告.html#tests","7":"/youqu3/指南/与生俱来/JSON报告.html#warnings","8":"/youqu3/指南/与生俱来/全自动日志.html#全自动日志","9":"/youqu3/指南/与生俱来/全自动日志.html#背景","10":"/youqu3/指南/与生俱来/全自动日志.html#实现原理","11":"/youqu3/指南/与生俱来/全自动日志.html#日志配置","12":"/youqu3/指南/与生俱来/全自动日志.html#使用方法","13":"/youqu3/指南/与生俱来/前后钩子.html#前后钩子","14":"/youqu3/指南/与生俱来/前后钩子.html#前置钩子","15":"/youqu3/指南/与生俱来/前后钩子.html#前置脚本钩子","16":"/youqu3/指南/与生俱来/前后钩子.html#前置命令行入参钩子","17":"/youqu3/指南/与生俱来/前后钩子.html#后置钩子","18":"/youqu3/指南/与生俱来/前后钩子.html#后置脚本钩子","19":"/youqu3/指南/与生俱来/前后钩子.html#后置命令行入参钩子","20":"/youqu3/指南/与生俱来/动态等待.html#动态等待","21":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","22":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","23":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","24":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","25":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","26":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","27":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","28":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","29":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","30":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","31":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","32":"/youqu3/指南/与生俱来/断言语句.html#断言语句","33":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","34":"/youqu3/指南/与生俱来/断言语句.html#方法明细","35":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","36":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","37":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","38":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","39":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","40":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","41":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","42":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","43":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","44":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","45":"/youqu3/指南/与生俱来/脚手架工具.html#脚手架工具","46":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","47":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","48":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","49":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","50":"/youqu3/指南/环境管理/原生环境.html#原生环境","51":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","52":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","53":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","54":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","55":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","56":"/youqu3/指南/简介/快速开始.html#快速开始","57":"/youqu3/指南/简介/快速开始.html#安装","58":"/youqu3/指南/简介/快速开始.html#创建用例工程","59":"/youqu3/指南/驱动执行/本地执行.html#本地执行","60":"/youqu3/指南/驱动执行/本地执行.html#子命令","61":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","62":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","63":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","64":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","65":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","66":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","67":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","68":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","69":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","70":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","71":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","72":"/youqu3/指南/驱动执行/自定义执行.html#案例","73":"/youqu3/指南/驱动执行/自定义执行.html#pms用例驱动","74":"/youqu3/指南/驱动执行/远程执行.html#远程执行","75":"/youqu3/指南/驱动执行/远程执行.html#子命令","76":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","77":"/youqu3/指南/驱动执行/远程执行.html#分组规则","78":"/youqu3/指南/驱动执行/远程执行.html#执行策略","79":"/youqu3/插件/OCR识别.html#pdocr-rpc","80":"/youqu3/插件/OCR识别.html#_1、服务端","81":"/youqu3/插件/OCR识别.html#服务端安装","82":"/youqu3/插件/OCR识别.html#服务端启动服务","83":"/youqu3/插件/OCR识别.html#_2、客户端","84":"/youqu3/插件/OCR识别.html#客户端安装","85":"/youqu3/插件/OCR识别.html#客户端使用","86":"/youqu3/插件/OCR识别.html#_2-1、识别当前屏幕的所有文字内容","87":"/youqu3/插件/OCR识别.html#_2-2、指定某张图片识别的所有文字内容","88":"/youqu3/插件/OCR识别.html#_2-3、在全屏指定查找某个字符串的坐标","89":"/youqu3/插件/OCR识别.html#_2-4、指定某张图片查找某个字符串的坐标","90":"/youqu3/插件/OCR识别.html#_2-5、其他参数","91":"/youqu3/插件/全自动日志.html#funnylog","92":"/youqu3/插件/全自动日志.html#安装","93":"/youqu3/插件/全自动日志.html#使用方法","94":"/youqu3/插件/全自动日志.html#_1、自动输出日志","95":"/youqu3/插件/全自动日志.html#_2、方法中输出其他的日志","96":"/youqu3/插件/全自动日志.html#_3、在外层其他直接使用","97":"/youqu3/插件/全自动日志.html#必要配置项","98":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","99":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","100":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","101":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","102":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","103":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","104":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","105":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","106":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","107":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","108":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","109":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","110":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","111":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","112":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","113":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","114":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","115":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","116":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","117":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","118":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","119":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","120":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","121":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","122":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","123":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","124":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","125":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","126":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","127":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","128":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","129":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","130":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","131":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","132":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","133":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","134":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","135":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","136":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","137":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","138":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","139":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","140":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,8],"1":[1,2,1],"2":[1,3,23],"3":[1,3,31],"4":[1,3,15],"5":[1,3,4],"6":[1,3,21],"7":[1,3,23],"8":[1,1,1],"9":[1,1,41],"10":[1,1,24],"11":[1,1,27],"12":[1,1,102],"13":[1,1,3],"14":[1,1,1],"15":[1,2,11],"16":[1,2,24],"17":[1,1,1],"18":[1,2,12],"19":[1,2,24],"20":[1,1,1],"21":[1,1,21],"22":[1,1,1],"23":[1,1,1],"24":[1,1,1],"25":[1,2,8],"26":[1,2,11],"27":[1,2,18],"28":[1,1,1],"29":[1,2,13],"30":[1,2,15],"31":[1,2,17],"32":[1,1,4],"33":[1,1,35],"34":[1,1,251],"35":[1,1,1],"36":[1,1,13],"37":[1,1,50],"38":[1,1,14],"39":[2,2,18],"40":[2,2,62],"41":[2,2,41],"42":[1,1,33],"43":[1,1,21],"44":[1,1,8],"45":[1,1,15],"46":[1,1,13],"47":[1,1,21],"48":[1,1,1],"49":[1,2,57],"50":[1,1,11],"51":[1,1,22],"52":[2,1,6],"53":[2,1,12],"54":[2,1,4],"55":[3,1,18],"56":[1,1,1],"57":[1,1,18],"58":[1,1,9],"59":[1,1,1],"60":[1,1,7],"61":[1,1,1],"62":[1,2,6],"63":[1,2,21],"64":[1,2,25],"65":[1,2,30],"66":[1,2,24],"67":[1,2,15],"68":[1,2,21],"69":[1,1,8],"70":[3,1,14],"71":[3,1,14],"72":[1,1,1],"73":[1,2,31],"74":[1,1,1],"75":[1,1,18],"76":[1,1,1],"77":[1,2,17],"78":[1,2,32],"79":[2,1,18],"80":[2,2,1],"81":[1,4,6],"82":[1,4,22],"83":[2,2,1],"84":[1,4,5],"85":[1,4,1],"86":[3,5,21],"87":[2,5,11],"88":[3,5,8],"89":[3,5,10],"90":[3,5,39],"91":[1,1,12],"92":[1,1,4],"93":[1,1,1],"94":[2,2,61],"95":[2,2,58],"96":[2,2,49],"97":[1,1,37],"98":[2,1,90],"99":[4,1,1],"100":[2,4,18],"101":[2,4,1],"102":[3,5,20],"103":[2,5,21],"104":[2,4,33],"105":[2,4,8],"106":[2,4,9],"107":[7,4,50],"108":[2,1,1],"109":[2,2,12],"110":[2,2,1],"111":[3,4,29],"112":[2,4,24],"113":[2,1,1],"114":[2,2,56],"115":[2,2,46],"116":[2,2,1],"117":[3,4,37],"118":[3,4,1],"119":[2,4,15],"120":[3,4,2],"121":[4,6,16],"122":[4,6,19],"123":[3,6,12],"124":[3,6,4],"125":[4,6,5],"126":[2,2,5],"127":[3,4,49],"128":[3,4,2],"129":[4,6,53],"130":[3,6,32],"131":[4,6,30],"132":[3,6,13],"133":[4,6,9],"134":[4,6,4],"135":[4,6,2],"136":[4,6,5],"137":[2,2,1],"138":[1,7,6],"139":[1,7,4],"140":[1,7,5]},"averageFieldLength":[1.7375886524822697,2.517730496453901,18.93617021276596],"storedFields":{"0":{"title":"JSON 报告","titles":[]},"1":{"title":"报告内容","titles":["JSON 报告"]},"2":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"3":{"title":"Environment","titles":["JSON 报告","报告内容"]},"4":{"title":"Summary","titles":["JSON 报告","报告内容"]},"5":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"6":{"title":"Tests","titles":["JSON 报告","报告内容"]},"7":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"8":{"title":"全自动日志","titles":[]},"9":{"title":"背景","titles":["全自动日志"]},"10":{"title":"实现原理","titles":["全自动日志"]},"11":{"title":"日志配置","titles":["全自动日志"]},"12":{"title":"使用方法","titles":["全自动日志"]},"13":{"title":"前后钩子","titles":[]},"14":{"title":"前置钩子","titles":["前后钩子"]},"15":{"title":"前置脚本钩子","titles":["前后钩子","前置钩子"]},"16":{"title":"前置命令行入参钩子","titles":["前后钩子","前置钩子"]},"17":{"title":"后置钩子","titles":["前后钩子"]},"18":{"title":"后置脚本钩子","titles":["前后钩子","后置钩子"]},"19":{"title":"后置命令行入参钩子","titles":["前后钩子","后置钩子"]},"20":{"title":"动态等待","titles":[]},"21":{"title":"架构动态等待","titles":["动态等待"]},"22":{"title":"元素识别动态等待","titles":["动态等待"]},"23":{"title":"命令行交互","titles":[]},"24":{"title":"本机命令行交互","titles":["命令行交互"]},"25":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"26":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"27":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"28":{"title":"远程命令行交互","titles":["命令行交互"]},"29":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"30":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"31":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"32":{"title":"断言语句","titles":[]},"33":{"title":"用例中使用方法","titles":["断言语句"]},"34":{"title":"方法明细","titles":["断言语句"]},"35":{"title":"标签化管理","titles":[]},"36":{"title":"使用说明","titles":["标签化管理"]},"37":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"38":{"title":"跳过用例","titles":["标签化管理"]},"39":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"40":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"41":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"42":{"title":"确认修复","titles":["标签化管理"]},"43":{"title":"废弃用例","titles":["标签化管理"]},"44":{"title":"文件格式","titles":["标签化管理"]},"45":{"title":"脚手架工具","titles":[]},"46":{"title":"远程交互式控制","titles":[]},"47":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"48":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"49":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"50":{"title":"原生环境","titles":[]},"51":{"title":"虚拟环境","titles":[]},"52":{"title":"youqu3-cargo","titles":["虚拟环境"]},"53":{"title":"youqu3-shell","titles":["虚拟环境"]},"54":{"title":"youqu3-rm","titles":["虚拟环境"]},"55":{"title":"YouQu3 能做什么?","titles":[null]},"56":{"title":"快速开始","titles":[]},"57":{"title":"安装","titles":["快速开始"]},"58":{"title":"创建用例工程","titles":["快速开始"]},"59":{"title":"本地执行","titles":[]},"60":{"title":"子命令","titles":["本地执行"]},"61":{"title":"用例驱动方式","titles":["本地执行"]},"62":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"63":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"64":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"65":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"66":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"67":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"68":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"69":{"title":"自定义执行","titles":[]},"70":{"title":"youqu-tags.txt","titles":["自定义执行"]},"71":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"72":{"title":"案例","titles":["自定义执行"]},"73":{"title":"PMS用例驱动","titles":["自定义执行","案例"]},"74":{"title":"远程执行","titles":[]},"75":{"title":"子命令","titles":["远程执行"]},"76":{"title":"远程测试机分组策略","titles":["远程执行"]},"77":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"78":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"79":{"title":"pdocr-rpc","titles":[]},"80":{"title":"1、服务端","titles":["pdocr-rpc"]},"81":{"title":"服务端安装","titles":["pdocr-rpc","1、服务端"]},"82":{"title":"服务端启动服务","titles":["pdocr-rpc","1、服务端"]},"83":{"title":"2、客户端","titles":["pdocr-rpc"]},"84":{"title":"客户端安装","titles":["pdocr-rpc","2、客户端"]},"85":{"title":"客户端使用","titles":["pdocr-rpc","2、客户端"]},"86":{"title":"2.1、识别当前屏幕的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"87":{"title":"2.2、指定某张图片识别的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"88":{"title":"2.3、在全屏指定查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"89":{"title":"2.4、指定某张图片查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"90":{"title":"2.5、其他参数","titles":["pdocr-rpc","2、客户端","客户端使用"]},"91":{"title":"FunnyLog","titles":[]},"92":{"title":"安装","titles":["FunnyLog"]},"93":{"title":"使用方法","titles":["FunnyLog"]},"94":{"title":"1、自动输出日志","titles":["FunnyLog","使用方法"]},"95":{"title":"2、方法中输出其他的日志","titles":["FunnyLog","使用方法"]},"96":{"title":"3、在外层其他直接使用","titles":["FunnyLog","使用方法"]},"97":{"title":"必要配置项","titles":["FunnyLog"]},"98":{"title":"YouQu3 插件汇总信息","titles":[null]},"99":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"100":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"101":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"102":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"103":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"104":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"105":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"106":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"107":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"108":{"title":"UOS 自动化测试用例","titles":[]},"109":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"110":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"111":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"112":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"113":{"title":"YouQu3 架构设计规划","titles":[]},"114":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"115":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"116":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"117":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"118":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"119":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"120":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"121":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"122":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"123":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"124":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"125":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"126":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"127":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"128":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"129":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"130":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"131":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"132":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"133":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"134":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"135":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"136":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"137":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"138":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"139":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"140":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"140":1}}],["即默认返回识别到字符串的中心坐标",{"2":{"90":1}}],["过程钩子",{"0":{"140":1}}],["过程中如果根据需要出小版本",{"2":{"104":1}}],["减少系统自动化环境准备的难度",{"2":{"139":1}}],["非开发者下运行",{"0":{"139":1}}],["配合远程执行功能",{"2":{"138":1}}],["配置对象",{"0":{"132":1}}],["配置模块",{"2":{"127":1}}],["配置文件管理配置项",{"2":{"122":1}}],["配置类",{"2":{"122":1,"132":1}}],["配置项管理",{"0":{"122":1},"2":{"122":1}}],["页面化的配置功能",{"2":{"138":1}}],["演进规划",{"0":{"137":1},"1":{"138":1,"139":1,"140":1}}],["模式运行脚本",{"2":{"136":1}}],["模块",{"2":{"121":1}}],["模块化改造",{"2":{"115":1}}],["模块名称为应用包名",{"2":{"103":1,"112":1}}],["模块名称",{"2":{"65":1}}],["定义用例工程所需要的依赖包",{"2":{"135":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"134":1}}],["运行的行为",{"2":{"134":1}}],["运行稳定性",{"2":{"115":1}}],["日常维护过程中",{"2":{"133":1}}],["日志文件的生成路径",{"2":{"97":1}}],["日志",{"2":{"95":3}}],["日志模板语法",{"2":{"12":1}}],["日志配置",{"0":{"11":1}}],["维护标签时",{"2":{"133":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"106":1}}],["然后",{"2":{"131":1}}],["然后将这些基础能力通过",{"2":{"46":1}}],["任务栏点击文件管理器",{"2":{"129":1}}],["\\t\\tself",{"2":{"131":1}}],["\\t",{"2":{"129":1}}],["\\tdef",{"2":{"129":1}}],["弹窗",{"2":{"129":1}}],["左边视图区域",{"2":{"129":1}}],["右边视图区域",{"2":{"129":1}}],["标题栏",{"2":{"129":1}}],["标签驱动",{"2":{"117":1}}],["标签驱动支持",{"2":{"66":1}}],["标签",{"2":{"66":1}}],["标签记录为",{"2":{"40":1}}],["标签可以无序",{"2":{"37":1}}],["标签化管理",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1}}],["进行编写",{"2":{"129":1}}],["进行分割",{"2":{"41":1}}],["按照",{"2":{"129":1}}],["按测试类型管理插件",{"0":{"124":1}}],["放置在对应的类里面",{"2":{"129":1}}],["设计思想",{"2":{"129":1}}],["设计模式",{"2":{"45":1,"103":1,"117":1}}],["依赖管理文件",{"0":{"135":1},"2":{"127":1}}],["调试用例驱动",{"0":{"136":1}}],["调试用例驱动脚本",{"2":{"127":1}}],["调用所有的断言语句",{"2":{"33":1}}],["调用方法时",{"2":{"12":1}}],["图像识别方法所需要的资源",{"2":{"127":1}}],["图片路径",{"2":{"34":2}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"123":1}}],["插槽",{"2":{"123":1}}],["插件如果已经安装",{"2":{"123":1}}],["插件",{"2":{"119":1}}],["插件汇总信息",{"0":{"98":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"122":1}}],["原生环境虚拟环境",{"2":{"60":1,"62":1,"63":2,"64":1,"65":1,"66":1,"67":1,"68":3,"73":1,"75":1,"78":1}}],["原生环境",{"0":{"50":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"122":1}}],["公共配置的形式",{"2":{"122":1}}],["显示的传入参数值",{"2":{"122":1}}],["采用虚拟环境管理依赖项",{"2":{"125":1}}],["采用命令行参数",{"2":{"122":1}}],["采用全新的架构设计",{"2":{"107":1}}],["解析测试策略",{"2":{"121":1}}],["解除跳过时将装饰器代码删掉",{"2":{"38":1}}],["获取命令行参数并结合配置项",{"2":{"121":1}}],["获取被装饰的类下所有函数",{"2":{"10":1}}],["驱动",{"2":{"121":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"121":1}}],["驱动执行管理",{"0":{"121":1}}],["驱动执行",{"2":{"64":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"128":1}}],["详细描述各模块工作方式",{"2":{"120":1}}],["详细设计",{"0":{"120":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1}}],["抛异常程序终止",{"2":{"119":1}}],["否则提示用户进行安装",{"2":{"119":1}}],["否则会提示无法连接",{"2":{"75":1}}],["底层功能",{"2":{"119":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"117":1}}],["让你可以专注于用例和方法的编写维护",{"2":{"45":1}}],["管理",{"2":{"117":1}}],["资源目录",{"2":{"117":1}}],["生成的用例工程遵循完整的",{"2":{"117":1}}],["路径驱动",{"2":{"117":1}}],["三方包的形式提供",{"2":{"117":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"117":1}}],["由于虚拟环境中也安装了",{"2":{"53":1}}],["由于需求变更",{"2":{"43":1}}],["总体方案",{"0":{"117":1}}],["互不影响",{"2":{"115":1}}],["提高",{"2":{"115":1}}],["提高用例开发效率",{"2":{"115":1}}],["提供一个",{"2":{"138":1}}],["提供可调用的配置对象config",{"2":{"127":1}}],["提供的一个全局对象",{"2":{"47":1}}],["提供灵活的前后钩子机制",{"2":{"13":1}}],["安全性稳定性更好",{"2":{"115":1}}],["安装",{"0":{"57":1,"92":1},"2":{"104":1}}],["降低使用门槛",{"2":{"115":1}}],["价值",{"2":{"115":1}}],["简化系统环境部署",{"2":{"115":1}}],["简介",{"0":{"100":1,"109":1}}],["搭配远程执行功能",{"2":{"115":1}}],["功能插件可插拔",{"2":{"117":1}}],["功能扩展性更好",{"2":{"115":1}}],["功能可插拔",{"2":{"115":1}}],["功能强大的自动化测试框架",{"2":{"114":1}}],["功能强大的日志工具",{"2":{"91":1}}],["极致轻量化",{"2":{"115":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"115":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"114":1}}],["更贴合大部分真实用户的使用场景",{"2":{"139":1}}],["更新",{"2":{"115":1}}],["更加纯粹",{"2":{"114":1}}],["更重要的是我们不想引入三方依赖",{"2":{"44":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"114":1}}],["业务流程有一些影响",{"2":{"114":1}}],["业务不同",{"2":{"107":1}}],["势必对现有公司自动化用例",{"2":{"114":1}}],["等等",{"2":{"114":1}}],["绑定了太多公司的业务",{"2":{"114":1}}],["导致框架代码容易被用户修改",{"2":{"114":1}}],["源代码暴露在用户面前",{"2":{"114":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"114":1}}],["每个应用存在一个唯一的出口文件",{"2":{"103":1}}],["每个机器执行",{"2":{"78":1}}],["每个模块建立一个",{"2":{"37":1}}],["每个用例的详细结果",{"2":{"6":1}}],["仍然存在一些不尽人意的地方",{"2":{"114":1}}],["小版本更新了数十个",{"2":{"114":1}}],["两个大版本",{"2":{"114":1}}],["两对大括号中的内容",{"2":{"12":1}}],["月在欧拉社区开源",{"2":{"114":1}}],["月正式在",{"2":{"114":1}}],["社区开源",{"2":{"114":1}}],["年",{"2":{"114":2}}],["年多的持续开发优化",{"2":{"114":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"114":1}}],["经过了",{"2":{"114":1}}],["旨在成为下一代",{"2":{"115":1}}],["旨在开发一个简单易用",{"2":{"114":1}}],["旨在提供",{"2":{"109":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"100":1}}],["做复杂步骤的封装",{"2":{"112":1}}],["里面导入使用",{"2":{"112":1}}],["里面的静态方法",{"2":{"94":2,"95":1}}],["里面的类方法",{"2":{"94":2}}],["里面的实例方法",{"2":{"94":2}}],["编写的",{"2":{"109":1}}],["大量人员都可以对其进行直接修改",{"2":{"107":1}}],["稳定性",{"2":{"107":2}}],["确保操作方法的一致性",{"2":{"107":1}}],["确认修复",{"0":{"42":1},"2":{"36":1,"37":1,"42":3,"43":1}}],["代码一致性",{"2":{"107":1}}],["代表不跳过",{"2":{"41":1}}],["代表跳过",{"2":{"41":1}}],["容易受到需求变更",{"2":{"107":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"107":1}}],["仅驱动执行这一条用例",{"2":{"63":1}}],["涵盖了",{"2":{"107":1}}],["范围覆盖很少",{"2":{"107":1}}],["范围",{"2":{"107":1}}],["内外部开发者们的认可",{"2":{"114":1}}],["内容",{"2":{"107":1}}],["内置支持的条件跳过对象",{"2":{"40":1}}],["二者属于两个时代",{"2":{"107":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"114":1}}],["有效性没有保障",{"2":{"107":1}}],["有效性",{"2":{"107":1}}],["有很大差异",{"2":{"107":1}}],["有何区别",{"0":{"107":1}}],["亦各从其志也",{"2":{"107":1}}],["道",{"2":{"107":1}}],["卫灵公",{"2":{"107":1}}],["论语",{"2":{"107":1}}],["孔子",{"2":{"107":1}}],["适合有离线部署需求的用户",{"2":{"115":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"106":1}}],["适用于气泡类的断言",{"2":{"34":1}}],["专门针对元素操作方法函数进行测试",{"2":{"106":1}}],["对象的属性值",{"2":{"122":1}}],["对纯",{"2":{"114":1}}],["对套件的测试",{"0":{"106":1}}],["对于用例规模比较大的应用",{"2":{"37":1}}],["鼓励内外部开发者贡献",{"2":{"105":1}}],["发布",{"2":{"104":1}}],["发布一个套件版本",{"2":{"104":2}}],["阶段",{"2":{"104":1}}],["套件里面保存元素的操作方法",{"2":{"106":1}}],["套件由专人主责维护",{"2":{"105":1}}],["套件维护",{"0":{"105":1}}],["套件通过",{"2":{"104":1}}],["套件持续保持更新",{"2":{"104":1}}],["套件分大版本发布",{"2":{"104":1}}],["套件发布",{"0":{"104":1}}],["遵循",{"2":{"103":1}}],["供外部用例调用",{"2":{"103":1}}],["下划线连接单词",{"2":{"103":1,"112":1}}],["下完美的键鼠工具",{"2":{"98":1}}],["方便用例开发者以",{"2":{"136":1}}],["方便安装",{"2":{"115":1}}],["方案说明",{"0":{"103":1,"112":1}}],["方法唯一出口类",{"2":{"127":1}}],["方法基类",{"2":{"127":1}}],["方法层按需导入框架提供的底层能力",{"2":{"129":1}}],["方法层",{"0":{"129":1}}],["方法层目录",{"2":{"127":1}}],["方法层基础代码自动生成",{"2":{"117":1}}],["方法层所有的函数",{"2":{"12":1}}],["方法代码",{"2":{"117":1}}],["方法增删改的详细数据",{"2":{"98":1}}],["方法里面仍然可以单独打印日志",{"2":{"95":1}}],["方法中输出其他的日志",{"0":{"95":1}}],["方法只能有一个入参",{"2":{"41":1}}],["方法必须有返回结果并且为布尔值",{"2":{"41":1}}],["方法名必须以",{"2":{"41":1}}],["方法编写规范",{"2":{"41":1}}],["方法明细",{"0":{"34":1}}],["方法库里面",{"2":{"12":1}}],["方法",{"2":{"10":1}}],["└──",{"2":{"102":4,"111":5,"127":3}}],["组装成自动化测试用例",{"2":{"100":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"103":1}}],["测试方法套件是一个独立项目",{"2":{"100":1}}],["测试单驱动插件",{"2":{"98":1}}],["测试单",{"2":{"73":1}}],["系统中各应用在",{"2":{"112":1}}],["系统中各应用划分自己的模块",{"2":{"103":1}}],["系统所有预装应用的测试用例",{"2":{"109":1}}],["系统所有预装应用的原子操作方法",{"2":{"107":1}}],["系统级测试用例",{"2":{"109":1}}],["系统自动化测试操作方法套件",{"2":{"100":1}}],["系统显示协议跳过",{"2":{"40":1}}],["全面插件化模块化",{"2":{"115":1}}],["全面优化框架接口调用机制",{"2":{"115":1}}],["全称",{"2":{"100":1}}],["全自动日志插件",{"2":{"98":1}}],["全自动日志",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1}}],["迁移工具",{"2":{"98":1}}],["相对位移元素定位方案的配置文件",{"2":{"127":1}}],["相对位移定位插件",{"2":{"98":1}}],["相册的用例文件为",{"2":{"37":1}}],["操作系统环境支持不够友好",{"2":{"114":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"100":1}}],["操作较为复杂",{"2":{"114":1}}],["操作或命令行操作",{"2":{"46":1}}],["操控插件",{"2":{"98":1}}],["键鼠操作插件",{"2":{"98":1}}],["✔️",{"2":{"98":14}}],["属性定位插件",{"2":{"98":1}}],["级别",{"2":{"97":1}}],["你可以配置为其他位置",{"2":{"97":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"50":1}}],["必要配置项",{"0":{"97":1}}],["终端输出",{"2":{"94":1,"95":1,"96":1}}],["终端输出的日志级别",{"2":{"11":1}}],["直接调用基类里面的方法",{"2":{"94":1}}],["我是",{"2":{"94":6,"95":1}}],["我们可以将界面分为四个区域",{"2":{"129":1}}],["我们想要设计开发一个更加简单易用",{"2":{"114":1}}],["我们需要建立对套件的自动化测试",{"2":{"106":1}}],["我们设计出了",{"2":{"9":1}}],["我们发现",{"2":{"9":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"130":1}}],["其中有一张图片识别成功即返回结果",{"2":{"34":1}}],["其他人可以提需求",{"2":{"105":1}}],["其他参数",{"0":{"90":1}}],["天天向上",{"2":{"88":2,"89":1}}],["天真",{"2":{"9":1}}],["客户端使用",{"0":{"85":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1}}],["客户端安装",{"0":{"84":1}}],["客户端",{"0":{"83":1},"1":{"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1}}],["客户端提供了一个简单易用的函数",{"2":{"79":1}}],["写入以下内容",{"2":{"82":1}}],["名称你可以自定义",{"2":{"82":1}}],["随意新建一个py文件",{"2":{"82":1}}],["封装的",{"2":{"79":1,"100":1}}],["个机器瓜分",{"2":{"78":1}}],["个测试机",{"2":{"78":1}}],["个组",{"2":{"77":1}}],["都同时执行",{"2":{"78":1}}],["都不需要再写日志代码",{"2":{"12":1}}],["条",{"2":{"78":2}}],["条用例",{"2":{"78":2}}],["条件判断组合",{"2":{"41":1}}],["条件判断跳过",{"0":{"40":1}}],["假设总共",{"2":{"78":1}}],["同事们",{"2":{"114":1}}],["同样可以进行配置修改",{"2":{"97":1}}],["同一组内瓜分执行",{"2":{"78":1}}],["同时定义一些用例工程相关的配置",{"2":{"132":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"123":1}}],["同时对各功能进行插件化",{"2":{"115":1}}],["同时选择多个环境",{"2":{"57":1}}],["同时标记了skip",{"2":{"42":1}}],["规则概述",{"2":{"78":1}}],["一键生成用例工程模板代码",{"2":{"117":1}}],["一些底层模块或接口命名不优雅",{"2":{"114":1}}],["一对大括号表示一个组",{"2":{"77":1}}],["一个元素一个方法",{"2":{"129":1}}],["一个页面一个类",{"2":{"129":1}}],["一个简单易用",{"2":{"91":1}}],["一个应用含有大量的操作函数",{"2":{"9":1}}],["一个函数里面至少包含一条日志信息",{"2":{"9":1}}],["分组规则",{"0":{"77":1}}],["分割",{"2":{"47":1}}],["服务的",{"2":{"98":1}}],["服务的图像识别插件",{"2":{"98":1}}],["服务的方式提供出来",{"2":{"46":1}}],["服务端启动服务",{"0":{"82":1}}],["服务端安装",{"0":{"81":1}}],["服务端",{"0":{"80":1},"1":{"81":1,"82":1}}],["服务",{"2":{"75":1,"79":1}}],["开发",{"2":{"107":1}}],["开启",{"2":{"75":1}}],["开头",{"2":{"41":1}}],["开头的",{"2":{"11":1}}],["集合写入",{"2":{"73":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"98":1}}],["将用例",{"2":{"73":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"38":1}}],["案例",{"0":{"72":1},"1":{"73":1}}],["如",{"2":{"70":1,"71":1,"117":1,"132":1}}],["如果一个页面元素操作比较多",{"2":{"129":1}}],["如果一个应用存在多个页面",{"2":{"129":1}}],["如果涉及到复杂步骤的封装",{"2":{"112":1}}],["如果要修改识别语言",{"2":{"90":1}}],["如果存在多个",{"2":{"88":1}}],["如果你想修改端口",{"2":{"82":1}}],["如果你想执行这个",{"2":{"63":1}}],["如果应用受到新需求影响需要跳过",{"2":{"39":1}}],["如果不传默认截取全屏识别",{"2":{"34":1}}],["如果不传参",{"2":{"34":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"34":1}}],["如果比较复杂操作步骤",{"2":{"9":1}}],["会自动加载并执行",{"2":{"70":1,"71":1}}],["会自动生成一个命令",{"2":{"50":1,"51":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"140":1}}],["支持对各种测试策略的驱动执行",{"2":{"138":1}}],["支持对依赖环境进行一键打包",{"2":{"125":1}}],["支持用例目录或文件路径驱动执行",{"2":{"121":1}}],["支持基于关键词驱动用例执行",{"2":{"121":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"121":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"121":1}}],["支持本地和远程执行模式",{"2":{"121":1}}],["支持多种用例驱动模式",{"2":{"117":1}}],["支持非开发者下运行",{"2":{"115":1}}],["支持离线部署",{"2":{"115":1}}],["支持在非开发着环境下运行用例",{"2":{"139":1}}],["支持在",{"2":{"69":1}}],["支持类名包含",{"2":{"11":1}}],["支持类名以",{"2":{"11":2}}],["加引号",{"2":{"68":1}}],["加上装饰器",{"2":{"12":1}}],["批量用例id驱动执行",{"0":{"67":1}}],["特有的",{"2":{"66":1}}],["特殊标签",{"2":{"37":1}}],["表达式",{"2":{"65":1,"66":1}}],["表示返回识别到的第一个",{"2":{"90":1}}],["表示用例的id",{"2":{"37":1}}],["表示识别任意一个目标字符",{"2":{"34":1}}],["表示识别所有目标字符",{"2":{"34":1}}],["关键词驱动等等",{"2":{"117":1}}],["关键词驱动支持",{"2":{"65":1}}],["关键词可以是用例对象中的任意字符",{"2":{"65":1}}],["整体数据流",{"0":{"119":1}}],["整体结构",{"0":{"2":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"65":1}}],["且有完善的单元测试机制",{"2":{"107":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"107":1}}],["且大小写不敏感",{"2":{"65":1}}],["且要方便能使用",{"2":{"44":1}}],["根据标签执行",{"0":{"66":1}}],["根据关键词执行",{"0":{"65":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"57":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"21":1}}],["│\\t└──",{"2":{"64":1}}],["│\\t├──",{"2":{"64":1}}],["│",{"2":{"64":5,"102":5,"111":22,"127":12}}],["指定某张图片查找某个字符串的坐标",{"0":{"89":1}}],["指定某张图片识别的所有文字内容",{"0":{"87":1}}],["指定某个目录执行",{"0":{"64":1}}],["指定用例目录",{"2":{"68":1}}],["指定用例文件",{"2":{"68":1}}],["指定用例文件路径执行",{"0":{"68":1}}],["指定执行某一个用例",{"0":{"63":1}}],["本地执行子命令为",{"2":{"60":1}}],["本地执行",{"0":{"59":1},"1":{"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1}}],["本机命令行交互",{"0":{"24":1},"1":{"25":1,"26":1,"27":1}}],["基类",{"2":{"94":3}}],["基础环境默认支持",{"2":{"57":1}}],["基础环境guiwebuihttpremote",{"2":{"57":1}}],["基于此",{"2":{"9":1}}],["基于",{"2":{"9":1,"66":1,"79":1,"98":3}}],["快速开始",{"0":{"56":1},"1":{"57":1,"58":1}}],["无限可能",{"2":{"55":1}}],["🤙️",{"2":{"55":1}}],["接口自动化测试",{"2":{"55":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"46":1}}],["🔥",{"2":{"98":1}}],["🚧",{"2":{"98":3}}],["🕷️",{"2":{"55":1}}],["🚀",{"2":{"55":1}}],["🚌",{"2":{"55":1}}],["💻",{"2":{"55":1}}],["🌏",{"2":{"55":1}}],["桌面应用",{"2":{"55":1}}],["☑",{"2":{"55":6}}],["能满足公司对自动化测试的业务需求",{"2":{"114":1}}],["能做什么",{"0":{"55":1}}],["能不能基于框架执行时",{"2":{"9":1}}],["$",{"2":{"53":1}}],["v25",{"2":{"104":1}}],["v20",{"2":{"104":2}}],["video",{"2":{"98":1}}],["virtualenv",{"2":{"53":1}}],["values",{"2":{"34":3}}],["删除虚拟环境",{"2":{"51":1}}],["激活虚拟环境",{"2":{"51":1}}],["命令安装使用",{"2":{"104":1}}],["命令可以将当前的虚拟环境删除",{"2":{"54":1}}],["命令",{"2":{"51":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"122":1}}],["命令行自动化",{"2":{"57":1}}],["命令行自动化测试",{"2":{"55":1}}],["命令行",{"2":{"47":1}}],["命令行传递参数",{"2":{"42":1}}],["命令行交互",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"119":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"117":1}}],["执行策略",{"0":{"78":1}}],["执行前确保远程机器已经开启了",{"2":{"75":1}}],["执行命令",{"2":{"73":1}}],["执行包含关键词的用例",{"2":{"65":1}}],["执行所有用例",{"0":{"62":1}}],["执行之后会自动创建一些有用的命令",{"2":{"51":1}}],["执行的时候会自动输出",{"2":{"12":1}}],["子命令",{"0":{"60":1,"75":1},"2":{"51":1}}],["还可以进行环境的管理",{"2":{"51":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"125":1}}],["虚拟环境",{"0":{"51":1},"1":{"52":1,"53":1,"54":1}}],["种方式传入",{"2":{"47":1}}],["机器信息有",{"2":{"47":1}}],["它不能脱离",{"2":{"107":1}}],["它除了可以驱动用例执行",{"2":{"51":1}}],["它保存了远程测试机的信息列表",{"2":{"47":1}}],["它继承了",{"2":{"33":1}}],["交互的基础能力",{"2":{"46":1}}],["远程测试机分组策略",{"0":{"76":1},"1":{"77":1,"78":1}}],["远程机器执行的用例相同",{"2":{"75":1}}],["远程执行使用子命令",{"2":{"75":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"75":1}}],["远程执行",{"0":{"74":1},"1":{"75":1,"76":1,"77":1,"78":1}}],["远程交互式控制",{"0":{"46":1},"1":{"47":1,"48":1,"49":1}}],["远程命令行交互",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["创建一个目录",{"2":{"45":1,"58":1}}],["创建用例工程",{"0":{"58":1},"2":{"45":1}}],["工程结构",{"0":{"102":1,"111":1}}],["工程设计",{"0":{"101":1,"110":1},"1":{"102":1,"103":1,"111":1,"112":1}}],["工程遵循完整的",{"2":{"45":1}}],["工程自有断言模块",{"2":{"33":1}}],["脚手架工具",{"0":{"45":1}}],["脚本文件id",{"2":{"36":1,"37":1,"39":1,"40":1}}],["脚本一样即可",{"2":{"16":1,"19":1}}],["打开进行编辑查看",{"2":{"44":1}}],["此配置文件需要维护大量的标签数据",{"2":{"44":1}}],["此时会抛异常",{"2":{"123":1}}],["此时",{"2":{"37":1}}],["已废弃",{"2":{"43":1}}],["已修复",{"2":{"42":2,"43":1}}],["废弃原因",{"2":{"43":1}}],["废弃用例是特殊的标签",{"2":{"37":1}}],["废弃用例",{"0":{"43":1},"2":{"36":1,"43":2}}],["该列存在",{"2":{"43":1}}],["环境依赖管理",{"0":{"125":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"117":1}}],["环境依赖可以一键打包交付",{"2":{"115":1}}],["环境以提供",{"2":{"46":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"43":1}}],["环境信息",{"2":{"3":1}}],["针对某些用例",{"2":{"43":1}}],["针对于某些用例修复后",{"2":{"42":1}}],["yes",{"2":{"42":2}}],["youqu2",{"0":{"107":1},"2":{"98":1,"107":4,"114":3,"115":1}}],["youqu",{"0":{"70":1,"71":1},"2":{"47":1,"66":1,"69":2,"70":2,"71":2,"73":3,"98":9,"114":1}}],["youqu3",{"0":{"52":1,"53":1,"54":1,"55":1,"98":1,"113":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"9":2,"12":2,"13":1,"21":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"32":1,"33":3,"34":10,"45":1,"46":1,"49":1,"50":2,"51":5,"52":1,"53":5,"54":1,"57":6,"58":1,"60":2,"62":2,"63":4,"64":2,"65":2,"66":2,"67":2,"68":6,"69":1,"70":1,"71":1,"75":2,"78":2,"98":3,"100":1,"107":2,"109":1,"112":1,"114":1,"115":1,"117":1,"119":2,"121":1,"122":1,"126":1,"129":1,"131":2,"132":1}}],["you",{"2":{"16":1,"19":1}}],["中间件",{"2":{"123":1}}],["中用例增删改",{"2":{"98":1}}],["中文",{"2":{"90":1}}],["中同时填入后",{"2":{"42":1}}],["中的任意一个",{"2":{"34":1}}],["当传入要查找的字符串时",{"2":{"90":1}}],["当系统中安装了",{"2":{"50":1,"51":1}}],["当",{"2":{"42":1}}],["固定填入字段为",{"2":{"42":1}}],["固定跳过",{"0":{"39":1}}],["作为父类被",{"2":{"131":1}}],["作为标记该用例是否已经修复",{"2":{"42":1}}],["作为变量输出出来了",{"2":{"12":1}}],["新增一列标签名为",{"2":{"42":1}}],["但若用例层调用了此插件提供的功能",{"2":{"123":1}}],["但",{"2":{"114":1}}],["但仍然想要跳过用例",{"2":{"42":1}}],["但不能立即删除跳过原因",{"2":{"42":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"37":1}}],["推荐统一使用",{"2":{"41":1}}],["连接符号不可使用下划线和逗号",{"2":{"41":1}}],["连接服务器重试次数",{"2":{"34":1}}],["若插件没有被安装",{"2":{"123":1}}],["若插件已经安装",{"2":{"119":1}}],["若需要多个",{"2":{"41":1}}],["若函数需要多个参数",{"2":{"41":1}}],["若是",{"2":{"40":1}}],["重要",{"2":{"41":1}}],["重试间隔时间",{"2":{"34":1}}],["截取的左侧字符串作为函数名",{"2":{"41":1}}],["截取屏幕图片的间隔时间",{"2":{"34":1}}],["截取屏幕图片的时间",{"2":{"34":1}}],["korean",{"2":{"90":1}}],["k",{"2":{"63":4,"64":2,"65":2}}],["klvvw5821",{"2":{"40":1}}],["klvv",{"2":{"40":1}}],["keywords",{"0":{"71":1},"2":{"6":1,"69":1,"71":2}}],["符号将两个方法分开",{"2":{"41":1}}],["符号",{"2":{"40":1,"41":1}}],["剔除中横线和",{"2":{"40":1}}],["型号",{"2":{"40":1}}],["查看机器的",{"2":{"40":1}}],["查找图片",{"2":{"12":2}}],["说明",{"2":{"40":1,"51":1}}],["则正常调用",{"2":{"119":1}}],["则返回一个字典",{"2":{"88":1}}],["则用例不会执行",{"2":{"43":1}}],["则用例不执行",{"2":{"41":1}}],["则新增一列标签名为",{"2":{"43":1}}],["则代码不会执行该条用例",{"2":{"42":1}}],["则执行该用例",{"2":{"41":1}}],["则跳过用例不执行",{"2":{"40":1}}],["则在此列备注具体的跳过原因",{"2":{"39":1}}],["或者",{"2":{"40":1}}],["判断当前架构是否为",{"2":{"40":1}}],["拼接",{"2":{"40":1}}],["多个用例文件",{"2":{"68":1}}],["多个机器信息用",{"2":{"47":1}}],["多个架构之间使用",{"2":{"40":1}}],["多个参数以逗号隔开",{"2":{"11":3}}],["架构设计",{"0":{"116":1,"118":1},"1":{"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1}}],["架构设计规划",{"0":{"113":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["架构不跳过",{"2":{"40":1}}],["架构跳过",{"2":{"40":1}}],["架构名",{"2":{"40":1}}],["架构动态等待",{"0":{"21":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"40":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"40":1}}],["参数",{"2":{"40":2}}],["参数值可以传递任意命令行命令",{"2":{"16":1,"19":1}}],["最后所有的用例类均继承",{"2":{"131":1}}],["最终的用例状态会被标签为",{"2":{"39":1}}],["最大匹配次数",{"2":{"34":1}}],["最大匹配超时",{"2":{"34":1}}],["受到某新需求影响",{"2":{"39":1,"42":1,"43":1}}],["各模块编写思路",{"0":{"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1}}],["各功能以插件的方式接入",{"2":{"117":1}}],["各种代码风格不统一",{"2":{"107":1}}],["各种用例标签",{"2":{"39":1,"40":1,"42":1,"43":1}}],["各架构倍数",{"2":{"21":1}}],["示例",{"2":{"39":1,"40":1,"42":1}}],["而通过",{"2":{"38":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"38":1}}],["传统的日志输出方式",{"2":{"9":1}}],["跳过对象",{"2":{"40":1}}],["跳过的原因标签为",{"2":{"40":1}}],["跳过的原因统一标签开头为",{"2":{"39":1}}],["跳过用例可以直接通过修改",{"2":{"133":1}}],["跳过用例",{"0":{"38":1},"1":{"39":1,"40":1,"41":1}}],["跳过原因一栏中填写为",{"2":{"40":1}}],["跳过原因",{"2":{"36":1,"37":1,"38":1,"39":1,"40":1,"42":2,"43":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"114":1}}],["因此我们大胆的设想",{"2":{"9":1}}],["因此",{"2":{"106":1,"107":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"53":1}}],["因此若",{"2":{"37":1}}],["目标",{"0":{"115":1}}],["目标字符",{"2":{"34":1}}],["目录之间用空格分割",{"2":{"68":1}}],["目录组合",{"2":{"68":1}}],["目录下划分自己的用例模块",{"2":{"112":1}}],["目录下所有用例",{"2":{"64":1}}],["目录下",{"2":{"37":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"129":1}}],["所有的方法按照",{"2":{"129":1}}],["所有的元素操作方法",{"2":{"103":1}}],["所有代码由专人维护",{"2":{"107":1}}],["所有方法以类的形式编写",{"2":{"103":1}}],["所有",{"2":{"37":1}}],["建议分模块",{"2":{"37":1}}],["比如",{"2":{"40":1,"41":1,"50":1,"65":1,"82":1,"104":2,"114":1,"129":2}}],["比如文件管理器",{"2":{"37":1}}],["比如气泡在1秒内消失",{"2":{"34":1}}],["后面会详细讲到",{"2":{"37":1}}],["后置命令行入参钩子",{"0":{"19":1}}],["后置脚本钩子",{"0":{"18":1}}],["后置钩子",{"0":{"17":1},"1":{"18":1,"19":1}}],["列之后的所有列都是一个用例标签",{"2":{"37":1}}],["列为",{"2":{"37":1}}],["第",{"2":{"37":1}}],["也可以对这个页面做进一步划分",{"2":{"129":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"125":1}}],["也可以是传统的",{"2":{"66":1}}],["也可以是自定义的数字代表用例序号",{"2":{"37":1}}],["也得到了公司领导",{"2":{"114":1}}],["也能自动打印",{"2":{"94":1}}],["也会正常执行",{"2":{"42":1}}],["也就是说我们需要写大量的日志代码",{"2":{"9":1}}],["举例",{"2":{"37":1}}],["取中间的名称作为",{"2":{"37":1}}],["去掉用例序号后的字符串",{"2":{"37":1}}],["quot",{"2":{"37":2,"57":2,"65":2,"67":2}}],["以便方法或用例中能够获取到",{"2":{"132":1}}],["以此控制虚拟环境创建",{"2":{"134":1}}],["以此来获取框架已有的公共配置",{"2":{"132":1}}],["以此类推",{"2":{"104":1}}],["以插件的形式提供功能",{"2":{"115":1}}],["以下简称测试用例",{"2":{"109":1}}],["以下简称测试方法套件",{"2":{"100":1}}],["以保持套件的各方面一致性",{"2":{"105":1}}],["以上写法表示有",{"2":{"77":1}}],["以",{"2":{"37":1,"115":1}}],["使用更简单方便",{"2":{"115":1}}],["使用的框架不同",{"2":{"107":1}}],["使用框架的后置钩子触发结果回填到",{"2":{"73":1}}],["使用框架的前置钩子触发爬取动作生成",{"2":{"73":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"65":1,"67":1}}],["使用脚手架功能创建用例工程",{"2":{"45":1,"58":1}}],["使用子命令",{"2":{"45":1}}],["使用",{"2":{"40":1,"41":1,"104":1,"117":1}}],["使用说明",{"0":{"36":1}}],["使用方法很简单",{"2":{"12":1}}],["使用方法",{"0":{"12":1,"93":1},"1":{"94":1,"95":1,"96":1}}],["+",{"2":{"34":2,"40":1,"122":1}}],["`japan`",{"2":{"34":1}}],["`korean`",{"2":{"34":1}}],["`german`",{"2":{"34":1}}],["`fr`",{"2":{"34":1}}],["`en`",{"2":{"34":1}}],["`ch`",{"2":{"34":1}}],["返回原始数据",{"2":{"90":1}}],["返回当前屏幕中",{"2":{"88":1}}],["返回识别图片",{"2":{"87":1}}],["返回识别到的所有数据",{"2":{"34":1}}],["返回",{"2":{"41":2}}],["返回图片中识别到的所有字符串",{"2":{"34":1}}],["只需要在这里挂一个装饰器",{"2":{"94":1,"95":1,"96":1}}],["只需要在出口文件加上类装饰器",{"2":{"12":1}}],["只需要加一个装饰器",{"2":{"91":1}}],["只返回第一个",{"2":{"34":1,"90":1}}],["要识别的图片路径",{"2":{"34":1}}],["要识别的模板图片",{"2":{"34":1}}],["并提示用户安装对应插件",{"2":{"123":1}}],["并根据需要将测试结果",{"2":{"119":1}}],["并动态加载",{"2":{"119":1}}],["并在系统关键节点发布对应的版本",{"2":{"104":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"41":1}}],["并返回其在图片中的坐标",{"2":{"34":1}}],["并且所有调用的方法会以",{"2":{"12":1}}],["识别插件",{"2":{"98":1}}],["识别语言",{"2":{"90":1}}],["识别当前屏幕的所有文字内容",{"0":{"86":1}}],["识别一个字符串或多个字符串",{"2":{"34":1}}],["识别率",{"2":{"34":1}}],["结果",{"2":{"34":2}}],["结尾的",{"2":{"11":1}}],["预期值",{"2":{"34":4}}],["不需要修改用例脚本",{"2":{"133":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"124":1}}],["不再提供",{"2":{"122":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"115":1}}],["不适合对外开源发布",{"2":{"107":1}}],["不涉及用例逻辑",{"2":{"107":1}}],["不受需求变更影响",{"2":{"107":1}}],["不兼容",{"2":{"107":1}}],["不相为谋",{"2":{"107":1}}],["不同",{"2":{"107":1}}],["不同组之间相同执行",{"2":{"78":1}}],["不做复杂步骤的封装",{"2":{"103":1}}],["不存在复杂步骤的堆叠封装",{"2":{"107":1}}],["不存在",{"2":{"34":2}}],["不显示",{"2":{"5":1}}],["存在跳过标签则用例也不会被执行",{"2":{"39":1}}],["存在",{"2":{"34":2}}],["应用名字",{"2":{"34":2}}],["元素不应该存在",{"2":{"34":1}}],["元素不存在",{"2":{"34":1}}],["元素识别动态等待",{"0":{"22":1}}],["匹配度",{"2":{"34":1,"90":1}}],["匹配元素的格式",{"2":{"34":2}}],["匹配相似度",{"2":{"34":2}}],["是在",{"2":{"107":1}}],["是不同的测试方法套件版本",{"2":{"104":1}}],["是基于",{"2":{"100":1,"107":1,"109":1}}],["是",{"2":{"47":1,"114":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"37":1}}],["是否递归查找",{"2":{"34":1}}],["是类装饰器",{"2":{"12":1}}],["断言",{"0":{"131":1}}],["断言方法类",{"2":{"127":1}}],["断言资源",{"2":{"127":1}}],["断言文案不存在",{"2":{"34":1}}],["断言文案存在",{"2":{"34":1}}],["断言文件不存在",{"2":{"34":1}}],["断言文件存在",{"2":{"34":1}}],["断言结果为假",{"2":{"34":1}}],["断言结果为真",{"2":{"34":1}}],["断言不相等",{"2":{"34":1}}],["断言相等",{"2":{"34":1}}],["断言应用进程不存在",{"2":{"34":1}}],["断言应用进程状态",{"2":{"34":4}}],["断言应用进程存在",{"2":{"34":1}}],["断言元素不存在",{"2":{"34":1}}],["断言元素存在",{"2":{"34":1}}],["断言语句",{"0":{"32":1},"1":{"33":1,"34":1}}],["~",{"2":{"34":2,"87":1,"89":1}}],["文件来控制用例是否跳过",{"2":{"133":1}}],["文件来管理跳过用例则会方便很多",{"2":{"38":1}}],["文件里面写关键词的表达式",{"2":{"71":1}}],["文件里面写标签的表达式",{"2":{"70":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"39":1}}],["文件管理的标签",{"2":{"66":1}}],["文件管理器",{"2":{"49":1,"129":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"44":1}}],["文件格式",{"0":{"44":1}}],["文件中定义用例对象的标签",{"2":{"133":1}}],["文件中自定义用例集驱动执行",{"2":{"69":1}}],["文件中所有的用例",{"2":{"63":1}}],["文件中查找是否有同名函数",{"2":{"41":1}}],["文件中",{"2":{"40":1}}],["文件中新增一列为",{"2":{"38":1}}],["文件中写入标签",{"2":{"36":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"37":1}}],["文件建议放在一个",{"2":{"37":1}}],["文件",{"2":{"37":1,"70":1,"71":1,"73":2}}],["文件的文件名",{"2":{"37":1}}],["文件去掉首字符串",{"2":{"37":1}}],["文件存在",{"2":{"34":1}}],["文件名称",{"2":{"65":1}}],["文件名就应为",{"2":{"37":1}}],["文件名",{"2":{"34":1}}],["文件全路径",{"2":{"34":1}}],["文件全路径或目录",{"2":{"34":1}}],["文件不存在",{"2":{"34":1}}],["文管方法库出口",{"2":{"12":1}}],["期望结果",{"2":{"34":2}}],["期望元素不存在",{"2":{"34":1}}],["期望元素存在",{"2":{"34":1}}],["期望不存在文件路径",{"2":{"34":1}}],["期望存在文件路径",{"2":{"34":1}}],["期望界面不存在模板图片",{"2":{"34":1}}],["期望界面存在模板图片",{"2":{"34":1}}],["屏幕上匹配不存在图片",{"2":{"34":1}}],["屏幕上匹配图片",{"2":{"34":2}}],["默认环境变量管理文件",{"0":{"134":1},"2":{"127":1}}],["默认日志输出级别为",{"2":{"97":1}}],["默认是在",{"2":{"97":1}}],["默认情况下是会将识别到的多个目标组装成字典返回",{"2":{"90":1}}],["默认端口号为",{"2":{"82":1}}],["默认值为",{"2":{"34":1}}],["默认为false",{"2":{"90":1}}],["默认为0",{"2":{"90":1}}],["默认为ch",{"2":{"90":1}}],["默认为",{"2":{"34":1}}],["默认不间隔",{"2":{"34":1}}],["默认关闭",{"2":{"5":1}}],["单位秒",{"2":{"34":3}}],[">不为假",{"2":{"34":1}}],[">不为真",{"2":{"34":1}}],[">不相等",{"2":{"34":2}}],[">是否相等",{"2":{"34":2}}],[">与实际值",{"2":{"34":4}}],[">",{"2":{"34":7}}],[">=",{"2":{"34":3}}],["例",{"2":{"34":3}}],["例如",{"2":{"9":1,"34":1,"40":1}}],["on",{"2":{"129":1,"130":1}}],["only",{"2":{"34":1}}],["or",{"2":{"34":1,"65":1,"66":3,"67":9,"70":2,"71":2}}],["ocr",{"2":{"34":4,"79":1,"82":2,"86":3,"87":1,"88":1,"89":1,"90":4,"98":1}}],["os",{"2":{"34":5}}],["outcome",{"2":{"6":1}}],["8888",{"2":{"82":1,"86":1}}],["8890",{"2":{"82":1}}],["8",{"0":{"136":1},"2":{"34":1,"49":1,"94":1,"95":1,"96":1,"98":1,"114":1}}],["继承了",{"2":{"131":1}}],["继承了基类baselog",{"2":{"94":1,"95":1,"96":1}}],["继承",{"2":{"33":1,"131":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"140":1}}],["用户只需要关注用例",{"2":{"117":1}}],["用户可直接通过",{"2":{"104":1}}],["用于用例开发调试过程中",{"2":{"136":1}}],["用于统一存放用例步骤的操作方法",{"2":{"129":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"121":1}}],["用于虚拟环境安装",{"2":{"51":1}}],["用于属性定位相关操作",{"2":{"49":1}}],["用于保存用例标签",{"2":{"37":1}}],["用例标签管理文件",{"0":{"133":1},"2":{"127":1}}],["用例标签化管理插件",{"2":{"98":1}}],["用例示例",{"2":{"127":2}}],["用例工程配置对象继承",{"2":{"132":1}}],["用例工程配置模块建议继承",{"2":{"122":1}}],["用例工程的断言方法类",{"2":{"131":1}}],["用例工程名称",{"2":{"127":1}}],["用例工程结构",{"0":{"127":1}}],["用例工程支持一键创建",{"2":{"126":1}}],["用例工程设计",{"0":{"126":1},"1":{"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1}}],["用例层负责管理用例逻辑",{"2":{"130":1}}],["用例层目录",{"2":{"127":1}}],["用例层",{"0":{"130":1},"2":{"117":1}}],["用例层直接",{"2":{"117":1}}],["用例整体打包交付之后",{"2":{"115":1}}],["用例开发环境下更新版本不方便",{"2":{"114":1}}],["用例失败录屏插件",{"2":{"98":1}}],["用例文件",{"2":{"68":1}}],["用例驱动方式",{"0":{"61":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1}}],["用例执行所需要的资源",{"2":{"127":1}}],["用例执行完成后生成多种测试报告",{"2":{"119":1}}],["用例执行过程中动态调用",{"2":{"119":1}}],["用例执行驱动的命令",{"2":{"51":1}}],["用例执行时判断",{"2":{"39":1}}],["用例需要废弃",{"2":{"43":1}}],["用例id",{"2":{"42":1,"43":1}}],["用例脚本的",{"2":{"37":1}}],["用例中所需要的方法从",{"2":{"112":1}}],["用例中通过",{"2":{"33":1}}],["用例中使用方法",{"0":{"33":1}}],["用例基类",{"2":{"33":2,"127":1}}],["用两对大括号把函数的参数括起来",{"2":{"12":1}}],["几乎满足了所有的断言场景",{"2":{"32":1}}],["自定义执行",{"0":{"69":1},"1":{"70":1,"71":1,"72":1,"73":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"41":1}}],["自定义跳过",{"0":{"41":1}}],["自定义断言类",{"2":{"34":1}}],["自带多种断言语句",{"2":{"32":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"124":1}}],["自动统计分析每次",{"2":{"98":1}}],["自动化插件",{"2":{"98":1}}],["自动化测试框架",{"2":{"115":1}}],["自动化测试框架操作方法封装写法",{"2":{"9":1}}],["自动化测试用例",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1},"2":{"109":1}}],["自动化测试方法套件",{"0":{"99":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1},"2":{"100":1}}],["自动化测试模块",{"2":{"98":1}}],["自动化测试",{"2":{"55":2}}],["自动输出日志的类名称",{"2":{"97":1}}],["自动输出日志",{"0":{"94":1}}],["自动输出的日志",{"2":{"12":1}}],["自动识别当前整个屏幕的所有内容",{"2":{"86":1}}],["自动将函数说明打印为日志",{"2":{"11":3}}],["自动的将函数说明作为日志打印出来",{"2":{"9":1}}],["umtk",{"0":{"99":1,"107":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1},"2":{"100":1,"102":1,"103":1,"104":2,"107":4,"109":1,"112":2}}],["ut001234",{"2":{"73":4}}],["utf",{"2":{"34":1,"94":1,"95":1,"96":1}}],["ui操作远程对象",{"0":{"48":1},"1":{"49":1}}],["ui",{"2":{"46":2,"55":2,"98":1,"111":1,"127":1}}],["union",{"2":{"34":3}}],["uniontech",{"2":{"34":1,"94":1,"95":1,"96":1}}],["usable",{"2":{"98":1}}],["usr",{"2":{"34":1,"94":1,"95":1,"96":1}}],["user4",{"2":{"77":2,"78":2}}],["user3",{"2":{"77":2,"78":2}}],["user2",{"2":{"77":2,"78":2}}],["user1",{"2":{"77":2,"78":2}}],["user=",{"2":{"49":1}}],["user=user",{"2":{"49":1}}],["user",{"2":{"29":1,"30":1,"31":1,"49":1,"73":4,"97":1}}],["username",{"2":{"27":1}}],["uos",{"0":{"99":1,"108":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1},"2":{"12":1,"49":1,"100":4,"107":1,"109":3}}],["普通权限执行",{"0":{"25":1,"29":1}}],["增加了等待的日志",{"2":{"21":1}}],["优化",{"2":{"21":1}}],["可实现群控测试机执行",{"2":{"115":1}}],["可视化配置",{"0":{"138":1},"2":{"115":1}}],["可视化驱动",{"2":{"98":1}}],["可定制化依赖",{"2":{"115":1}}],["可能存在当前屏幕中有多个目标",{"2":{"90":1}}],["可能包含多条日志信息",{"2":{"9":1}}],["可自定义多个参数之间的连接符",{"2":{"41":1}}],["可以通过系统环境变量或修改",{"2":{"122":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"115":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"117":1}}],["可以在无网络环境下直接运行",{"2":{"115":1}}],["可以在方法层",{"2":{"112":1}}],["可以对外开源发布",{"2":{"107":1}}],["可以调用",{"2":{"103":1}}],["可以修改为从0到1的数",{"2":{"90":1}}],["可以自动安装对应的依赖集",{"2":{"57":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"52":1}}],["可以激活虚拟环境",{"2":{"53":1}}],["可以随意新增",{"2":{"37":1}}],["可以完全代替之前这样的写法",{"2":{"21":1}}],["german",{"2":{"90":1}}],["get",{"2":{"34":3}}],["getmembers",{"2":{"10":1}}],["group2",{"2":{"77":1,"78":1}}],["group1",{"2":{"77":1,"78":2}}],["group",{"2":{"77":1}}],["gui",{"2":{"34":7,"49":3,"57":2,"98":1,"112":1}}],["gpl",{"2":{"34":1}}],["github",{"2":{"79":1,"91":1}}],["git",{"2":{"16":1,"19":1,"98":1,"117":1}}],["home",{"2":{"97":1}}],["html",{"2":{"98":2}}],["https",{"2":{"79":1,"91":1}}],["http",{"2":{"55":1,"57":1}}],["htop",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["h",{"2":{"50":1}}],["has",{"2":{"7":1}}],["就能自动日志输出类里面所有的方法的功能说明",{"2":{"91":1}}],["就像写",{"2":{"16":1,"19":1}}],["就可以实现自动输出日志了",{"2":{"12":1}}],["入参",{"2":{"16":1,"19":1}}],["├──",{"2":{"15":3,"18":3,"64":4,"102":9,"111":19,"127":17}}],["框架预设一些文件接口规范",{"2":{"140":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"124":1}}],["框架的断言库",{"2":{"33":1}}],["框架可以正常运行",{"2":{"123":1}}],["框架底层对各功能插件提供",{"2":{"123":1}}],["框架总线接口",{"0":{"123":1}}],["框架提供驱动命令",{"2":{"121":1}}],["框架提供驱动执行的命令",{"2":{"117":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"119":1}}],["框架也提供初始化用例工程的功能",{"2":{"117":1}}],["框架源代码不直接呈现在用户面前",{"2":{"117":1}}],["框架代码及插件库以",{"2":{"117":1}}],["框架层提供总线服务",{"2":{"117":1}}],["框架和插件库独立维护更新",{"2":{"115":1}}],["框架而独立使用",{"2":{"107":1}}],["框架自动加载并执行对应标签的用例",{"2":{"73":1}}],["框架会在用例执行之前执行",{"2":{"16":1,"19":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"15":1,"18":1}}],["框架支持通过",{"2":{"16":1,"19":1}}],["框架默认生成",{"2":{"0":1}}],["前置命令行入参钩子",{"0":{"16":1}}],["前置脚本钩子",{"0":{"15":1}}],["前置钩子",{"0":{"14":1},"1":{"15":1,"16":1}}],["前后钩子",{"0":{"13":1},"1":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"100":1}}],["这是在类外面打",{"2":{"96":3}}],["这是我想再输出的其他",{"2":{"95":3}}],["这个命令可以在系统原生环境中使用",{"2":{"51":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"131":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"12":1}}],["这样这条用例即使同时标记了",{"2":{"42":1}}],["这种方式需要修改用例代码",{"2":{"38":1}}],["这就是我们参考django",{"2":{"12":1}}],["japan",{"2":{"90":1}}],["job",{"2":{"15":2,"16":3,"18":2,"19":3,"73":4}}],["jinja2",{"2":{"12":1}}],["json",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":3,"2":1,"3":1,"4":1,"6":1,"7":1}}],["和上面逻辑相反",{"2":{"40":1}}],["和",{"0":{"107":1},"2":{"12":1,"42":2,"78":1,"107":2,"109":1,"114":1}}],["没错",{"2":{"12":1}}],["函数名等等都可以做为关键词",{"2":{"65":1}}],["函数名",{"2":{"40":1}}],["函数功能说明中",{"2":{"12":1}}],["函数说明以及函数操作日志",{"2":{"9":1}}],["细心的同学可能还发现了一个小细节",{"2":{"12":1}}],["展示在",{"2":{"12":1}}],["静态方法",{"2":{"12":1}}],["包的形式提供框架能力",{"2":{"115":1}}],["包含客户端和服务端",{"2":{"79":1}}],["包含",{"2":{"78":1}}],["包含静态方法",{"2":{"10":1}}],["包括实例方法",{"2":{"12":1}}],["之后",{"2":{"12":1,"50":1,"51":1}}],["|",{"2":{"12":2}}],["md",{"2":{"102":1,"111":1}}],["movie",{"2":{"102":1}}],["mousekey",{"2":{"98":1}}],["mode",{"2":{"34":6}}],["music",{"2":{"65":5,"68":6,"102":3}}],["multiple=multiple",{"2":{"12":1,"34":2}}],["multiple=false",{"2":{"12":1}}],["multiple",{"2":{"12":1,"34":2}}],["my",{"2":{"33":1,"45":2,"53":1,"58":2,"64":1,"127":2,"129":1,"130":1}}],["mycasemethod",{"2":{"129":1,"130":2}}],["mycase",{"2":{"33":1,"64":2,"127":3,"130":2,"131":2}}],["maintainer",{"2":{"105":1}}],["main",{"2":{"49":1,"94":1,"95":1,"96":1}}],["manage",{"2":{"42":1,"98":1,"129":1,"130":1}}],["manager",{"2":{"34":1,"49":2,"102":2,"103":2,"104":1,"111":2,"112":1,"130":1}}],["mark",{"2":{"38":1,"66":1,"98":1}}],["max",{"2":{"34":7}}],["match",{"2":{"34":11}}],["machine",{"2":{"27":1}}],["map",{"2":{"12":1}}],["mips64",{"2":{"21":1}}],["method",{"2":{"11":1,"12":3,"15":1,"18":1,"33":4,"94":12,"95":2,"100":1,"102":4,"111":5,"112":1,"127":4,"129":3,"130":2,"131":4}}],["metadata",{"2":{"3":1,"6":1}}],["message",{"2":{"7":1}}],["注意给元组类型",{"2":{"97":1}}],["注意这里",{"2":{"94":1,"95":1,"96":1}}],["注意ip和端口要和你的服务端ip对应",{"2":{"86":1}}],["注意",{"2":{"12":1,"57":1,"65":1,"67":1,"68":1}}],["num",{"2":{"98":1}}],["number=max",{"2":{"34":2}}],["number=match",{"2":{"34":2}}],["number",{"2":{"34":9}}],["network",{"2":{"34":9}}],["not",{"2":{"34":13,"40":2,"65":1,"66":1}}],["none",{"2":{"34":26}}],["nodeid",{"2":{"6":1,"7":1}}],["n",{"2":{"27":1}}],["name",{"2":{"11":3,"40":3,"49":1,"94":2,"95":2,"96":2,"97":4,"98":1}}],["==",{"2":{"34":5,"49":1,"94":1,"95":1,"96":1}}],["=",{"2":{"11":4,"12":1,"21":5,"34":36,"49":2,"82":1,"86":2,"94":1,"95":1,"96":1,"97":3}}],["动态等待",{"0":{"20":1},"1":{"21":1,"22":1}}],["动态添加日志装饰器",{"2":{"10":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"10":1}}],["给符合条件的函数",{"2":{"10":1}}],["实际结果",{"2":{"34":2}}],["实例",{"2":{"12":1}}],["实例方法",{"2":{"10":1}}],["实现插件依赖的定制化",{"2":{"117":1}}],["实现步骤",{"2":{"10":1}}],["实现原理",{"0":{"10":1}}],["类似于单元测试",{"2":{"106":1}}],["类名包含什么字符",{"2":{"97":1}}],["类名以什么结尾",{"2":{"97":1}}],["类名以什么开头",{"2":{"97":1}}],["类名",{"2":{"65":1}}],["类",{"2":{"10":1,"94":3,"95":1}}],["类方法",{"2":{"10":1,"12":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"9":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"115":1}}],["在继承",{"2":{"115":1}}],["在现有框架下",{"2":{"114":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"114":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"114":1}}],["在操作方法多了之后",{"2":{"106":1}}],["在同一个大版本中",{"2":{"104":1}}],["在不同的代码仓库中",{"2":{"104":1}}],["在外层其他直接使用",{"0":{"96":1}}],["在全屏指定查找某个字符串的坐标",{"0":{"88":1}}],["在根目录下定义",{"2":{"70":1,"71":1}}],["在服务端通过调用",{"2":{"46":1}}],["在远程测试机上部署一个完整的",{"2":{"46":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"46":1}}],["在用例收集阶段会以第一个",{"2":{"41":1}}],["在用例工程根目录下存放",{"2":{"41":1}}],["在用例工程目录下存放一个",{"2":{"15":1,"18":1}}],["在用例工程目录下生成报告文件",{"2":{"0":1}}],["在子项目目录下新建",{"2":{"37":1}}],["在",{"2":{"36":1,"38":1,"40":1,"41":1,"133":1}}],["在一段时间内截图多张图片进行识别",{"2":{"34":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"12":1}}],["在屏幕中相似度大于",{"2":{"12":2}}],["在应用库",{"2":{"12":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"10":1}}],["核心原理",{"2":{"10":1}}],["的路径",{"2":{"132":1}}],["的思路",{"2":{"129":1}}],["的框架下进行开发的",{"2":{"107":1}}],["的公共方法库",{"0":{"107":1},"2":{"107":1}}],["的内容",{"2":{"87":1}}],["的用例",{"2":{"42":1}}],["的脚本",{"2":{"15":1,"18":1}}],["的模板语法设计出的日志模板语法",{"2":{"12":1}}],["的坐标",{"2":{"12":2,"88":1}}],["的",{"2":{"11":1,"98":1,"131":1}}],["的方式",{"2":{"10":1,"12":1}}],["的日志系统",{"2":{"9":1}}],["的想法",{"2":{"9":1}}],["那真是妙啊~",{"2":{"9":1}}],["从任务栏启动文件管理器",{"2":{"130":1}}],["从而驱动测试用例执行",{"2":{"121":1}}],["从而减少大量日志代码量和重复编写",{"2":{"9":1}}],["从开源至今发布了",{"2":{"114":1}}],["从pms测试单中爬取用例集",{"2":{"73":1}}],["从第",{"2":{"37":1}}],["从上面的例子也可以看出来",{"2":{"9":1}}],["具有较高的重复度",{"2":{"9":1}}],["通过配置的接口进行数据回填",{"2":{"119":1}}],["通过命令行参数控制",{"2":{"117":1}}],["通过不同的参数控制返回不同的值",{"2":{"79":1}}],["通过获取该函数返回的布尔值",{"2":{"41":1}}],["通过ocr识别到不应存在的文案",{"2":{"34":2}}],["通过ocr未识别到",{"2":{"34":3}}],["通过观察前面的例子",{"2":{"12":1}}],["通过",{"2":{"10":2}}],["通过日志输出器将其输出即可",{"2":{"10":1}}],["通过给类加上一个装饰器",{"2":{"10":1}}],["通过经验观察",{"2":{"9":1}}],["通常是这样的",{"2":{"9":1}}],["省略代码部分",{"2":{"9":1}}],["l1",{"2":{"66":3}}],["lang",{"2":{"34":1,"90":1}}],["lang=lang",{"2":{"34":2}}],["lang=",{"2":{"34":2,"90":1}}],["lambda",{"2":{"12":1,"34":2}}],["leftmethod",{"2":{"129":1}}],["len",{"2":{"34":4}}],["level日志级别",{"2":{"97":1}}],["level",{"2":{"11":1,"97":1}}],["list",{"2":{"34":1}}],["license",{"2":{"34":1,"94":2,"95":2,"96":2,"102":1,"111":1}}],["lineno",{"2":{"6":1}}],["linuxdeepin",{"2":{"79":1,"91":1,"114":1}}],["linux",{"2":{"3":1,"55":3,"57":1,"98":1,"115":1}}],["ltd",{"2":{"34":1,"94":1,"95":1,"96":1}}],["l",{"2":{"27":1,"29":1}}],["ls",{"2":{"25":1,"27":1,"29":1}}],["loogarch64",{"2":{"40":2}}],["loongarch64",{"2":{"21":1}}],["lower",{"2":{"34":1}}],["logs",{"2":{"97":1}}],["log装饰器自动打印",{"2":{"94":1,"95":1}}],["log",{"2":{"10":1,"11":1,"12":5,"34":2,"94":3,"95":3,"96":6,"97":4}}],["logger直接调用",{"2":{"96":1}}],["logger",{"2":{"9":1,"12":1,"34":12,"94":2,"95":5,"96":5}}],["点击某个元素",{"2":{"9":2,"12":1}}],["dragon",{"2":{"98":1}}],["driver",{"2":{"73":5,"98":1,"121":2}}],["d",{"2":{"98":1}}],["dbus",{"2":{"55":1}}],["dmidecode",{"2":{"40":1}}],["dict",{"2":{"34":4}}],["ddefilemanagermethod",{"2":{"103":2,"104":1,"112":1}}],["dde",{"2":{"34":1,"49":3,"102":2,"103":2,"104":1,"111":4,"112":1,"129":1,"130":2}}],["during",{"2":{"34":2}}],["duration",{"2":{"2":1}}],["dogtail",{"2":{"49":1,"98":1,"129":3}}],["do",{"2":{"16":2,"19":2}}],["dock",{"2":{"49":1,"111":4,"129":1,"130":1}}],["doc",{"2":{"10":1}}],["dfm",{"2":{"12":2,"111":2}}],["deepin",{"2":{"102":4}}],["desc",{"2":{"98":1}}],["desktop",{"2":{"34":2,"87":1,"89":1}}],["debug",{"2":{"11":1,"94":1,"95":3,"96":3,"97":1,"127":1,"136":1}}],["default=false",{"2":{"90":1}}],["default",{"2":{"90":1}}],["def",{"2":{"9":1,"12":2,"33":1,"34":15,"49":2,"63":2,"94":6,"95":1,"130":1,"131":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"9":1}}],["背景",{"0":{"9":1,"114":1}}],["id",{"2":{"73":5}}],["id4",{"2":{"67":3}}],["id3",{"2":{"67":3,"70":1,"71":1}}],["id2",{"2":{"67":3,"70":1,"71":1}}],["id1",{"2":{"67":3}}],["identifier",{"2":{"34":1,"94":1,"95":1,"96":1}}],["issue",{"2":{"105":1}}],["isinstance",{"2":{"34":4}}],["is",{"2":{"34":6}}],["ifixed",{"2":{"42":2}}],["if",{"2":{"34":23,"49":1,"94":1,"95":1,"96":1}}],["ip4",{"2":{"77":2,"78":2}}],["ip3",{"2":{"77":2,"78":2}}],["ip2",{"2":{"77":2,"78":2}}],["ip1",{"2":{"77":2,"78":2}}],["ip=",{"2":{"49":1}}],["ip=ip",{"2":{"49":1}}],["ip",{"2":{"27":1,"29":1,"30":1,"31":1,"49":1,"86":1}}],["imagecenter",{"2":{"98":1}}],["image",{"2":{"12":4,"34":6,"127":1,"132":1}}],["import",{"2":{"11":1,"12":2,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":3,"34":12,"49":2,"82":3,"86":2,"94":3,"95":3,"96":3,"97":3,"103":1,"104":1,"112":2,"117":1,"129":2,"130":2,"131":3}}],["in",{"2":{"34":2}}],["int",{"2":{"34":18}}],["ini",{"2":{"111":2,"122":1,"127":1}}],["inix86",{"2":{"21":1}}],["init",{"2":{"7":1,"45":2,"49":1,"58":1,"64":1,"102":3,"111":4,"126":1,"127":2}}],["install",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"57":6,"81":1,"84":1,"92":1,"104":1}}],["inspect",{"2":{"10":1}}],["info",{"2":{"9":1,"11":2,"12":1,"34":11,"95":2,"96":2,"97":1}}],["items",{"2":{"34":2}}],["it",{"2":{"7":1}}],["auto",{"2":{"49":3}}],["autotest",{"2":{"45":2,"58":2,"100":1}}],["amp",{"2":{"40":3,"41":5}}],["album",{"2":{"37":2}}],["all",{"2":{"34":5}}],["allure",{"2":{"12":2}}],["and",{"2":{"34":3,"65":4,"66":1}}],["any",{"2":{"34":3}}],["arrch64",{"2":{"40":1}}],["args",{"2":{"34":7}}],["arch",{"2":{"3":2}}],["actual",{"2":{"34":10}}],["as",{"2":{"34":3}}],["assertionerror",{"2":{"34":18}}],["assertmethod",{"2":{"33":5,"131":5}}],["assertx",{"2":{"33":1}}],["assert",{"2":{"33":6,"34":18,"111":1,"127":2,"130":1,"131":9,"132":1}}],["abspath=",{"2":{"87":1,"89":1}}],["abspath=config",{"2":{"49":1}}],["abspath=pic",{"2":{"34":2}}],["abspath=picture",{"2":{"34":2}}],["abspath=none",{"2":{"34":2}}],["abspath",{"2":{"34":9,"49":1}}],["aarch64",{"2":{"21":1,"40":4,"41":1}}],["apache",{"2":{"94":1,"95":1,"96":1}}],["apt",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["app",{"2":{"12":5,"33":1,"34":10,"64":1}}],["appmethod",{"2":{"9":1,"12":2}}],["attr",{"2":{"9":1,"12":1,"34":2,"49":3}}],["a",{"2":{"7":1}}],["button",{"2":{"98":1}}],["bus",{"2":{"98":1}}],["btn",{"2":{"49":1,"129":1}}],["bool",{"2":{"34":4,"90":2}}],["bin",{"2":{"34":1,"94":1,"95":1,"96":1}}],["basemethod",{"2":{"129":2}}],["baselog",{"2":{"94":2,"95":2,"96":2}}],["base",{"2":{"33":1,"64":1,"94":6,"111":2,"127":2,"129":1,"130":1,"131":2}}],["basecase",{"2":{"33":3,"130":2,"131":5}}],["bashpip",{"2":{"57":5}}],["bashpython3",{"2":{"42":1}}],["bash$",{"2":{"53":1,"60":2,"62":2,"63":4,"64":2,"65":2,"66":2,"67":2,"68":6,"75":3,"78":2}}],["bash",{"2":{"47":1}}],["bashcd",{"2":{"45":1,"58":1}}],["bashmkdir",{"2":{"45":1,"58":1}}],["bashmy",{"2":{"15":1,"18":1}}],["bashyouqu3",{"2":{"16":2,"19":2,"47":1,"50":2,"51":1,"52":1,"73":2}}],["bash>>",{"2":{"12":1}}],["bar",{"2":{"3":1,"6":1}}],["by",{"2":{"9":1,"12":1,"34":6,"49":3}}],["because",{"2":{"7":1}}],["警告信息",{"2":{"7":1}}],["收集器节点的列表",{"2":{"5":1}}],["source",{"2":{"79":1,"91":1}}],["software",{"2":{"34":1,"94":2,"95":2,"96":2}}],["smoke",{"2":{"64":4,"66":2}}],["slaves",{"2":{"47":3}}],["slaves对象提供远程机器信息",{"0":{"47":1}}],["sleep",{"2":{"21":3}}],["systemctl",{"2":{"75":1}}],["system",{"2":{"40":1}}],["s",{"2":{"40":1}}],["skipif",{"2":{"40":8,"41":6}}],["skiped",{"2":{"39":1}}],["skip",{"2":{"36":1,"38":1,"39":2,"42":3,"43":1}}],["skipped",{"2":{"4":1}}],["similarity=similarity",{"2":{"34":2}}],["similarity=0",{"2":{"34":2,"90":1}}],["similarity",{"2":{"34":1,"90":1}}],["screen",{"2":{"34":8}}],["spdx",{"2":{"34":2,"94":2,"95":2,"96":2}}],["ssh",{"2":{"27":1,"75":3}}],["sw64",{"2":{"40":4}}],["sw",{"2":{"21":1}}],["sudo权限执行",{"0":{"26":1,"30":1}}],["sudo",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"40":1,"75":1}}],["summary",{"0":{"4":1},"2":{"2":2}}],["shell$",{"2":{"126":1}}],["shellpip",{"2":{"104":1}}],["shelluos",{"2":{"102":1,"111":1}}],["shellocr",{"2":{"90":1}}],["shellautotest",{"2":{"64":1,"127":1}}],["shell",{"0":{"53":1},"2":{"16":1,"19":1,"51":1,"53":2}}],["str",{"2":{"34":6}}],["step",{"2":{"12":1}}],["static",{"2":{"94":4,"95":2,"127":1,"132":1}}],["staticmethod",{"2":{"34":14,"94":2,"95":1}}],["status",{"2":{"34":2,"130":1}}],["start",{"2":{"15":2,"16":3,"18":1,"73":2}}],["startswith",{"2":{"11":1,"97":2}}],["stage",{"2":{"6":3}}],["server",{"2":{"81":1,"82":8,"86":1}}],["send2pms",{"2":{"73":2}}],["secret",{"2":{"27":1}}],["setting",{"2":{"11":5,"34":6,"82":2,"86":3,"94":2,"95":2,"96":2,"97":6,"122":2}}],["setattr",{"2":{"10":1}}],["setup",{"2":{"6":1}}],["self",{"2":{"9":1,"12":1,"33":3,"49":4,"63":2,"94":8,"129":1,"130":2,"131":1}}],["fr",{"2":{"90":1}}],["from",{"2":{"12":2,"33":3,"34":14,"49":2,"82":2,"86":1,"94":3,"95":3,"96":3,"112":1,"129":2,"130":2,"131":3}}],["false",{"2":{"34":11,"41":2}}],["fail",{"2":{"6":2}}],["failed",{"2":{"4":1,"6":1}}],["float",{"2":{"34":13,"90":1}}],["fixture",{"2":{"127":1}}],["fixed",{"2":{"36":1,"42":3,"43":1}}],["filter",{"2":{"34":2}}],["file",{"2":{"34":14,"49":2,"97":2,"102":2,"103":2,"104":1,"111":2,"112":1,"129":1,"130":2}}],["filecopyrighttext",{"2":{"34":1,"94":1,"95":1,"96":1}}],["first=true",{"2":{"90":2}}],["first=return",{"2":{"34":2}}],["first=false",{"2":{"34":2}}],["first",{"2":{"34":3,"90":1}}],["find",{"2":{"12":4,"34":6}}],["f",{"2":{"12":1,"34":34,"68":6}}],["funnylog2",{"2":{"98":1}}],["funnylog",{"0":{"91":1},"1":{"92":1,"93":1,"94":1,"95":1,"96":1,"97":1},"2":{"11":1,"91":1,"92":1,"94":3,"95":3,"96":3,"97":3}}],["func",{"2":{"10":1}}],["foo0",{"2":{"6":1}}],["foo",{"2":{"3":1,"6":3,"7":2}}],["汇总信息",{"2":{"4":1}}],["2024",{"2":{"114":1}}],["2021",{"2":{"114":1}}],["2023",{"2":{"34":1,"94":1,"95":1,"96":1,"114":1}}],["28",{"2":{"12":1}}],["22",{"2":{"3":1}}],["2",{"0":{"40":1,"83":1,"86":1,"87":2,"88":1,"89":1,"90":1,"95":1,"101":1,"102":1,"103":2,"110":1,"111":1,"112":2,"115":1,"118":1,"122":1,"128":1,"129":1,"130":2,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"1":{"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"102":1,"103":1,"111":1,"112":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"140":1},"2":{"3":1,"4":2,"21":3,"34":1,"37":1,"47":2,"63":1,"77":1,"78":2,"98":1,"114":2,"127":1}}],["55",{"2":{"49":1}}],["50",{"2":{"6":1,"78":1}}],["5",{"0":{"90":1,"106":1,"125":1,"133":1,"137":1},"1":{"138":1,"139":1,"140":1},"2":{"3":2,"21":3,"98":1,"114":1}}],["56",{"2":{"3":1}}],["wdotool",{"2":{"98":1}}],["w5821",{"2":{"40":1}}],["widget",{"2":{"34":18,"49":1}}],["with",{"2":{"3":1}}],["web",{"2":{"55":1,"98":2,"138":1}}],["webassert",{"2":{"33":2}}],["webui",{"2":{"33":1,"57":2}}],["wayland",{"2":{"40":1,"41":1,"98":1}}],["want",{"2":{"16":1,"19":1}}],["warnings",{"0":{"7":1},"2":{"2":2}}],["what",{"2":{"16":1,"19":1}}],["x11",{"2":{"40":1}}],["xdg",{"2":{"40":1,"41":1}}],["xdist",{"2":{"3":1}}],["x3c",{"2":{"34":17}}],["x",{"2":{"12":2,"34":4}}],["xxx",{"2":{"9":1,"11":3,"12":1,"33":1,"36":3,"39":1,"42":2,"63":7,"97":1}}],["xxxx",{"2":{"0":1,"73":4}}],["xpassed",{"2":{"4":1}}],["xfailed",{"2":{"4":1}}],["x86",{"2":{"3":1,"12":1,"40":2}}],["9",{"2":{"3":1,"12":2,"98":1}}],["7",{"0":{"135":1},"2":{"49":1,"98":1}}],["78",{"2":{"3":1}}],["7981803",{"2":{"2":1}}],["40",{"2":{"34":6}}],["47",{"2":{"12":1}}],["48",{"2":{"12":1}}],["4",{"0":{"89":1,"105":1,"120":1,"121":1,"122":1,"123":1,"124":2,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":2,"133":1,"134":1,"135":1,"136":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1,"127":1,"128":1,"129":2,"130":2,"131":2,"132":2,"133":2,"134":2,"135":2,"136":2,"138":1,"139":1,"140":1},"2":{"3":3,"98":1}}],["679537",{"2":{"39":1,"42":1,"43":1}}],["64",{"2":{"3":1,"12":1,"21":2,"40":2}}],["6",{"0":{"107":1,"134":1},"2":{"3":2,"12":1,"34":2,"90":1,"98":1}}],["3",{"0":{"41":1,"88":1,"96":1,"104":1,"116":1,"117":1,"118":1,"119":2,"120":1,"121":1,"122":1,"123":2,"124":1,"125":1,"131":1},"1":{"117":1,"118":1,"119":1,"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"3":2,"4":1,"98":1}}],["public",{"0":{"107":1},"2":{"107":4}}],["pr",{"2":{"105":2}}],["project",{"2":{"49":2}}],["product",{"2":{"40":1}}],["process",{"2":{"34":4,"130":1}}],["pdocr",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"79":1,"81":1,"82":3,"84":1,"86":2,"98":1}}],["pms",{"2":{"73":14,"98":2}}],["pms用例驱动",{"0":{"73":1}}],["pip",{"2":{"57":1,"104":1}}],["picture",{"2":{"34":13,"87":1,"89":1}}],["pic",{"2":{"12":1,"34":14}}],["popmethod",{"2":{"129":1}}],["port",{"2":{"82":1,"86":1}}],["po",{"2":{"45":1,"103":1,"117":1,"129":1}}],["png",{"2":{"12":2,"34":4,"87":2,"89":1}}],["playwright",{"2":{"98":2}}],["platform",{"2":{"3":1,"40":5,"41":1}}],["plugins",{"2":{"3":1}}],["pluggy",{"2":{"3":1}}],["pypi",{"2":{"104":1}}],["pydbussend",{"2":{"98":1}}],["pylinuxauto",{"2":{"34":14,"98":1,"112":1}}],["py",{"2":{"3":1,"6":2,"7":2,"12":2,"15":2,"16":1,"18":2,"19":1,"33":3,"37":2,"41":2,"42":1,"49":1,"63":2,"64":4,"65":2,"68":6,"82":2,"94":1,"95":1,"96":1,"102":6,"111":12,"127":11,"129":1,"130":1,"131":4}}],["pytest",{"2":{"3":1,"38":1,"66":2,"98":3,"111":1}}],["pythonocr",{"2":{"87":1,"88":1,"89":1,"90":3}}],["python3",{"2":{"16":1,"19":1,"34":1,"94":1,"95":1,"96":1}}],["pythondfmwidget",{"2":{"12":1}}],["pythonfrom",{"2":{"11":1,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"82":1,"86":1,"97":3,"103":1,"104":1,"112":1}}],["pythonclass",{"2":{"9":1,"33":1}}],["python",{"2":{"3":1,"12":2,"33":2,"34":1,"49":1,"63":1,"82":1,"115":1,"117":1,"129":1,"130":1,"131":3}}],["paddleocr",{"2":{"79":1}}],["pause=pause",{"2":{"34":4}}],["pause",{"2":{"34":8}}],["pass",{"2":{"34":4}}],["password=",{"2":{"49":1}}],["password=password",{"2":{"49":1}}],["password2",{"2":{"47":1}}],["password1",{"2":{"47":2}}],["password",{"2":{"27":1,"29":1,"30":1,"31":1,"49":1,"73":4}}],["passed",{"2":{"4":1}}],["param",{"2":{"12":2,"34":32}}],["packages",{"2":{"3":1}}],["path",{"2":{"2":1,"7":2,"12":1,"34":17,"49":1,"97":2}}],["cd",{"2":{"115":1}}],["ci",{"2":{"115":1}}],["center",{"2":{"98":1}}],["c",{"2":{"78":2}}],["cpu",{"2":{"40":3}}],["csv文件",{"2":{"37":1}}],["csv文件与脚本对应关系",{"0":{"37":1}}],["csv",{"2":{"36":1,"37":6,"38":2,"39":1,"40":1,"44":1,"66":1,"111":2,"127":1,"133":2}}],["ch",{"2":{"34":2,"90":2}}],["cmd",{"2":{"25":3,"26":3,"27":3,"29":1,"30":1,"31":1,"34":4}}],["cli",{"2":{"114":1}}],["click",{"2":{"9":1,"12":1,"49":3,"129":2,"130":1}}],["clone",{"2":{"16":1,"19":1}}],["cls",{"2":{"12":2,"34":1,"94":4}}],["classmethod",{"2":{"12":1,"34":1,"94":2}}],["class",{"2":{"7":1,"11":3,"12":2,"33":2,"34":1,"49":1,"63":1,"94":3,"95":3,"96":3,"97":4,"129":1,"130":1,"131":3}}],["cargo",{"0":{"52":1},"2":{"51":1,"52":2,"60":1,"62":1,"63":2,"64":1,"65":1,"66":1,"67":1,"68":3,"73":1,"75":1,"78":1}}],["cache",{"2":{"34":5}}],["case",{"2":{"15":2,"18":2,"33":2,"64":2,"65":1,"68":8,"111":3,"112":1,"127":4,"129":1,"130":3,"131":3}}],["cannot",{"2":{"7":1}}],["call",{"2":{"6":1}}],["c1",{"2":{"7":1}}],["commit",{"2":{"98":2}}],["com",{"2":{"79":1,"91":1}}],["count",{"2":{"34":1}}],["co",{"2":{"34":1,"94":1,"95":1,"96":1}}],["coding",{"2":{"34":1,"94":1,"95":1,"96":1}}],["code",{"2":{"7":1,"79":1,"91":1}}],["consolepip",{"2":{"81":1,"84":1,"92":1}}],["constructor",{"2":{"7":1}}],["contain",{"2":{"11":1,"97":1}}],["conftest",{"2":{"127":1}}],["config",{"2":{"12":1,"49":2,"111":1,"127":1}}],["conf",{"2":{"11":1,"82":1,"86":1,"94":1,"95":1,"96":1,"97":3}}],["collect",{"2":{"7":1}}],["collected",{"2":{"4":1}}],["collectors",{"0":{"5":1},"2":{"2":2}}],["created",{"2":{"2":1}}],["equal",{"2":{"34":2}}],["ele",{"2":{"129":1}}],["elementnotfound",{"2":{"34":1}}],["element",{"2":{"12":2,"34":8,"49":1}}],["elements",{"2":{"12":5}}],["elif",{"2":{"34":4}}],["else",{"2":{"34":8}}],["events=",{"2":{"27":1}}],["expr",{"2":{"34":10}}],["expanduser",{"2":{"34":2}}],["expect",{"2":{"27":1,"31":1,"34":18}}],["expect交互",{"0":{"27":1,"31":1}}],["excel",{"2":{"44":1}}],["except",{"2":{"34":5}}],["exceptions",{"2":{"34":10}}],["exc",{"2":{"34":6}}],["exists",{"2":{"34":2}}],["exist",{"2":{"34":11}}],["exitcode",{"2":{"2":1}}],["en",{"2":{"90":1}}],["envx",{"2":{"51":2}}],["env",{"2":{"34":1,"94":1,"95":1,"96":1,"111":1,"127":1}}],["environment",{"0":{"3":1},"2":{"2":2}}],["end",{"2":{"18":1,"19":3,"73":2}}],["endswith",{"2":{"11":1,"94":1,"95":1,"96":1,"97":1}}],["error",{"2":{"4":1,"11":1,"95":2,"96":2}}],["titlemethod",{"2":{"129":1}}],["timeout=timeout",{"2":{"34":4}}],["timeout",{"2":{"34":5}}],["time",{"2":{"21":1,"34":4}}],["tmp",{"2":{"97":1}}],["task",{"2":{"73":4}}],["tags",{"0":{"70":1},"2":{"37":1,"69":1,"70":2,"73":2}}],["t",{"2":{"66":2,"67":2}}],["type",{"2":{"40":1,"41":1}}],["typing",{"2":{"34":1}}],["txtid1",{"2":{"70":1,"71":1}}],["txt",{"0":{"70":1,"71":1},"2":{"34":3,"69":3,"70":2,"71":2,"73":2,"77":1,"111":1,"127":1}}],["transfer",{"2":{"98":1}}],["trace",{"2":{"10":2}}],["true表示返回原始数据",{"2":{"90":1}}],["true",{"2":{"34":4,"41":2,"130":1}}],["try",{"2":{"34":4}}],["tuple",{"2":{"12":1,"34":2,"97":1}}],["templateelementfound",{"2":{"34":3}}],["templateelementnotfound",{"2":{"34":5}}],["technology",{"2":{"34":1,"94":1,"95":1,"96":1}}],["teardown",{"2":{"6":1}}],["testlog",{"2":{"94":7,"95":2,"96":1}}],["testmusic",{"2":{"65":1}}],["testmycase",{"2":{"33":1,"130":1}}],["testcase",{"2":{"63":1,"131":1}}],["testfoo",{"2":{"7":2}}],["test",{"2":{"6":8,"7":3,"33":1,"37":2,"63":7,"64":2,"65":2,"68":6,"87":2,"89":1,"97":1,"111":2,"127":2,"130":2,"131":2}}],["tests",{"0":{"6":1},"2":{"2":3,"7":1,"102":1}}],["toolkit",{"2":{"100":1,"102":1}}],["todo",{"2":{"31":1}}],["total",{"2":{"4":1}}],["to",{"2":{"2":1,"7":1}}],["rightmethod",{"2":{"129":1}}],["rm",{"0":{"54":1},"2":{"51":1,"54":1}}],["rpcgui",{"0":{"49":1},"2":{"49":2}}],["rpc",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1},"2":{"46":2,"49":1,"79":2,"81":1,"82":3,"84":1,"86":2,"98":4}}],["raise",{"2":{"34":19}}],["rate=rate",{"2":{"34":2}}],["rate=0",{"2":{"12":1}}],["rate",{"2":{"12":1,"34":7}}],["run",{"2":{"16":2,"19":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"42":1,"47":1,"50":1,"52":1,"53":1,"60":3,"62":2,"63":4,"64":2,"65":2,"66":2,"67":2,"68":6,"73":2}}],["requirements",{"2":{"111":1,"127":1}}],["readme",{"2":{"102":1,"111":1}}],["record",{"2":{"98":1}}],["recursive",{"2":{"34":1}}],["removed",{"2":{"36":1,"43":2}}],["remotemethod",{"2":{"49":2}}],["remote",{"2":{"29":1,"30":1,"31":1,"49":1,"57":1,"75":3,"78":2}}],["remotecmd",{"2":{"29":2,"30":2,"31":2}}],["retry=network",{"2":{"34":4}}],["retry",{"2":{"34":9}}],["return",{"2":{"12":2,"34":6,"90":5}}],["restart",{"2":{"49":2,"75":1}}],["restart=false",{"2":{"49":1}}],["res",{"2":{"12":1,"34":21,"127":3,"132":3}}],["report",{"2":{"0":2,"98":1}}],["rootdir",{"2":{"49":1}}],["root",{"2":{"2":1,"47":3}}],["16",{"2":{"98":1}}],["168",{"2":{"47":3,"86":1}}],["15",{"2":{"98":1}}],["1518371686",{"2":{"2":1}}],["14",{"2":{"98":1}}],["13",{"2":{"98":1}}],["12",{"2":{"98":1}}],["123456",{"2":{"73":4}}],["1235666275024414",{"2":{"2":1}}],["11",{"2":{"98":1}}],["192",{"2":{"47":3,"86":1}}],["17",{"2":{"12":1,"98":1}}],["1071",{"2":{"104":1}}],["1070",{"2":{"104":1}}],["100",{"2":{"78":3}}],["10",{"2":{"4":2,"49":1,"98":1}}],["1",{"0":{"39":1,"80":1,"86":1,"94":1,"100":1,"102":1,"109":1,"111":1,"114":1,"117":1,"121":1,"127":1,"129":1},"1":{"81":1,"82":1},"2":{"2":1,"3":4,"4":3,"21":3,"34":7,"37":1,"47":5,"49":1,"63":3,"86":1,"90":1,"98":1,"114":1,"127":1}}],["002",{"2":{"64":1,"68":2,"127":1}}],["001",{"2":{"12":2,"33":2,"36":1,"37":2,"40":1,"63":7,"64":1,"65":5,"68":4,"111":2,"127":1,"130":2,"131":2}}],["02",{"2":{"12":1}}],["0",{"2":{"2":1,"3":4,"12":1,"34":1,"86":1,"114":2}}],["报告中",{"2":{"12":1}}],["报告内容",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1}}],["报告",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexroot.gI043LAz.js b/assets/chunks/@localSearchIndexroot.gI043LAz.js deleted file mode 100644 index 5d8d532..0000000 --- a/assets/chunks/@localSearchIndexroot.gI043LAz.js +++ /dev/null @@ -1 +0,0 @@ -const t='{"documentCount":138,"nextId":138,"documentIds":{"0":"/youqu3/指南/与生俱来/JSON报告.html#json-报告","1":"/youqu3/指南/与生俱来/JSON报告.html#报告内容","2":"/youqu3/指南/与生俱来/JSON报告.html#整体结构","3":"/youqu3/指南/与生俱来/JSON报告.html#environment","4":"/youqu3/指南/与生俱来/JSON报告.html#summary","5":"/youqu3/指南/与生俱来/JSON报告.html#collectors","6":"/youqu3/指南/与生俱来/JSON报告.html#tests","7":"/youqu3/指南/与生俱来/JSON报告.html#warnings","8":"/youqu3/指南/与生俱来/全自动日志.html#全自动日志","9":"/youqu3/指南/与生俱来/全自动日志.html#背景","10":"/youqu3/指南/与生俱来/全自动日志.html#实现原理","11":"/youqu3/指南/与生俱来/全自动日志.html#日志配置","12":"/youqu3/指南/与生俱来/全自动日志.html#使用方法","13":"/youqu3/指南/与生俱来/前后钩子.html#前后钩子","14":"/youqu3/指南/与生俱来/前后钩子.html#前置钩子","15":"/youqu3/指南/与生俱来/前后钩子.html#前置脚本钩子","16":"/youqu3/指南/与生俱来/前后钩子.html#前置命令行入参钩子","17":"/youqu3/指南/与生俱来/前后钩子.html#后置钩子","18":"/youqu3/指南/与生俱来/前后钩子.html#后置脚本钩子","19":"/youqu3/指南/与生俱来/前后钩子.html#后置命令行入参钩子","20":"/youqu3/指南/与生俱来/动态等待.html#动态等待","21":"/youqu3/指南/与生俱来/动态等待.html#架构动态等待","22":"/youqu3/指南/与生俱来/动态等待.html#元素识别动态等待","23":"/youqu3/指南/与生俱来/命令行交互.html#命令行交互","24":"/youqu3/指南/与生俱来/命令行交互.html#本机命令行交互","25":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行","26":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行","27":"/youqu3/指南/与生俱来/命令行交互.html#expect交互","28":"/youqu3/指南/与生俱来/命令行交互.html#远程命令行交互","29":"/youqu3/指南/与生俱来/命令行交互.html#普通权限执行-1","30":"/youqu3/指南/与生俱来/命令行交互.html#sudo权限执行-1","31":"/youqu3/指南/与生俱来/命令行交互.html#expect交互-1","32":"/youqu3/指南/与生俱来/断言语句.html#断言语句","33":"/youqu3/指南/与生俱来/断言语句.html#用例中使用方法","34":"/youqu3/指南/与生俱来/断言语句.html#方法明细","35":"/youqu3/指南/与生俱来/标签化管理.html#标签化管理","36":"/youqu3/指南/与生俱来/标签化管理.html#使用说明","37":"/youqu3/指南/与生俱来/标签化管理.html#csv文件与脚本对应关系","38":"/youqu3/指南/与生俱来/标签化管理.html#跳过用例","39":"/youqu3/指南/与生俱来/标签化管理.html#_1-固定跳过","40":"/youqu3/指南/与生俱来/标签化管理.html#_2-条件判断跳过","41":"/youqu3/指南/与生俱来/标签化管理.html#_3-自定义跳过","42":"/youqu3/指南/与生俱来/标签化管理.html#确认修复","43":"/youqu3/指南/与生俱来/标签化管理.html#废弃用例","44":"/youqu3/指南/与生俱来/标签化管理.html#文件格式","45":"/youqu3/指南/与生俱来/远程交互控制.html#远程交互式控制","46":"/youqu3/指南/与生俱来/远程交互控制.html#slaves对象提供远程机器信息","47":"/youqu3/指南/与生俱来/远程交互控制.html#ui操作远程对象","48":"/youqu3/指南/与生俱来/远程交互控制.html#rpcgui","49":"/youqu3/指南/环境管理/原生环境.html#原生环境","50":"/youqu3/指南/环境管理/虚拟环境.html#虚拟环境","51":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-cargo","52":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-shell","53":"/youqu3/指南/环境管理/虚拟环境.html#youqu3-rm","54":"/youqu3/指南/简介/YouQu3是什么.html#youqu3-能做什么","55":"/youqu3/指南/简介/快速开始.html#快速开始","56":"/youqu3/指南/简介/快速开始.html#安装","57":"/youqu3/指南/简介/快速开始.html#创建用例工程","58":"/youqu3/指南/驱动执行/本地执行.html#本地执行","59":"/youqu3/指南/驱动执行/本地执行.html#子命令","60":"/youqu3/指南/驱动执行/本地执行.html#用例驱动方式","61":"/youqu3/指南/驱动执行/本地执行.html#执行所有用例","62":"/youqu3/指南/驱动执行/本地执行.html#指定执行某一个用例","63":"/youqu3/指南/驱动执行/本地执行.html#指定某个目录执行","64":"/youqu3/指南/驱动执行/本地执行.html#根据关键词执行","65":"/youqu3/指南/驱动执行/本地执行.html#根据标签执行","66":"/youqu3/指南/驱动执行/本地执行.html#批量用例id驱动执行","67":"/youqu3/指南/驱动执行/本地执行.html#指定用例文件路径执行","68":"/youqu3/指南/驱动执行/自定义执行.html#自定义执行","69":"/youqu3/指南/驱动执行/自定义执行.html#youqu-tags-txt","70":"/youqu3/指南/驱动执行/自定义执行.html#youqu-keywords-txt","71":"/youqu3/指南/驱动执行/远程执行.html#远程执行","72":"/youqu3/指南/驱动执行/远程执行.html#子命令","73":"/youqu3/指南/驱动执行/远程执行.html#远程测试机分组策略","74":"/youqu3/指南/驱动执行/远程执行.html#分组规则","75":"/youqu3/指南/驱动执行/远程执行.html#执行策略","76":"/youqu3/插件/OCR识别.html#pdocr-rpc","77":"/youqu3/插件/OCR识别.html#_1、服务端","78":"/youqu3/插件/OCR识别.html#服务端安装","79":"/youqu3/插件/OCR识别.html#服务端启动服务","80":"/youqu3/插件/OCR识别.html#_2、客户端","81":"/youqu3/插件/OCR识别.html#客户端安装","82":"/youqu3/插件/OCR识别.html#客户端使用","83":"/youqu3/插件/OCR识别.html#_2-1、识别当前屏幕的所有文字内容","84":"/youqu3/插件/OCR识别.html#_2-2、指定某张图片识别的所有文字内容","85":"/youqu3/插件/OCR识别.html#_2-3、在全屏指定查找某个字符串的坐标","86":"/youqu3/插件/OCR识别.html#_2-4、指定某张图片查找某个字符串的坐标","87":"/youqu3/插件/OCR识别.html#_2-5、其他参数","88":"/youqu3/插件/全自动日志.html#funnylog","89":"/youqu3/插件/全自动日志.html#安装","90":"/youqu3/插件/全自动日志.html#使用方法","91":"/youqu3/插件/全自动日志.html#_1、自动输出日志","92":"/youqu3/插件/全自动日志.html#_2、方法中输出其他的日志","93":"/youqu3/插件/全自动日志.html#_3、在外层其他直接使用","94":"/youqu3/插件/全自动日志.html#必要配置项","95":"/youqu3/插件/插件列表.html#youqu3-插件汇总信息","96":"/youqu3/规划/UOS自动化测试方法套件.html#uos-自动化测试方法套件-umtk","97":"/youqu3/规划/UOS自动化测试方法套件.html#_1-简介","98":"/youqu3/规划/UOS自动化测试方法套件.html#_2-工程设计","99":"/youqu3/规划/UOS自动化测试方法套件.html#_2-1-工程结构","100":"/youqu3/规划/UOS自动化测试方法套件.html#_2-2-方案说明","101":"/youqu3/规划/UOS自动化测试方法套件.html#_3-套件发布","102":"/youqu3/规划/UOS自动化测试方法套件.html#_4-套件维护","103":"/youqu3/规划/UOS自动化测试方法套件.html#_5-对套件的测试","104":"/youqu3/规划/UOS自动化测试方法套件.html#_6-umtk-和-youqu2-的公共方法库-public-有何区别","105":"/youqu3/规划/UOS自动化测试用例.html#uos-自动化测试用例","106":"/youqu3/规划/UOS自动化测试用例.html#_1-简介","107":"/youqu3/规划/UOS自动化测试用例.html#_2-工程设计","108":"/youqu3/规划/UOS自动化测试用例.html#_2-1-工程结构","109":"/youqu3/规划/UOS自动化测试用例.html#_2-2-方案说明","110":"/youqu3/规划/YouQu3架构设计规划.html#youqu3-架构设计规划","111":"/youqu3/规划/YouQu3架构设计规划.html#_1-背景","112":"/youqu3/规划/YouQu3架构设计规划.html#_2-目标","113":"/youqu3/规划/YouQu3架构设计规划.html#_3-架构设计","114":"/youqu3/规划/YouQu3架构设计规划.html#_3-1-总体方案","115":"/youqu3/规划/YouQu3架构设计规划.html#_3-2-架构设计","116":"/youqu3/规划/YouQu3架构设计规划.html#_3-3-整体数据流","117":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-详细设计","118":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-1-驱动执行管理","119":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-2-配置项管理","120":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-3-框架总线接口","121":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-4-按测试类型管理插件","122":"/youqu3/规划/YouQu3架构设计规划.html#_3-4-5-环境依赖管理","123":"/youqu3/规划/YouQu3架构设计规划.html#_4-用例工程设计","124":"/youqu3/规划/YouQu3架构设计规划.html#_4-1-用例工程结构","125":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-各模块编写思路","126":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-1-方法层","127":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-2-用例层","128":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-3-断言","129":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-4-配置对象","130":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-5-用例标签管理文件","131":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-6-默认环境变量管理文件","132":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-7-依赖管理文件","133":"/youqu3/规划/YouQu3架构设计规划.html#_4-2-8-调试用例驱动","134":"/youqu3/规划/YouQu3架构设计规划.html#_5-演进规划","135":"/youqu3/规划/YouQu3架构设计规划.html#可视化配置","136":"/youqu3/规划/YouQu3架构设计规划.html#非开发者下运行","137":"/youqu3/规划/YouQu3架构设计规划.html#过程钩子"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[2,1,8],"1":[1,2,1],"2":[1,3,23],"3":[1,3,31],"4":[1,3,15],"5":[1,3,4],"6":[1,3,21],"7":[1,3,23],"8":[1,1,1],"9":[1,1,41],"10":[1,1,24],"11":[1,1,27],"12":[1,1,102],"13":[1,1,3],"14":[1,1,1],"15":[1,2,11],"16":[1,2,24],"17":[1,1,1],"18":[1,2,12],"19":[1,2,24],"20":[1,1,1],"21":[1,1,21],"22":[1,1,1],"23":[1,1,1],"24":[1,1,1],"25":[1,2,8],"26":[1,2,11],"27":[1,2,18],"28":[1,1,1],"29":[1,2,13],"30":[1,2,15],"31":[1,2,17],"32":[1,1,4],"33":[1,1,35],"34":[1,1,255],"35":[1,1,1],"36":[1,1,13],"37":[1,1,50],"38":[1,1,14],"39":[2,2,18],"40":[2,2,62],"41":[2,2,41],"42":[1,1,33],"43":[1,1,21],"44":[1,1,8],"45":[1,1,13],"46":[1,1,21],"47":[1,1,1],"48":[1,2,57],"49":[1,1,11],"50":[1,1,22],"51":[2,1,6],"52":[2,1,12],"53":[2,1,4],"54":[3,1,18],"55":[1,1,1],"56":[1,1,18],"57":[1,1,9],"58":[1,1,1],"59":[1,1,7],"60":[1,1,1],"61":[1,2,6],"62":[1,2,21],"63":[1,2,25],"64":[1,2,30],"65":[1,2,24],"66":[1,2,15],"67":[1,2,21],"68":[1,1,8],"69":[3,1,14],"70":[3,1,1],"71":[1,1,1],"72":[1,1,19],"73":[1,1,1],"74":[1,2,17],"75":[1,2,32],"76":[2,1,18],"77":[2,2,1],"78":[1,4,6],"79":[1,4,22],"80":[2,2,1],"81":[1,4,5],"82":[1,4,1],"83":[3,5,21],"84":[2,5,11],"85":[3,5,8],"86":[3,5,10],"87":[3,5,39],"88":[1,1,12],"89":[1,1,4],"90":[1,1,1],"91":[2,2,61],"92":[2,2,58],"93":[2,2,49],"94":[1,1,37],"95":[2,1,90],"96":[4,1,1],"97":[2,4,18],"98":[2,4,1],"99":[3,5,20],"100":[2,5,21],"101":[2,4,33],"102":[2,4,8],"103":[2,4,9],"104":[7,4,50],"105":[2,1,1],"106":[2,2,12],"107":[2,2,1],"108":[3,4,29],"109":[2,4,24],"110":[2,1,1],"111":[2,2,56],"112":[2,2,46],"113":[2,2,1],"114":[3,4,37],"115":[3,4,1],"116":[2,4,15],"117":[3,4,2],"118":[4,6,16],"119":[4,6,19],"120":[3,6,12],"121":[3,6,4],"122":[4,6,5],"123":[2,2,5],"124":[3,4,49],"125":[3,4,2],"126":[4,6,53],"127":[3,6,32],"128":[4,6,30],"129":[3,6,13],"130":[4,6,9],"131":[4,6,4],"132":[4,6,2],"133":[4,6,5],"134":[2,2,1],"135":[1,7,6],"136":[1,7,4],"137":[1,7,5]},"averageFieldLength":[1.7536231884057978,2.5434782608695654,18.94927536231884],"storedFields":{"0":{"title":"JSON 报告","titles":[]},"1":{"title":"报告内容","titles":["JSON 报告"]},"2":{"title":"整体结构","titles":["JSON 报告","报告内容"]},"3":{"title":"Environment","titles":["JSON 报告","报告内容"]},"4":{"title":"Summary","titles":["JSON 报告","报告内容"]},"5":{"title":"Collectors","titles":["JSON 报告","报告内容"]},"6":{"title":"Tests","titles":["JSON 报告","报告内容"]},"7":{"title":"Warnings","titles":["JSON 报告","报告内容"]},"8":{"title":"全自动日志","titles":[]},"9":{"title":"背景","titles":["全自动日志"]},"10":{"title":"实现原理","titles":["全自动日志"]},"11":{"title":"日志配置","titles":["全自动日志"]},"12":{"title":"使用方法","titles":["全自动日志"]},"13":{"title":"前后钩子","titles":[]},"14":{"title":"前置钩子","titles":["前后钩子"]},"15":{"title":"前置脚本钩子","titles":["前后钩子","前置钩子"]},"16":{"title":"前置命令行入参钩子","titles":["前后钩子","前置钩子"]},"17":{"title":"后置钩子","titles":["前后钩子"]},"18":{"title":"后置脚本钩子","titles":["前后钩子","后置钩子"]},"19":{"title":"后置命令行入参钩子","titles":["前后钩子","后置钩子"]},"20":{"title":"动态等待","titles":[]},"21":{"title":"架构动态等待","titles":["动态等待"]},"22":{"title":"元素识别动态等待","titles":["动态等待"]},"23":{"title":"命令行交互","titles":[]},"24":{"title":"本机命令行交互","titles":["命令行交互"]},"25":{"title":"普通权限执行","titles":["命令行交互","本机命令行交互"]},"26":{"title":"sudo权限执行","titles":["命令行交互","本机命令行交互"]},"27":{"title":"expect交互","titles":["命令行交互","本机命令行交互"]},"28":{"title":"远程命令行交互","titles":["命令行交互"]},"29":{"title":"普通权限执行","titles":["命令行交互","远程命令行交互"]},"30":{"title":"sudo权限执行","titles":["命令行交互","远程命令行交互"]},"31":{"title":"expect交互","titles":["命令行交互","远程命令行交互"]},"32":{"title":"断言语句","titles":[]},"33":{"title":"用例中使用方法","titles":["断言语句"]},"34":{"title":"方法明细","titles":["断言语句"]},"35":{"title":"标签化管理","titles":[]},"36":{"title":"使用说明","titles":["标签化管理"]},"37":{"title":"CSV文件与脚本对应关系","titles":["标签化管理"]},"38":{"title":"跳过用例","titles":["标签化管理"]},"39":{"title":"1. 固定跳过","titles":["标签化管理","跳过用例"]},"40":{"title":"2. 条件判断跳过","titles":["标签化管理","跳过用例"]},"41":{"title":"3.自定义跳过","titles":["标签化管理","跳过用例"]},"42":{"title":"确认修复","titles":["标签化管理"]},"43":{"title":"废弃用例","titles":["标签化管理"]},"44":{"title":"文件格式","titles":["标签化管理"]},"45":{"title":"远程交互式控制","titles":[]},"46":{"title":"slaves对象提供远程机器信息","titles":["远程交互式控制"]},"47":{"title":"UI操作远程对象","titles":["远程交互式控制"]},"48":{"title":"RpcGui","titles":["远程交互式控制","UI操作远程对象"]},"49":{"title":"原生环境","titles":[]},"50":{"title":"虚拟环境","titles":[]},"51":{"title":"youqu3-cargo","titles":["虚拟环境"]},"52":{"title":"youqu3-shell","titles":["虚拟环境"]},"53":{"title":"youqu3-rm","titles":["虚拟环境"]},"54":{"title":"YouQu3 能做什么?","titles":[null]},"55":{"title":"快速开始","titles":[]},"56":{"title":"安装","titles":["快速开始"]},"57":{"title":"创建用例工程","titles":["快速开始"]},"58":{"title":"本地执行","titles":[]},"59":{"title":"子命令","titles":["本地执行"]},"60":{"title":"用例驱动方式","titles":["本地执行"]},"61":{"title":"执行所有用例","titles":["本地执行","用例驱动方式"]},"62":{"title":"指定执行某一个用例","titles":["本地执行","用例驱动方式"]},"63":{"title":"指定某个目录执行","titles":["本地执行","用例驱动方式"]},"64":{"title":"根据关键词执行","titles":["本地执行","用例驱动方式"]},"65":{"title":"根据标签执行","titles":["本地执行","用例驱动方式"]},"66":{"title":"批量用例ID驱动执行","titles":["本地执行","用例驱动方式"]},"67":{"title":"指定用例文件路径执行","titles":["本地执行","用例驱动方式"]},"68":{"title":"自定义执行","titles":[]},"69":{"title":"youqu-tags.txt","titles":["自定义执行"]},"70":{"title":"youqu-keywords.txt","titles":["自定义执行"]},"71":{"title":"远程执行","titles":[]},"72":{"title":"子命令","titles":["远程执行"]},"73":{"title":"远程测试机分组策略","titles":["远程执行"]},"74":{"title":"分组规则","titles":["远程执行","远程测试机分组策略"]},"75":{"title":"执行策略","titles":["远程执行","远程测试机分组策略"]},"76":{"title":"pdocr-rpc","titles":[]},"77":{"title":"1、服务端","titles":["pdocr-rpc"]},"78":{"title":"服务端安装","titles":["pdocr-rpc","1、服务端"]},"79":{"title":"服务端启动服务","titles":["pdocr-rpc","1、服务端"]},"80":{"title":"2、客户端","titles":["pdocr-rpc"]},"81":{"title":"客户端安装","titles":["pdocr-rpc","2、客户端"]},"82":{"title":"客户端使用","titles":["pdocr-rpc","2、客户端"]},"83":{"title":"2.1、识别当前屏幕的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"84":{"title":"2.2、指定某张图片识别的所有文字内容","titles":["pdocr-rpc","2、客户端","客户端使用"]},"85":{"title":"2.3、在全屏指定查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"86":{"title":"2.4、指定某张图片查找某个字符串的坐标","titles":["pdocr-rpc","2、客户端","客户端使用"]},"87":{"title":"2.5、其他参数","titles":["pdocr-rpc","2、客户端","客户端使用"]},"88":{"title":"FunnyLog","titles":[]},"89":{"title":"安装","titles":["FunnyLog"]},"90":{"title":"使用方法","titles":["FunnyLog"]},"91":{"title":"1、自动输出日志","titles":["FunnyLog","使用方法"]},"92":{"title":"2、方法中输出其他的日志","titles":["FunnyLog","使用方法"]},"93":{"title":"3、在外层其他直接使用","titles":["FunnyLog","使用方法"]},"94":{"title":"必要配置项","titles":["FunnyLog"]},"95":{"title":"YouQu3 插件汇总信息","titles":[null]},"96":{"title":"UOS 自动化测试方法套件(UMTK)","titles":[]},"97":{"title":"1. 简介","titles":["UOS 自动化测试方法套件(UMTK)"]},"98":{"title":"2. 工程设计","titles":["UOS 自动化测试方法套件(UMTK)"]},"99":{"title":"2.1. 工程结构","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"100":{"title":"2.2. 方案说明","titles":["UOS 自动化测试方法套件(UMTK)","2. 工程设计"]},"101":{"title":"3. 套件发布","titles":["UOS 自动化测试方法套件(UMTK)"]},"102":{"title":"4. 套件维护","titles":["UOS 自动化测试方法套件(UMTK)"]},"103":{"title":"5. 对套件的测试","titles":["UOS 自动化测试方法套件(UMTK)"]},"104":{"title":"6. UMTK 和 YouQu2 的公共方法库(public)有何区别","titles":["UOS 自动化测试方法套件(UMTK)"]},"105":{"title":"UOS 自动化测试用例","titles":[]},"106":{"title":"1. 简介","titles":["UOS 自动化测试用例"]},"107":{"title":"2. 工程设计","titles":["UOS 自动化测试用例"]},"108":{"title":"2.1. 工程结构","titles":["UOS 自动化测试用例","2. 工程设计"]},"109":{"title":"2.2. 方案说明","titles":["UOS 自动化测试用例","2. 工程设计"]},"110":{"title":"YouQu3 架构设计规划","titles":[]},"111":{"title":"1. 背景","titles":["YouQu3 架构设计规划"]},"112":{"title":"2. 目标","titles":["YouQu3 架构设计规划"]},"113":{"title":"3. 架构设计","titles":["YouQu3 架构设计规划"]},"114":{"title":"3.1. 总体方案","titles":["YouQu3 架构设计规划","3. 架构设计"]},"115":{"title":"3.2. 架构设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"116":{"title":"3.3. 整体数据流","titles":["YouQu3 架构设计规划","3. 架构设计"]},"117":{"title":"3.4. 详细设计","titles":["YouQu3 架构设计规划","3. 架构设计"]},"118":{"title":"3.4.1. 驱动执行管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"119":{"title":"3.4.2. 配置项管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"120":{"title":"3.4.3. 框架总线接口","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"121":{"title":"3.4.4. 按测试类型管理插件","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"122":{"title":"3.4.5. 环境依赖管理","titles":["YouQu3 架构设计规划","3. 架构设计","3.4. 详细设计"]},"123":{"title":"4. 用例工程设计","titles":["YouQu3 架构设计规划"]},"124":{"title":"4.1. 用例工程结构","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"125":{"title":"4.2. 各模块编写思路","titles":["YouQu3 架构设计规划","4. 用例工程设计"]},"126":{"title":"4.2.1. 方法层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"127":{"title":"4.2.2. 用例层","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"128":{"title":"4.2.3. 断言","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"129":{"title":"4.2.4. 配置对象","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"130":{"title":"4.2.5. 用例标签管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"131":{"title":"4.2.6. 默认环境变量管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"132":{"title":"4.2.7. 依赖管理文件","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"133":{"title":"4.2.8. 调试用例驱动","titles":["YouQu3 架构设计规划","4. 用例工程设计","4.2. 各模块编写思路"]},"134":{"title":"5. 演进规划","titles":["YouQu3 架构设计规划"]},"135":{"title":"可视化配置","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"136":{"title":"非开发者下运行","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]},"137":{"title":"过程钩子","titles":["YouQu3 架构设计规划","5. 演进规划","4.2. 各模块编写思路"]}},"dirtCount":0,"index":[["即可自动被框架加载并执行",{"2":{"137":1}}],["即默认返回识别到字符串的中心坐标",{"2":{"87":1}}],["过程钩子",{"0":{"137":1}}],["过程中如果根据需要出小版本",{"2":{"101":1}}],["减少系统自动化环境准备的难度",{"2":{"136":1}}],["非开发者下运行",{"0":{"136":1}}],["配合远程执行功能",{"2":{"135":1}}],["配置对象",{"0":{"129":1}}],["配置模块",{"2":{"124":1}}],["配置文件管理配置项",{"2":{"119":1}}],["配置类",{"2":{"119":1,"129":1}}],["配置项管理",{"0":{"119":1},"2":{"119":1}}],["页面化的配置功能",{"2":{"135":1}}],["演进规划",{"0":{"134":1},"1":{"135":1,"136":1,"137":1}}],["模式运行脚本",{"2":{"133":1}}],["模块",{"2":{"118":1}}],["模块化改造",{"2":{"112":1}}],["模块名称为应用包名",{"2":{"100":1,"109":1}}],["模块名称",{"2":{"64":1}}],["定义用例工程所需要的依赖包",{"2":{"132":1}}],["定义虚拟环境相关的一些环境变量",{"2":{"131":1}}],["运行的行为",{"2":{"131":1}}],["运行稳定性",{"2":{"112":1}}],["日常维护过程中",{"2":{"130":1}}],["日志文件的生成路径",{"2":{"94":1}}],["日志",{"2":{"92":3}}],["日志模板语法",{"2":{"12":1}}],["日志配置",{"0":{"11":1}}],["维护标签时",{"2":{"130":1}}],["维护方法的稳定性有效性将成为一个问题",{"2":{"103":1}}],["然后",{"2":{"128":1}}],["然后将这些基础能力通过",{"2":{"45":1}}],["任务栏点击文件管理器",{"2":{"126":1}}],["\\t\\tself",{"2":{"128":1}}],["\\t",{"2":{"126":1}}],["\\tdef",{"2":{"126":1}}],["弹窗",{"2":{"126":1}}],["左边视图区域",{"2":{"126":1}}],["右边视图区域",{"2":{"126":1}}],["标题栏",{"2":{"126":1}}],["标签驱动",{"2":{"114":1}}],["标签驱动支持",{"2":{"65":1}}],["标签",{"2":{"65":1}}],["标签记录为",{"2":{"40":1}}],["标签可以无序",{"2":{"37":1}}],["标签化管理",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1,"40":1,"41":1,"42":1,"43":1,"44":1}}],["进行编写",{"2":{"126":1}}],["进行分割",{"2":{"41":1}}],["按照",{"2":{"126":1}}],["按测试类型管理插件",{"0":{"121":1}}],["放置在对应的类里面",{"2":{"126":1}}],["设计思想",{"2":{"126":1}}],["设计模式",{"2":{"100":1,"114":1}}],["依赖管理文件",{"0":{"132":1},"2":{"124":1}}],["调试用例驱动",{"0":{"133":1}}],["调试用例驱动脚本",{"2":{"124":1}}],["调用所有的断言语句",{"2":{"33":1}}],["调用方法时",{"2":{"12":1}}],["图像识别方法所需要的资源",{"2":{"124":1}}],["图片路径",{"2":{"34":2}}],["上层用例就能通过框架动态调用插件提供的功能",{"2":{"120":1}}],["插槽",{"2":{"120":1}}],["插件如果已经安装",{"2":{"120":1}}],["插件",{"2":{"116":1}}],["插件汇总信息",{"0":{"95":1}}],["原则上不通过修改配置文件的方式修改",{"2":{"119":1}}],["原生环境虚拟环境",{"2":{"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["原生环境",{"0":{"49":1}}],["公共配置为框架提供的一些具有默认值的配置项",{"2":{"119":1}}],["公共配置的形式",{"2":{"119":1}}],["显示的传入参数值",{"2":{"119":1}}],["采用虚拟环境管理依赖项",{"2":{"122":1}}],["采用命令行参数",{"2":{"119":1}}],["采用全新的架构设计",{"2":{"104":1}}],["解析测试策略",{"2":{"118":1}}],["解除跳过时将装饰器代码删掉",{"2":{"38":1}}],["获取命令行参数并结合配置项",{"2":{"118":1}}],["获取被装饰的类下所有函数",{"2":{"10":1}}],["驱动",{"2":{"118":1}}],["驱动命令将命令行参数传递给框架底层",{"2":{"118":1}}],["驱动执行管理",{"0":{"118":1}}],["驱动执行",{"2":{"63":1}}],["详细介绍各功能模块的设计和编写思路",{"2":{"125":1}}],["详细描述各模块工作方式",{"2":{"117":1}}],["详细设计",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1}}],["抛异常程序终止",{"2":{"116":1}}],["否则提示用户进行安装",{"2":{"116":1}}],["否则会提示无法连接",{"2":{"72":1}}],["底层功能",{"2":{"116":1}}],["让用户能专注于用例逻辑的编写和维护",{"2":{"114":1}}],["管理",{"2":{"114":1}}],["资源目录",{"2":{"114":1}}],["生成的用例工程遵循完整的",{"2":{"114":1}}],["三方包的形式提供",{"2":{"114":1}}],["由用例层决定使用哪些功能对应安装哪些插件",{"2":{"114":1}}],["由于虚拟环境中也安装了",{"2":{"52":1}}],["由于需求变更",{"2":{"43":1}}],["总体方案",{"0":{"114":1}}],["互不影响",{"2":{"112":1}}],["提高",{"2":{"112":1}}],["提高用例开发效率",{"2":{"112":1}}],["提供一个",{"2":{"135":1}}],["提供可调用的配置对象config",{"2":{"124":1}}],["提供的一个全局对象",{"2":{"46":1}}],["提供灵活的前后钩子机制",{"2":{"13":1}}],["安全性稳定性更好",{"2":{"112":1}}],["安装",{"0":{"56":1,"89":1},"2":{"101":1}}],["降低使用门槛",{"2":{"112":1}}],["价值",{"2":{"112":1}}],["简化系统环境部署",{"2":{"112":1}}],["简介",{"0":{"97":1,"106":1}}],["搭配远程执行功能",{"2":{"112":1}}],["功能插件可插拔",{"2":{"114":1}}],["功能扩展性更好",{"2":{"112":1}}],["功能可插拔",{"2":{"112":1}}],["功能强大的自动化测试框架",{"2":{"111":1}}],["功能强大的日志工具",{"2":{"88":1}}],["极致轻量化",{"2":{"112":1}}],["诸多亮点功能的同时解决其遇到的问题",{"2":{"112":1}}],["扩展性和兼容性更好的自动化测试框架",{"2":{"111":1}}],["更贴合大部分真实用户的使用场景",{"2":{"136":1}}],["更新",{"2":{"112":1}}],["更加纯粹",{"2":{"111":1}}],["更重要的是我们不想引入三方依赖",{"2":{"44":1}}],["甚至有些问题在现有框架结构下根本无法解决",{"2":{"111":1}}],["业务流程有一些影响",{"2":{"111":1}}],["业务不同",{"2":{"104":1}}],["势必对现有公司自动化用例",{"2":{"111":1}}],["等等",{"2":{"111":1}}],["绑定了太多公司的业务",{"2":{"111":1}}],["导致框架代码容易被用户修改",{"2":{"111":1}}],["源代码暴露在用户面前",{"2":{"111":1}}],["每次使用需要初始化框架工程及单独做环境部署",{"2":{"111":1}}],["每个应用存在一个唯一的出口文件",{"2":{"100":1}}],["每个机器执行",{"2":{"75":1}}],["每个模块建立一个",{"2":{"37":1}}],["每个用例的详细结果",{"2":{"6":1}}],["仍然存在一些不尽人意的地方",{"2":{"111":1}}],["小版本更新了数十个",{"2":{"111":1}}],["两个大版本",{"2":{"111":1}}],["两对大括号中的内容",{"2":{"12":1}}],["月在欧拉社区开源",{"2":{"111":1}}],["月正式在",{"2":{"111":1}}],["社区开源",{"2":{"111":1}}],["年",{"2":{"111":2}}],["年多的持续开发优化",{"2":{"111":1}}],["年成都测试团队开始内部孵化的项目",{"2":{"111":1}}],["经过了",{"2":{"111":1}}],["旨在成为下一代",{"2":{"112":1}}],["旨在开发一个简单易用",{"2":{"111":1}}],["旨在提供",{"2":{"106":1}}],["旨在提供系统预装应用所有的元素的操作方法",{"2":{"97":1}}],["做复杂步骤的封装",{"2":{"109":1}}],["里面导入使用",{"2":{"109":1}}],["里面的静态方法",{"2":{"91":2,"92":1}}],["里面的类方法",{"2":{"91":2}}],["里面的实例方法",{"2":{"91":2}}],["编写的",{"2":{"106":1}}],["大量人员都可以对其进行直接修改",{"2":{"104":1}}],["稳定性",{"2":{"104":2}}],["确保操作方法的一致性",{"2":{"104":1}}],["确认修复",{"0":{"42":1},"2":{"36":1,"37":1,"42":3,"43":1}}],["代码一致性",{"2":{"104":1}}],["代表不跳过",{"2":{"41":1}}],["代表跳过",{"2":{"41":1}}],["容易受到需求变更",{"2":{"104":1}}],["仅包含自动化用例用到的少部分公共方法",{"2":{"104":1}}],["仅驱动执行这一条用例",{"2":{"62":1}}],["涵盖了",{"2":{"104":1}}],["范围覆盖很少",{"2":{"104":1}}],["范围",{"2":{"104":1}}],["内外部开发者们的认可",{"2":{"111":1}}],["内容",{"2":{"104":1}}],["内置支持的条件跳过对象",{"2":{"40":1}}],["二者属于两个时代",{"2":{"104":1}}],["有些问题处理起来必然会影响到框架的兼容性",{"2":{"111":1}}],["有效性没有保障",{"2":{"104":1}}],["有效性",{"2":{"104":1}}],["有很大差异",{"2":{"104":1}}],["有何区别",{"0":{"104":1}}],["亦各从其志也",{"2":{"104":1}}],["道",{"2":{"104":1}}],["卫灵公",{"2":{"104":1}}],["论语",{"2":{"104":1}}],["孔子",{"2":{"104":1}}],["适合有离线部署需求的用户",{"2":{"112":1}}],["适配厂商可以直接使用这些单元测试进行适配测试",{"2":{"103":1}}],["适用于气泡类的断言",{"2":{"34":1}}],["专门针对元素操作方法函数进行测试",{"2":{"103":1}}],["对象的属性值",{"2":{"119":1}}],["对纯",{"2":{"111":1}}],["对套件的测试",{"0":{"103":1}}],["对于用例规模比较大的应用",{"2":{"37":1}}],["鼓励内外部开发者贡献",{"2":{"102":1}}],["发布",{"2":{"101":1}}],["发布一个套件版本",{"2":{"101":2}}],["阶段",{"2":{"101":1}}],["套件里面保存元素的操作方法",{"2":{"103":1}}],["套件由专人主责维护",{"2":{"102":1}}],["套件维护",{"0":{"102":1}}],["套件通过",{"2":{"101":1}}],["套件持续保持更新",{"2":{"101":1}}],["套件分大版本发布",{"2":{"101":1}}],["套件发布",{"0":{"101":1}}],["遵循",{"2":{"100":1}}],["供外部用例调用",{"2":{"100":1}}],["下划线连接单词",{"2":{"100":1,"109":1}}],["下完美的键鼠工具",{"2":{"95":1}}],["方便用例开发者以",{"2":{"133":1}}],["方便安装",{"2":{"112":1}}],["方案说明",{"0":{"100":1,"109":1}}],["方法唯一出口类",{"2":{"124":1}}],["方法基类",{"2":{"124":1}}],["方法层按需导入框架提供的底层能力",{"2":{"126":1}}],["方法层",{"0":{"126":1}}],["方法层目录",{"2":{"124":1}}],["方法层基础代码自动生成",{"2":{"114":1}}],["方法层所有的函数",{"2":{"12":1}}],["方法代码",{"2":{"114":1}}],["方法增删改的详细数据",{"2":{"95":1}}],["方法里面仍然可以单独打印日志",{"2":{"92":1}}],["方法中输出其他的日志",{"0":{"92":1}}],["方法只能有一个入参",{"2":{"41":1}}],["方法必须有返回结果并且为布尔值",{"2":{"41":1}}],["方法名必须以",{"2":{"41":1}}],["方法编写规范",{"2":{"41":1}}],["方法明细",{"0":{"34":1}}],["方法库里面",{"2":{"12":1}}],["方法",{"2":{"10":1}}],["└──",{"2":{"99":4,"108":5,"124":3}}],["工程结构",{"0":{"99":1,"108":1}}],["工程设计",{"0":{"98":1,"107":1},"1":{"99":1,"100":1,"108":1,"109":1}}],["工程自有断言模块",{"2":{"33":1}}],["组装成自动化测试用例",{"2":{"97":1}}],["测试方法套件中所有的方法均为原子操作",{"2":{"100":1}}],["测试方法套件是一个独立项目",{"2":{"97":1}}],["测试单驱动插件",{"2":{"95":1}}],["系统中各应用在",{"2":{"109":1}}],["系统中各应用划分自己的模块",{"2":{"100":1}}],["系统所有预装应用的测试用例",{"2":{"106":1}}],["系统所有预装应用的原子操作方法",{"2":{"104":1}}],["系统级测试用例",{"2":{"106":1}}],["系统自动化测试操作方法套件",{"2":{"97":1}}],["系统显示协议跳过",{"2":{"40":1}}],["全面插件化模块化",{"2":{"112":1}}],["全面优化框架接口调用机制",{"2":{"112":1}}],["全称",{"2":{"97":1}}],["全自动日志插件",{"2":{"95":1}}],["全自动日志",{"0":{"8":1},"1":{"9":1,"10":1,"11":1,"12":1}}],["将基于youqu2的用例代码修改为youqu3",{"2":{"95":1}}],["将跳过用例操作也整合进入用例标签",{"2":{"38":1}}],["迁移工具",{"2":{"95":1}}],["相对位移元素定位方案的配置文件",{"2":{"124":1}}],["相对位移定位插件",{"2":{"95":1}}],["相册的用例文件为",{"2":{"37":1}}],["操作系统环境支持不够友好",{"2":{"111":1}}],["操作系统预装应用的元素操作方法套件",{"2":{"97":1}}],["操作较为复杂",{"2":{"111":1}}],["操作或命令行操作",{"2":{"45":1}}],["操控插件",{"2":{"95":1}}],["键鼠操作插件",{"2":{"95":1}}],["✔️",{"2":{"95":14}}],["属性定位插件",{"2":{"95":1}}],["级别",{"2":{"94":1}}],["你可以配置为其他位置",{"2":{"94":1}}],["你可以使用它进行用例的驱动执行和管理",{"2":{"49":1}}],["必要配置项",{"0":{"94":1}}],["终端输出",{"2":{"91":1,"92":1,"93":1}}],["终端输出的日志级别",{"2":{"11":1}}],["直接调用基类里面的方法",{"2":{"91":1}}],["我是",{"2":{"91":6,"92":1}}],["我们可以将界面分为四个区域",{"2":{"126":1}}],["我们想要设计开发一个更加简单易用",{"2":{"111":1}}],["我们需要建立对套件的自动化测试",{"2":{"103":1}}],["我们设计出了",{"2":{"9":1}}],["我们发现",{"2":{"9":1}}],["其中所有的用例步骤都应该调用方法层对应的方法",{"2":{"127":1}}],["其中有一张图片识别成功即返回结果",{"2":{"34":1}}],["其他人可以提需求",{"2":{"102":1}}],["其他参数",{"0":{"87":1}}],["天天向上",{"2":{"85":2,"86":1}}],["天真",{"2":{"9":1}}],["客户端使用",{"0":{"82":1},"1":{"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端安装",{"0":{"81":1}}],["客户端",{"0":{"80":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1}}],["客户端提供了一个简单易用的函数",{"2":{"76":1}}],["写入以下内容",{"2":{"79":1}}],["名称你可以自定义",{"2":{"79":1}}],["随意新建一个py文件",{"2":{"79":1}}],["封装的",{"2":{"76":1,"97":1}}],["个机器瓜分",{"2":{"75":1}}],["个测试机",{"2":{"75":1}}],["个组",{"2":{"74":1}}],["都同时执行",{"2":{"75":1}}],["都不需要再写日志代码",{"2":{"12":1}}],["条",{"2":{"75":2}}],["条用例",{"2":{"75":2}}],["条件判断组合",{"2":{"41":1}}],["条件判断跳过",{"0":{"40":1}}],["假设总共",{"2":{"75":1}}],["同事们",{"2":{"111":1}}],["同样可以进行配置修改",{"2":{"94":1}}],["同一组内瓜分执行",{"2":{"75":1}}],["同时定义一些用例工程相关的配置",{"2":{"129":1}}],["同时框架可以在中间件中对插件功能进行增强或修改",{"2":{"120":1}}],["同时对各功能进行插件化",{"2":{"112":1}}],["同时选择多个环境",{"2":{"56":1}}],["同时标记了skip",{"2":{"42":1}}],["规则概述",{"2":{"75":1}}],["一键生成用例工程模板代码",{"2":{"114":1}}],["一些底层模块或接口命名不优雅",{"2":{"111":1}}],["一对大括号表示一个组",{"2":{"74":1}}],["一个元素一个方法",{"2":{"126":1}}],["一个页面一个类",{"2":{"126":1}}],["一个简单易用",{"2":{"88":1}}],["一个应用含有大量的操作函数",{"2":{"9":1}}],["一个函数里面至少包含一条日志信息",{"2":{"9":1}}],["分组规则",{"0":{"74":1}}],["分割",{"2":{"46":1}}],["服务的",{"2":{"95":1}}],["服务的图像识别插件",{"2":{"95":1}}],["服务的方式提供出来",{"2":{"45":1}}],["服务端启动服务",{"0":{"79":1}}],["服务端安装",{"0":{"78":1}}],["服务端",{"0":{"77":1},"1":{"78":1,"79":1}}],["服务",{"2":{"72":1,"76":1}}],["开发",{"2":{"104":1}}],["开启",{"2":{"72":1}}],["开头",{"2":{"41":1}}],["开头的",{"2":{"11":1}}],["如",{"2":{"69":1,"114":1,"129":1}}],["如果一个页面元素操作比较多",{"2":{"126":1}}],["如果一个应用存在多个页面",{"2":{"126":1}}],["如果涉及到复杂步骤的封装",{"2":{"109":1}}],["如果要修改识别语言",{"2":{"87":1}}],["如果存在多个",{"2":{"85":1}}],["如果你想修改端口",{"2":{"79":1}}],["如果你想执行这个",{"2":{"62":1}}],["如果应用受到新需求影响需要跳过",{"2":{"39":1}}],["如果不传默认截取全屏识别",{"2":{"34":1}}],["如果不传参",{"2":{"34":1}}],["如果用常规的图像识别则有可能无法识别到",{"2":{"34":1}}],["如果比较复杂操作步骤",{"2":{"9":1}}],["会自动加载并执行",{"2":{"69":1}}],["会自动生成一个命令",{"2":{"49":1,"50":1}}],["支持对用例执行的各个阶段插入钩子",{"2":{"137":1}}],["支持对各种测试策略的驱动执行",{"2":{"135":1}}],["支持对依赖环境进行一键打包",{"2":{"122":1}}],["支持用例目录或文件路径驱动执行",{"2":{"118":1}}],["支持基于关键词驱动用例执行",{"2":{"118":1}}],["支持基于测试单驱动插件驱动用例执行",{"2":{"118":1}}],["支持基于用例标签化管理驱动用例执行",{"2":{"118":1}}],["支持本地和远程执行模式",{"2":{"118":1}}],["支持多种用例驱动模式",{"2":{"114":1}}],["支持非开发者下运行",{"2":{"112":1}}],["支持离线部署",{"2":{"112":1}}],["支持在非开发着环境下运行用例",{"2":{"136":1}}],["支持在",{"2":{"68":1}}],["支持类名包含",{"2":{"11":1}}],["支持类名以",{"2":{"11":2}}],["加引号",{"2":{"67":1}}],["加上装饰器",{"2":{"12":1}}],["批量用例id驱动执行",{"0":{"66":1}}],["特有的",{"2":{"65":1}}],["特殊标签",{"2":{"37":1}}],["表达式",{"2":{"64":1,"65":1}}],["表示返回识别到的第一个",{"2":{"87":1}}],["表示用例的id",{"2":{"37":1}}],["表示识别任意一个目标字符",{"2":{"34":1}}],["表示识别所有目标字符",{"2":{"34":1}}],["关键词驱动等等",{"2":{"114":1}}],["关键词驱动支持",{"2":{"64":1}}],["关键词可以是用例对象中的任意字符",{"2":{"64":1}}],["整体数据流",{"0":{"116":1}}],["整体结构",{"0":{"2":1}}],["整个字符串中可以任意截取字符作为关键词",{"2":{"64":1}}],["且有完善的单元测试机制",{"2":{"104":1}}],["且存在较多涉及用例逻辑的复杂步骤方法",{"2":{"104":1}}],["且大小写不敏感",{"2":{"64":1}}],["且要方便能使用",{"2":{"44":1}}],["根据标签执行",{"0":{"65":1}}],["根据关键词执行",{"0":{"64":1}}],["根据不同的测试类型选择以上不同的安装命令",{"2":{"56":1}}],["根据不同的架构对等待时间进行倍数放大",{"2":{"21":1}}],["│\\t└──",{"2":{"63":1}}],["│\\t├──",{"2":{"63":1}}],["│",{"2":{"63":5,"99":5,"108":22,"124":12}}],["指定某张图片查找某个字符串的坐标",{"0":{"86":1}}],["指定某张图片识别的所有文字内容",{"0":{"84":1}}],["指定某个目录执行",{"0":{"63":1}}],["指定用例目录",{"2":{"67":1}}],["指定用例文件",{"2":{"67":1}}],["指定用例文件路径执行",{"0":{"67":1}}],["指定执行某一个用例",{"0":{"62":1}}],["本地执行子命令为",{"2":{"59":1}}],["本地执行",{"0":{"58":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["本机命令行交互",{"0":{"24":1},"1":{"25":1,"26":1,"27":1}}],["创建一个目录",{"2":{"57":1}}],["创建用例工程",{"0":{"57":1}}],["基类",{"2":{"91":3}}],["基础环境默认支持",{"2":{"56":1}}],["基础环境guiwebuihttpremote",{"2":{"56":1}}],["基于此",{"2":{"9":1}}],["基于",{"2":{"9":1,"65":1,"76":1,"95":3}}],["快速开始",{"0":{"55":1},"1":{"56":1,"57":1}}],["无限可能",{"2":{"54":1}}],["🤙️",{"2":{"54":1}}],["接口自动化测试",{"2":{"54":2}}],["接口从而控制远程机器执行用例步骤",{"2":{"45":1}}],["🔥",{"2":{"95":1}}],["🚧",{"2":{"95":3}}],["🕷️",{"2":{"54":1}}],["🚀",{"2":{"54":1}}],["🚌",{"2":{"54":1}}],["💻",{"2":{"54":1}}],["🌏",{"2":{"54":1}}],["桌面应用",{"2":{"54":1}}],["☑",{"2":{"54":6}}],["能满足公司对自动化测试的业务需求",{"2":{"111":1}}],["能做什么",{"0":{"54":1}}],["能不能基于框架执行时",{"2":{"9":1}}],["$",{"2":{"52":1}}],["v25",{"2":{"101":1}}],["v20",{"2":{"101":2}}],["video",{"2":{"95":1}}],["virtualenv",{"2":{"52":1}}],["values",{"2":{"34":3}}],["删除虚拟环境",{"2":{"50":1}}],["激活虚拟环境",{"2":{"50":1}}],["命令安装使用",{"2":{"101":1}}],["命令可以将当前的虚拟环境删除",{"2":{"53":1}}],["命令",{"2":{"50":1}}],["命令行参数可以通过驱动命令提供入参选项",{"2":{"119":1}}],["命令行自动化",{"2":{"56":1}}],["命令行自动化测试",{"2":{"54":1}}],["命令行",{"2":{"46":1}}],["命令行传递参数",{"2":{"42":1}}],["命令行交互",{"0":{"23":1},"1":{"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1}}],["执行管理器接收命令行参数并读取公共配置项驱动用例执行",{"2":{"116":1}}],["执行模式支持本地驱动执行和远程驱动执行",{"2":{"114":1}}],["执行策略",{"0":{"75":1}}],["执行前确保远程机器已经开启了",{"2":{"72":1}}],["执行包含关键词的用例",{"2":{"64":1}}],["执行所有用例",{"0":{"61":1}}],["执行之后会自动创建一些有用的命令",{"2":{"50":1}}],["执行的时候会自动输出",{"2":{"12":1}}],["子命令",{"0":{"59":1,"72":1},"2":{"50":1}}],["还可以进行环境的管理",{"2":{"50":1}}],["虚拟环境默认在用例功能根目录下创建",{"2":{"122":1}}],["虚拟环境",{"0":{"50":1},"1":{"51":1,"52":1,"53":1}}],["种方式传入",{"2":{"46":1}}],["机器信息有",{"2":{"46":1}}],["它不能脱离",{"2":{"104":1}}],["它除了可以驱动用例执行",{"2":{"50":1}}],["它保存了远程测试机的信息列表",{"2":{"46":1}}],["它继承了",{"2":{"33":1}}],["交互的基础能力",{"2":{"45":1}}],["远程测试机分组策略",{"0":{"73":1},"1":{"74":1,"75":1}}],["远程机器执行的用例相同",{"2":{"72":1}}],["远程执行使用子命令",{"2":{"72":1}}],["远程执行就是用本地作为服务端控制远程机器执行",{"2":{"72":1}}],["远程执行",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["远程交互式控制",{"0":{"45":1},"1":{"46":1,"47":1,"48":1}}],["远程命令行交互",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["打开进行编辑查看",{"2":{"44":1}}],["此配置文件需要维护大量的标签数据",{"2":{"44":1}}],["此时会抛异常",{"2":{"120":1}}],["此时",{"2":{"37":1}}],["已废弃",{"2":{"43":1}}],["已修复",{"2":{"42":2,"43":1}}],["废弃原因",{"2":{"43":1}}],["废弃用例是特殊的标签",{"2":{"37":1}}],["废弃用例",{"0":{"43":1},"2":{"36":1,"43":2}}],["该列存在",{"2":{"43":1}}],["环境依赖管理",{"0":{"122":1}}],["环境依赖管理等相关功能的目录文件也都一键生成",{"2":{"114":1}}],["环境依赖可以一键打包交付",{"2":{"112":1}}],["环境以提供",{"2":{"45":1}}],["环境影响或评估不再适用于自动化测试时",{"2":{"43":1}}],["环境信息",{"2":{"3":1}}],["针对某些用例",{"2":{"43":1}}],["针对于某些用例修复后",{"2":{"42":1}}],["yes",{"2":{"42":2}}],["youqu2",{"0":{"104":1},"2":{"95":1,"104":4,"111":3,"112":1}}],["youqu",{"0":{"69":1,"70":1},"2":{"46":1,"65":1,"68":2,"69":3,"95":9,"111":1}}],["youqu3",{"0":{"51":1,"52":1,"53":1,"54":1,"95":1,"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1},"2":{"9":2,"12":2,"13":1,"21":1,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"32":1,"33":3,"34":10,"45":1,"48":1,"49":2,"50":5,"51":1,"52":5,"53":1,"56":6,"57":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"68":1,"69":1,"72":2,"75":2,"95":3,"97":1,"104":2,"106":1,"109":1,"111":1,"112":1,"114":1,"116":2,"118":1,"119":1,"123":1,"126":1,"128":2,"129":1}}],["you",{"2":{"16":1,"19":1}}],["中间件",{"2":{"120":1}}],["中用例增删改",{"2":{"95":1}}],["中文",{"2":{"87":1}}],["中同时填入后",{"2":{"42":1}}],["中的任意一个",{"2":{"34":1}}],["当传入要查找的字符串时",{"2":{"87":1}}],["当系统中安装了",{"2":{"49":1,"50":1}}],["当",{"2":{"42":1}}],["固定填入字段为",{"2":{"42":1}}],["固定跳过",{"0":{"39":1}}],["作为父类被",{"2":{"128":1}}],["作为标记该用例是否已经修复",{"2":{"42":1}}],["作为变量输出出来了",{"2":{"12":1}}],["新增一列标签名为",{"2":{"42":1}}],["但若用例层调用了此插件提供的功能",{"2":{"120":1}}],["但",{"2":{"111":1}}],["但仍然想要跳过用例",{"2":{"42":1}}],["但不能立即删除跳过原因",{"2":{"42":1}}],["但标签化管理的核心目的是集中化管理用例的标签",{"2":{"37":1}}],["推荐统一使用",{"2":{"41":1}}],["连接符号不可使用下划线和逗号",{"2":{"41":1}}],["连接服务器重试次数",{"2":{"34":1}}],["若插件没有被安装",{"2":{"120":1}}],["若插件已经安装",{"2":{"116":1}}],["若需要多个",{"2":{"41":1}}],["若函数需要多个参数",{"2":{"41":1}}],["若是",{"2":{"40":1}}],["重要",{"2":{"41":1}}],["重试间隔时间",{"2":{"34":1}}],["截取的左侧字符串作为函数名",{"2":{"41":1}}],["截取屏幕图片的间隔时间",{"2":{"34":1}}],["截取屏幕图片的时间",{"2":{"34":1}}],["korean",{"2":{"87":1}}],["k",{"2":{"62":4,"63":2,"64":2}}],["klvvw5821",{"2":{"40":1}}],["klvv",{"2":{"40":1}}],["keywords",{"0":{"70":1},"2":{"6":1,"68":1}}],["符号将两个方法分开",{"2":{"41":1}}],["符号",{"2":{"40":1,"41":1}}],["剔除中横线和",{"2":{"40":1}}],["型号",{"2":{"40":1}}],["查看机器的",{"2":{"40":1}}],["查找图片",{"2":{"12":2}}],["说明",{"2":{"40":1,"50":1}}],["则正常调用",{"2":{"116":1}}],["则返回一个字典",{"2":{"85":1}}],["则用例不会执行",{"2":{"43":1}}],["则用例不执行",{"2":{"41":1}}],["则新增一列标签名为",{"2":{"43":1}}],["则代码不会执行该条用例",{"2":{"42":1}}],["则执行该用例",{"2":{"41":1}}],["则跳过用例不执行",{"2":{"40":1}}],["则在此列备注具体的跳过原因",{"2":{"39":1}}],["或者",{"2":{"40":1}}],["判断当前架构是否为",{"2":{"40":1}}],["拼接",{"2":{"40":1}}],["多个用例文件",{"2":{"67":1}}],["多个机器信息用",{"2":{"46":1}}],["多个架构之间使用",{"2":{"40":1}}],["多个参数以逗号隔开",{"2":{"11":3}}],["架构设计",{"0":{"113":1,"115":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["架构设计规划",{"0":{"110":1},"1":{"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1}}],["架构不跳过",{"2":{"40":1}}],["架构跳过",{"2":{"40":1}}],["架构名",{"2":{"40":1}}],["架构动态等待",{"0":{"21":1}}],["常见的场景为在不同架构上判断是否执行",{"2":{"40":1}}],["某些用例会因为不同的环境判断用例是否执行",{"2":{"40":1}}],["参数",{"2":{"40":2}}],["参数值可以传递任意命令行命令",{"2":{"16":1,"19":1}}],["最后所有的用例类均继承",{"2":{"128":1}}],["最终的用例状态会被标签为",{"2":{"39":1}}],["最大匹配次数",{"2":{"34":1}}],["最大匹配超时",{"2":{"34":1}}],["受到某新需求影响",{"2":{"39":1,"42":1,"43":1}}],["各模块编写思路",{"0":{"125":1},"1":{"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1}}],["各功能以插件的方式接入",{"2":{"114":1}}],["各种代码风格不统一",{"2":{"104":1}}],["各种用例标签",{"2":{"39":1,"40":1,"42":1,"43":1}}],["各架构倍数",{"2":{"21":1}}],["示例",{"2":{"39":1,"40":1,"42":1}}],["而通过",{"2":{"38":1}}],["传统跳过用例的方式是在用例脚本里面给用例添加装饰器",{"2":{"38":1}}],["传统的日志输出方式",{"2":{"9":1}}],["跳过对象",{"2":{"40":1}}],["跳过的原因标签为",{"2":{"40":1}}],["跳过的原因统一标签开头为",{"2":{"39":1}}],["跳过用例可以直接通过修改",{"2":{"130":1}}],["跳过用例",{"0":{"38":1},"1":{"39":1,"40":1,"41":1}}],["跳过原因一栏中填写为",{"2":{"40":1}}],["跳过原因",{"2":{"36":1,"37":1,"38":1,"39":1,"40":1,"42":2,"43":1}}],["因此我们才萌生了对框架结构进行重新设计想法",{"2":{"111":1}}],["因此我们大胆的设想",{"2":{"9":1}}],["因此",{"2":{"103":1,"104":1}}],["因此你仍然可以在虚拟环境中使用命令",{"2":{"52":1}}],["因此若",{"2":{"37":1}}],["目标",{"0":{"112":1}}],["目标字符",{"2":{"34":1}}],["目录之间用空格分割",{"2":{"67":1}}],["目录组合",{"2":{"67":1}}],["目录下划分自己的用例模块",{"2":{"109":1}}],["目录下所有用例",{"2":{"63":1}}],["目录下",{"2":{"37":1}}],["所有的操作步骤都应该有一个对应的方法",{"2":{"126":1}}],["所有的方法按照",{"2":{"126":1}}],["所有的元素操作方法",{"2":{"100":1}}],["所有代码由专人维护",{"2":{"104":1}}],["所有方法以类的形式编写",{"2":{"100":1}}],["所有",{"2":{"37":1}}],["建议分模块",{"2":{"37":1}}],["比如",{"2":{"40":1,"41":1,"49":1,"64":1,"79":1,"101":2,"111":1,"126":2}}],["比如文件管理器",{"2":{"37":1}}],["比如气泡在1秒内消失",{"2":{"34":1}}],["后面会详细讲到",{"2":{"37":1}}],["后置命令行入参钩子",{"0":{"19":1}}],["后置脚本钩子",{"0":{"18":1}}],["后置钩子",{"0":{"17":1},"1":{"18":1,"19":1}}],["列之后的所有列都是一个用例标签",{"2":{"37":1}}],["列为",{"2":{"37":1}}],["第",{"2":{"37":1}}],["也可以对这个页面做进一步划分",{"2":{"126":1}}],["也可以方便对虚拟环境的管理和维护",{"2":{"122":1}}],["也可以是传统的",{"2":{"65":1}}],["也可以是自定义的数字代表用例序号",{"2":{"37":1}}],["也得到了公司领导",{"2":{"111":1}}],["也能自动打印",{"2":{"91":1}}],["也会正常执行",{"2":{"42":1}}],["也就是说我们需要写大量的日志代码",{"2":{"9":1}}],["举例",{"2":{"37":1}}],["取中间的名称作为",{"2":{"37":1}}],["去掉用例序号后的字符串",{"2":{"37":1}}],["quot",{"2":{"37":2,"56":2,"64":2,"66":2}}],["以便方法或用例中能够获取到",{"2":{"129":1}}],["以此控制虚拟环境创建",{"2":{"131":1}}],["以此来获取框架已有的公共配置",{"2":{"129":1}}],["以此类推",{"2":{"101":1}}],["以插件的形式提供功能",{"2":{"112":1}}],["以下简称测试用例",{"2":{"106":1}}],["以下简称测试方法套件",{"2":{"97":1}}],["以保持套件的各方面一致性",{"2":{"102":1}}],["以上写法表示有",{"2":{"74":1}}],["以",{"2":{"37":1,"112":1}}],["脚本文件id",{"2":{"36":1,"37":1,"39":1,"40":1}}],["脚本一样即可",{"2":{"16":1,"19":1}}],["使用更简单方便",{"2":{"112":1}}],["使用的框架不同",{"2":{"104":1}}],["使用逻辑表达式的时候一定要加引号",{"2":{"64":1,"66":1}}],["使用脚手架功能创建用例工程",{"2":{"57":1}}],["使用",{"2":{"40":1,"41":1,"101":1,"114":1}}],["使用说明",{"0":{"36":1}}],["使用方法很简单",{"2":{"12":1}}],["使用方法",{"0":{"12":1,"90":1},"1":{"91":1,"92":1,"93":1}}],["+",{"2":{"34":2,"40":1,"119":1}}],["`japan`",{"2":{"34":1}}],["`korean`",{"2":{"34":1}}],["`german`",{"2":{"34":1}}],["`fr`",{"2":{"34":1}}],["`en`",{"2":{"34":1}}],["`ch`",{"2":{"34":1}}],["返回原始数据",{"2":{"87":1}}],["返回当前屏幕中",{"2":{"85":1}}],["返回识别图片",{"2":{"84":1}}],["返回识别到的所有数据",{"2":{"34":1}}],["返回",{"2":{"41":2}}],["返回图片中识别到的所有字符串",{"2":{"34":1}}],["只需要在这里挂一个装饰器",{"2":{"91":1,"92":1,"93":1}}],["只需要在出口文件加上类装饰器",{"2":{"12":1}}],["只需要加一个装饰器",{"2":{"88":1}}],["只返回第一个",{"2":{"34":1,"87":1}}],["要识别的图片路径",{"2":{"34":1}}],["要识别的模板图片",{"2":{"34":1}}],["并提示用户安装对应插件",{"2":{"120":1}}],["并根据需要将测试结果",{"2":{"116":1}}],["并动态加载",{"2":{"116":1}}],["并在系统关键节点发布对应的版本",{"2":{"101":1}}],["并将截取的右侧作为参数传递给该函数",{"2":{"41":1}}],["并返回其在图片中的坐标",{"2":{"34":1}}],["并且所有调用的方法会以",{"2":{"12":1}}],["识别插件",{"2":{"95":1}}],["识别语言",{"2":{"87":1}}],["识别当前屏幕的所有文字内容",{"0":{"83":1}}],["识别一个字符串或多个字符串",{"2":{"34":1}}],["识别率",{"2":{"34":1}}],["结果",{"2":{"34":2}}],["结尾的",{"2":{"11":1}}],["预期值",{"2":{"34":4}}],["不需要修改用例脚本",{"2":{"130":1}}],["不需要用户去了解和思考哪些插件适合哪种测试类型",{"2":{"121":1}}],["不再提供",{"2":{"119":1}}],["不安装插件的情况下框架也能正常运行",{"2":{"112":1}}],["不适合对外开源发布",{"2":{"104":1}}],["不涉及用例逻辑",{"2":{"104":1}}],["不受需求变更影响",{"2":{"104":1}}],["不兼容",{"2":{"104":1}}],["不相为谋",{"2":{"104":1}}],["不同",{"2":{"104":1}}],["不同组之间相同执行",{"2":{"75":1}}],["不做复杂步骤的封装",{"2":{"100":1}}],["不存在复杂步骤的堆叠封装",{"2":{"104":1}}],["不存在",{"2":{"34":2}}],["不显示",{"2":{"5":1}}],["存在跳过标签则用例也不会被执行",{"2":{"39":1}}],["存在",{"2":{"34":2}}],["应用名字",{"2":{"34":2}}],["元素不应存在",{"2":{"34":1}}],["元素不存在",{"2":{"34":1}}],["元素识别动态等待",{"0":{"22":1}}],["匹配度",{"2":{"34":1,"87":1}}],["匹配元素的格式",{"2":{"34":2}}],["匹配相似度",{"2":{"34":2}}],["是在",{"2":{"104":1}}],["是不同的测试方法套件版本",{"2":{"101":1}}],["是基于",{"2":{"97":1,"104":1,"106":1}}],["是",{"2":{"46":1,"111":1}}],["是否分模块维护取决于应用的用例复杂度",{"2":{"37":1}}],["是否递归查找",{"2":{"34":1}}],["是类装饰器",{"2":{"12":1}}],["路径驱动",{"2":{"114":1}}],["路径",{"2":{"34":2}}],["断言",{"0":{"128":1}}],["断言方法类",{"2":{"124":1}}],["断言资源",{"2":{"124":1}}],["断言文案不存在",{"2":{"34":1}}],["断言文案存在",{"2":{"34":1}}],["断言文件不存在",{"2":{"34":1}}],["断言文件存在",{"2":{"34":1}}],["断言结果为假",{"2":{"34":1}}],["断言结果为真",{"2":{"34":1}}],["断言不相等",{"2":{"34":1}}],["断言相等",{"2":{"34":1}}],["断言应用进程不存在",{"2":{"34":1}}],["断言应用进程状态",{"2":{"34":4}}],["断言应用进程存在",{"2":{"34":1}}],["断言元素不存在",{"2":{"34":1}}],["断言元素存在",{"2":{"34":1}}],["断言语句",{"0":{"32":1},"1":{"33":1,"34":1}}],["~",{"2":{"34":2,"84":1,"86":1}}],["文件来控制用例是否跳过",{"2":{"130":1}}],["文件来管理跳过用例则会方便很多",{"2":{"38":1}}],["文件里面写标签的表达式",{"2":{"69":1}}],["文件里面跳过原因列是否存在跳过标签",{"2":{"39":1}}],["文件管理的标签",{"2":{"65":1}}],["文件管理器",{"2":{"48":1,"126":2}}],["文件几乎是唯一能满足所有的要求的文件格式",{"2":{"44":1}}],["文件格式",{"0":{"44":1}}],["文件中定义用例对象的标签",{"2":{"130":1}}],["文件中自定义用例集驱动执行",{"2":{"68":1}}],["文件中所有的用例",{"2":{"62":1}}],["文件中查找是否有同名函数",{"2":{"41":1}}],["文件中",{"2":{"40":1}}],["文件中新增一列为",{"2":{"38":1}}],["文件中写入标签",{"2":{"36":1}}],["文件太多了也是一个很糟糕的事情",{"2":{"37":1}}],["文件建议放在一个",{"2":{"37":1}}],["文件",{"2":{"37":1,"69":1}}],["文件的文件名",{"2":{"37":1}}],["文件去掉首字符串",{"2":{"37":1}}],["文件存在",{"2":{"34":1}}],["文件名称",{"2":{"64":1}}],["文件名就应为",{"2":{"37":1}}],["文件名",{"2":{"34":1}}],["文件全路径",{"2":{"34":1}}],["文件全路径或目录",{"2":{"34":1}}],["文件不存在",{"2":{"34":1}}],["文管方法库出口",{"2":{"12":1}}],["期望结果",{"2":{"34":2}}],["期望元素不存在",{"2":{"34":1}}],["期望元素存在",{"2":{"34":1}}],["期望不存在文件路径",{"2":{"34":1}}],["期望存在文件路径",{"2":{"34":1}}],["期望界面不存在模板图片",{"2":{"34":1}}],["期望界面存在模板图片",{"2":{"34":1}}],["屏幕上匹配不存在图片",{"2":{"34":1}}],["屏幕上匹配图片",{"2":{"34":2}}],["默认环境变量管理文件",{"0":{"131":1},"2":{"124":1}}],["默认日志输出级别为",{"2":{"94":1}}],["默认是在",{"2":{"94":1}}],["默认情况下是会将识别到的多个目标组装成字典返回",{"2":{"87":1}}],["默认端口号为",{"2":{"79":1}}],["默认值为",{"2":{"34":1}}],["默认为false",{"2":{"87":1}}],["默认为0",{"2":{"87":1}}],["默认为ch",{"2":{"87":1}}],["默认为",{"2":{"34":1}}],["默认不间隔",{"2":{"34":1}}],["默认关闭",{"2":{"5":1}}],["单位秒",{"2":{"34":3}}],[">不为假",{"2":{"34":1}}],[">不为真",{"2":{"34":1}}],[">不相等",{"2":{"34":2}}],[">是否相等",{"2":{"34":2}}],[">与实际值",{"2":{"34":4}}],[">",{"2":{"34":9}}],[">=",{"2":{"34":3}}],["例",{"2":{"34":3}}],["例如",{"2":{"9":1,"34":1,"40":1}}],["on",{"2":{"126":1,"127":1}}],["only",{"2":{"34":1}}],["or",{"2":{"34":1,"64":1,"65":3,"66":9,"69":2}}],["ocr",{"2":{"34":4,"76":1,"79":2,"83":3,"84":1,"85":1,"86":1,"87":4,"95":1}}],["os",{"2":{"34":5}}],["outcome",{"2":{"6":1}}],["8888",{"2":{"79":1,"83":1}}],["8890",{"2":{"79":1}}],["8",{"0":{"133":1},"2":{"34":1,"48":1,"91":1,"92":1,"93":1,"95":1,"111":1}}],["继承了",{"2":{"128":1}}],["继承了基类baselog",{"2":{"91":1,"92":1,"93":1}}],["继承",{"2":{"33":1,"128":1}}],["用户只需要创建符合框架定义的文件命名规范脚本文件",{"2":{"137":1}}],["用户只需要关注用例",{"2":{"114":1}}],["用户可直接通过",{"2":{"101":1}}],["用于用例开发调试过程中",{"2":{"133":1}}],["用于统一存放用例步骤的操作方法",{"2":{"126":1}}],["用于统一管理命令行参数驱动用例执行",{"2":{"118":1}}],["用于虚拟环境安装",{"2":{"50":1}}],["用于属性定位相关操作",{"2":{"48":1}}],["用于保存用例标签",{"2":{"37":1}}],["用例标签管理文件",{"0":{"130":1},"2":{"124":1}}],["用例标签化管理插件",{"2":{"95":1}}],["用例示例",{"2":{"124":2}}],["用例工程配置对象继承",{"2":{"129":1}}],["用例工程配置模块建议继承",{"2":{"119":1}}],["用例工程的断言方法类",{"2":{"128":1}}],["用例工程名称",{"2":{"124":1}}],["用例工程结构",{"0":{"124":1}}],["用例工程支持一键创建",{"2":{"123":1}}],["用例工程设计",{"0":{"123":1},"1":{"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1}}],["用例层负责管理用例逻辑",{"2":{"127":1}}],["用例层目录",{"2":{"124":1}}],["用例层",{"0":{"127":1},"2":{"114":1}}],["用例层直接",{"2":{"114":1}}],["用例整体打包交付之后",{"2":{"112":1}}],["用例开发环境下更新版本不方便",{"2":{"111":1}}],["用例失败录屏插件",{"2":{"95":1}}],["用例文件",{"2":{"67":1}}],["用例驱动方式",{"0":{"60":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1}}],["用例执行所需要的资源",{"2":{"124":1}}],["用例执行完成后生成多种测试报告",{"2":{"116":1}}],["用例执行过程中动态调用",{"2":{"116":1}}],["用例执行驱动的命令",{"2":{"50":1}}],["用例执行时判断",{"2":{"39":1}}],["用例需要废弃",{"2":{"43":1}}],["用例id",{"2":{"42":1,"43":1}}],["用例脚本的",{"2":{"37":1}}],["用例中所需要的方法从",{"2":{"109":1}}],["用例中通过",{"2":{"33":1}}],["用例中使用方法",{"0":{"33":1}}],["用例基类",{"2":{"33":2,"124":1}}],["用两对大括号把函数的参数括起来",{"2":{"12":1}}],["几乎满足了所有的断言场景",{"2":{"32":1}}],["自定义执行",{"0":{"68":1},"1":{"69":1,"70":1}}],["自定义条件判断跳过的函数写在此文件中",{"2":{"41":1}}],["自定义跳过",{"0":{"41":1}}],["自定义断言类",{"2":{"34":1}}],["自带多种断言语句",{"2":{"32":1}}],["自动安装框架及改测试类型需要的插件依赖",{"2":{"121":1}}],["自动统计分析每次",{"2":{"95":1}}],["自动化插件",{"2":{"95":1}}],["自动化测试框架",{"2":{"112":1}}],["自动化测试框架操作方法封装写法",{"2":{"9":1}}],["自动化测试用例",{"0":{"105":1},"1":{"106":1,"107":1,"108":1,"109":1},"2":{"106":1}}],["自动化测试方法套件",{"0":{"96":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1}}],["自动化测试模块",{"2":{"95":1}}],["自动化测试",{"2":{"54":2}}],["自动输出日志的类名称",{"2":{"94":1}}],["自动输出日志",{"0":{"91":1}}],["自动输出的日志",{"2":{"12":1}}],["自动识别当前整个屏幕的所有内容",{"2":{"83":1}}],["自动将函数说明打印为日志",{"2":{"11":3}}],["自动的将函数说明作为日志打印出来",{"2":{"9":1}}],["umtk",{"0":{"96":1,"104":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"97":1,"99":1,"100":1,"101":2,"104":4,"106":1,"109":2}}],["ui操作远程对象",{"0":{"47":1},"1":{"48":1}}],["ui",{"2":{"45":2,"54":2,"95":1,"108":1,"124":1}}],["union",{"2":{"34":3}}],["uniontech",{"2":{"34":1,"91":1,"92":1,"93":1}}],["utf",{"2":{"34":1,"91":1,"92":1,"93":1}}],["usable",{"2":{"95":1}}],["usr",{"2":{"34":1,"91":1,"92":1,"93":1}}],["user4",{"2":{"74":2,"75":2}}],["user3",{"2":{"74":2,"75":2}}],["user2",{"2":{"74":2,"75":2}}],["user1",{"2":{"74":2,"75":2}}],["user=",{"2":{"48":1}}],["user=user",{"2":{"48":1}}],["user",{"2":{"29":1,"30":1,"31":1,"48":1,"94":1}}],["username",{"2":{"27":1}}],["uos",{"0":{"96":1,"105":1},"1":{"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"106":1,"107":1,"108":1,"109":1},"2":{"12":1,"48":1,"97":4,"104":1,"106":3}}],["普通权限执行",{"0":{"25":1,"29":1}}],["增加了等待的日志",{"2":{"21":1}}],["优化",{"2":{"21":1}}],["可实现群控测试机执行",{"2":{"112":1}}],["可视化配置",{"0":{"135":1},"2":{"112":1}}],["可视化驱动",{"2":{"95":1}}],["可定制化依赖",{"2":{"112":1}}],["可能存在当前屏幕中有多个目标",{"2":{"87":1}}],["可能包含多条日志信息",{"2":{"9":1}}],["可自定义多个参数之间的连接符",{"2":{"41":1}}],["可以通过系统环境变量或修改",{"2":{"119":1}}],["可以根据测试项目类型安装对应的依赖",{"2":{"112":1}}],["可以在通过命令行快速驱动测试用例执行",{"2":{"114":1}}],["可以在无网络环境下直接运行",{"2":{"112":1}}],["可以在方法层",{"2":{"109":1}}],["可以对外开源发布",{"2":{"104":1}}],["可以调用",{"2":{"100":1}}],["可以修改为从0到1的数",{"2":{"87":1}}],["可以自动安装对应的依赖集",{"2":{"56":1}}],["可以自动加载虚拟环境并驱动用例工程",{"2":{"51":1}}],["可以激活虚拟环境",{"2":{"52":1}}],["可以随意新增",{"2":{"37":1}}],["可以完全代替之前这样的写法",{"2":{"21":1}}],["german",{"2":{"87":1}}],["get",{"2":{"34":3}}],["getmembers",{"2":{"10":1}}],["group2",{"2":{"74":1,"75":1}}],["group1",{"2":{"74":1,"75":2}}],["group",{"2":{"74":1}}],["gui",{"2":{"34":7,"48":3,"56":2,"95":1,"109":1}}],["gpl",{"2":{"34":1}}],["github",{"2":{"76":1,"88":1}}],["git",{"2":{"16":1,"19":1,"95":1,"114":1}}],["home",{"2":{"94":1}}],["html",{"2":{"95":2}}],["https",{"2":{"76":1,"88":1}}],["http",{"2":{"54":1,"56":1}}],["htop",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["h",{"2":{"49":1}}],["has",{"2":{"7":1}}],["就能自动日志输出类里面所有的方法的功能说明",{"2":{"88":1}}],["就像写",{"2":{"16":1,"19":1}}],["就可以实现自动输出日志了",{"2":{"12":1}}],["入参",{"2":{"16":1,"19":1}}],["├──",{"2":{"15":3,"18":3,"63":4,"99":9,"108":19,"124":17}}],["框架预设一些文件接口规范",{"2":{"137":1}}],["框架的安装命令可以根据用例工程所属的测试类型",{"2":{"121":1}}],["框架的断言库",{"2":{"33":1}}],["框架可以正常运行",{"2":{"120":1}}],["框架底层对各功能插件提供",{"2":{"120":1}}],["框架总线接口",{"0":{"120":1}}],["框架提供驱动命令",{"2":{"118":1}}],["框架提供驱动执行的命令",{"2":{"114":1}}],["框架驱动命令传递命令行参数给执行管理器",{"2":{"116":1}}],["框架也提供初始化用例工程的功能",{"2":{"114":1}}],["框架源代码不直接呈现在用户面前",{"2":{"114":1}}],["框架代码及插件库以",{"2":{"114":1}}],["框架层提供总线服务",{"2":{"114":1}}],["框架和插件库独立维护更新",{"2":{"112":1}}],["框架而独立使用",{"2":{"104":1}}],["框架会在用例执行之前执行",{"2":{"16":1,"19":1}}],["框架会在用例执行之前自动加载并执行",{"2":{"15":1,"18":1}}],["框架支持通过",{"2":{"16":1,"19":1}}],["框架默认生成",{"2":{"0":1}}],["前置命令行入参钩子",{"0":{"16":1}}],["前置脚本钩子",{"0":{"15":1}}],["前置钩子",{"0":{"14":1},"1":{"15":1,"16":1}}],["前后钩子",{"0":{"13":1},"1":{"14":1,"15":1,"16":1,"17":1,"18":1,"19":1}}],["这些元素操作方法可以用于自动化用例调用",{"2":{"97":1}}],["这是在类外面打",{"2":{"93":3}}],["这是我想再输出的其他",{"2":{"92":3}}],["这个命令可以在系统原生环境中使用",{"2":{"50":1}}],["这样在用例中能够使用统一的断言语句",{"2":{"128":1}}],["这样在日志输出的时候就能把调用函数时参数的值输出出来",{"2":{"12":1}}],["这样这条用例即使同时标记了",{"2":{"42":1}}],["这种方式需要修改用例代码",{"2":{"38":1}}],["这就是我们参考django",{"2":{"12":1}}],["japan",{"2":{"87":1}}],["job",{"2":{"15":2,"16":3,"18":2,"19":3}}],["jinja2",{"2":{"12":1}}],["json",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":3,"2":1,"3":1,"4":1,"6":1,"7":1}}],["和上面逻辑相反",{"2":{"40":1}}],["和",{"0":{"104":1},"2":{"12":1,"42":2,"75":1,"104":2,"106":1,"111":1}}],["没错",{"2":{"12":1}}],["函数名等等都可以做为关键词",{"2":{"64":1}}],["函数名",{"2":{"40":1}}],["函数功能说明中",{"2":{"12":1}}],["函数说明以及函数操作日志",{"2":{"9":1}}],["细心的同学可能还发现了一个小细节",{"2":{"12":1}}],["展示在",{"2":{"12":1}}],["静态方法",{"2":{"12":1}}],["包的形式提供框架能力",{"2":{"112":1}}],["包含客户端和服务端",{"2":{"76":1}}],["包含",{"2":{"75":1}}],["包含静态方法",{"2":{"10":1}}],["包括实例方法",{"2":{"12":1}}],["之后",{"2":{"12":1,"49":1,"50":1}}],["|",{"2":{"12":2}}],["md",{"2":{"99":1,"108":1}}],["movie",{"2":{"99":1}}],["mousekey",{"2":{"95":1}}],["mode",{"2":{"34":6}}],["music",{"2":{"64":5,"67":6,"99":3}}],["multiple=multiple",{"2":{"12":1,"34":2}}],["multiple=false",{"2":{"12":1}}],["multiple",{"2":{"12":1,"34":2}}],["my",{"2":{"33":1,"52":1,"57":2,"63":1,"124":2,"126":1,"127":1}}],["mycasemethod",{"2":{"126":1,"127":2}}],["mycase",{"2":{"33":1,"63":2,"124":3,"127":2,"128":2}}],["maintainer",{"2":{"102":1}}],["main",{"2":{"48":1,"91":1,"92":1,"93":1}}],["manage",{"2":{"42":1,"95":1,"126":1,"127":1}}],["manager",{"2":{"34":1,"48":2,"99":2,"100":2,"101":1,"108":2,"109":1,"127":1}}],["mark",{"2":{"38":1,"65":1,"95":1}}],["max",{"2":{"34":7}}],["match",{"2":{"34":11}}],["machine",{"2":{"27":1}}],["map",{"2":{"12":1}}],["mips64",{"2":{"21":1}}],["method",{"2":{"11":1,"12":3,"15":1,"18":1,"33":4,"91":12,"92":2,"97":1,"99":4,"108":5,"109":1,"124":4,"126":3,"127":2,"128":4}}],["metadata",{"2":{"3":1,"6":1}}],["message",{"2":{"7":1}}],["注意给元组类型",{"2":{"94":1}}],["注意这里",{"2":{"91":1,"92":1,"93":1}}],["注意ip和端口要和你的服务端ip对应",{"2":{"83":1}}],["注意",{"2":{"12":1,"56":1,"64":1,"66":1,"67":1}}],["num",{"2":{"95":1}}],["number=max",{"2":{"34":2}}],["number=match",{"2":{"34":2}}],["number",{"2":{"34":9}}],["network",{"2":{"34":9}}],["not",{"2":{"34":13,"40":2,"64":1,"65":1}}],["none",{"2":{"34":26}}],["nodeid",{"2":{"6":1,"7":1}}],["n",{"2":{"27":1}}],["name",{"2":{"11":3,"40":3,"48":1,"91":2,"92":2,"93":2,"94":4,"95":1}}],["==",{"2":{"34":5,"48":1,"91":1,"92":1,"93":1}}],["=",{"2":{"11":4,"12":1,"21":5,"34":36,"48":2,"79":1,"83":2,"91":1,"92":1,"93":1,"94":3}}],["动态等待",{"0":{"20":1},"1":{"21":1,"22":1}}],["动态添加日志装饰器",{"2":{"10":1}}],["动态给该类下所有的函数及父类函数添加日志装饰器",{"2":{"10":1}}],["给符合条件的函数",{"2":{"10":1}}],["实际结果",{"2":{"34":2}}],["实例",{"2":{"12":1}}],["实例方法",{"2":{"10":1}}],["实现插件依赖的定制化",{"2":{"114":1}}],["实现步骤",{"2":{"10":1}}],["实现原理",{"0":{"10":1}}],["类似于单元测试",{"2":{"103":1}}],["类名包含什么字符",{"2":{"94":1}}],["类名以什么结尾",{"2":{"94":1}}],["类名以什么开头",{"2":{"94":1}}],["类名",{"2":{"64":1}}],["类",{"2":{"10":1,"91":3,"92":1}}],["类方法",{"2":{"10":1,"12":1}}],["类里面一个函数只包含一个操作或多次调用的一系列可合并的操作",{"2":{"9":1}}],["在浏览器中输入一些配置后即可驱动测试用例执行",{"2":{"112":1}}],["在继承",{"2":{"112":1}}],["在现有框架下",{"2":{"111":1}}],["在公司的多个自动化流程中运行得很好",{"2":{"111":1}}],["在公司内部已经被大量的自动化测试项目使用",{"2":{"111":1}}],["在操作方法多了之后",{"2":{"103":1}}],["在同一个大版本中",{"2":{"101":1}}],["在不同的代码仓库中",{"2":{"101":1}}],["在外层其他直接使用",{"0":{"93":1}}],["在全屏指定查找某个字符串的坐标",{"0":{"85":1}}],["在根目录下定义",{"2":{"69":1}}],["在服务端通过调用",{"2":{"45":1}}],["在远程测试机上部署一个完整的",{"2":{"45":1}}],["在用例执行过程中控制远程机器执行复杂的",{"2":{"45":1}}],["在用例收集阶段会以第一个",{"2":{"41":1}}],["在用例工程根目录下存放",{"2":{"41":1}}],["在用例工程目录下存放一个",{"2":{"15":1,"18":1}}],["在用例工程目录下生成报告文件",{"2":{"0":1}}],["在子项目目录下新建",{"2":{"37":1}}],["在",{"2":{"36":1,"38":1,"40":1,"41":1,"130":1}}],["在一段时间内截图多张图片进行识别",{"2":{"34":1}}],["在报告中更能一目了然的看到用例执行步骤",{"2":{"12":1}}],["在屏幕中相似度大于",{"2":{"12":2}}],["在应用库",{"2":{"12":1}}],["在此装饰器中我们能动态的捕获所调用函数的功能说明",{"2":{"10":1}}],["核心原理",{"2":{"10":1}}],["的路径",{"2":{"129":1}}],["的思路",{"2":{"126":1}}],["的框架下进行开发的",{"2":{"104":1}}],["的公共方法库",{"0":{"104":1},"2":{"104":1}}],["的内容",{"2":{"84":1}}],["的用例",{"2":{"42":1}}],["的脚本",{"2":{"15":1,"18":1}}],["的模板语法设计出的日志模板语法",{"2":{"12":1}}],["的坐标",{"2":{"12":2,"85":1}}],["的",{"2":{"11":1,"95":1,"128":1}}],["的方式",{"2":{"10":1,"12":1}}],["的日志系统",{"2":{"9":1}}],["的想法",{"2":{"9":1}}],["那真是妙啊~",{"2":{"9":1}}],["从任务栏启动文件管理器",{"2":{"127":1}}],["从而驱动测试用例执行",{"2":{"118":1}}],["从而减少大量日志代码量和重复编写",{"2":{"9":1}}],["从开源至今发布了",{"2":{"111":1}}],["从第",{"2":{"37":1}}],["从上面的例子也可以看出来",{"2":{"9":1}}],["具有较高的重复度",{"2":{"9":1}}],["通过配置的接口进行数据回填",{"2":{"116":1}}],["通过命令行参数控制",{"2":{"114":1}}],["通过不同的参数控制返回不同的值",{"2":{"76":1}}],["通过获取该函数返回的布尔值",{"2":{"41":1}}],["通过ocr识别到不应存在的文案",{"2":{"34":2}}],["通过ocr未识别到",{"2":{"34":3}}],["通过观察前面的例子",{"2":{"12":1}}],["通过",{"2":{"10":2}}],["通过日志输出器将其输出即可",{"2":{"10":1}}],["通过给类加上一个装饰器",{"2":{"10":1}}],["通过经验观察",{"2":{"9":1}}],["通常是这样的",{"2":{"9":1}}],["省略代码部分",{"2":{"9":1}}],["l1",{"2":{"65":3}}],["lang",{"2":{"34":1,"87":1}}],["lang=lang",{"2":{"34":2}}],["lang=",{"2":{"34":2,"87":1}}],["lambda",{"2":{"12":1,"34":2}}],["leftmethod",{"2":{"126":1}}],["len",{"2":{"34":4}}],["level日志级别",{"2":{"94":1}}],["level",{"2":{"11":1,"94":1}}],["list",{"2":{"34":1}}],["license",{"2":{"34":1,"91":2,"92":2,"93":2,"99":1,"108":1}}],["lineno",{"2":{"6":1}}],["linuxdeepin",{"2":{"76":1,"88":1,"111":1}}],["linux",{"2":{"3":1,"54":3,"56":1,"95":1,"112":1}}],["ltd",{"2":{"34":1,"91":1,"92":1,"93":1}}],["l",{"2":{"27":1,"29":1}}],["ls",{"2":{"25":1,"27":1,"29":1}}],["loogarch64",{"2":{"40":2}}],["loongarch64",{"2":{"21":1}}],["lower",{"2":{"34":1}}],["logs",{"2":{"94":1}}],["log装饰器自动打印",{"2":{"91":1,"92":1}}],["log",{"2":{"10":1,"11":1,"12":5,"34":2,"91":3,"92":3,"93":6,"94":4}}],["logger直接调用",{"2":{"93":1}}],["logger",{"2":{"9":1,"12":1,"34":12,"91":2,"92":5,"93":5}}],["点击某个元素",{"2":{"9":2,"12":1}}],["dragon",{"2":{"95":1}}],["driver",{"2":{"95":1,"118":2}}],["d",{"2":{"95":1}}],["dbus",{"2":{"54":1}}],["dmidecode",{"2":{"40":1}}],["dict",{"2":{"34":4}}],["ddefilemanagermethod",{"2":{"100":2,"101":1,"109":1}}],["dde",{"2":{"34":1,"48":3,"99":2,"100":2,"101":1,"108":4,"109":1,"126":1,"127":2}}],["during",{"2":{"34":2}}],["duration",{"2":{"2":1}}],["dogtail",{"2":{"48":1,"95":1,"126":3}}],["do",{"2":{"16":2,"19":2}}],["dock",{"2":{"48":1,"108":4,"126":1,"127":1}}],["doc",{"2":{"10":1}}],["dfm",{"2":{"12":2,"108":2}}],["deepin",{"2":{"99":4}}],["desc",{"2":{"95":1}}],["desktop",{"2":{"34":2,"84":1,"86":1}}],["debug",{"2":{"11":1,"91":1,"92":3,"93":3,"94":1,"124":1,"133":1}}],["default=false",{"2":{"87":1}}],["default",{"2":{"87":1}}],["def",{"2":{"9":1,"12":2,"33":1,"34":15,"48":2,"62":2,"91":6,"92":1,"127":1,"128":1}}],["需要在每个函数里面主动编写日志输出代码",{"2":{"9":1}}],["背景",{"0":{"9":1,"111":1}}],["id4",{"2":{"66":3}}],["id3",{"2":{"66":3,"69":1}}],["id2",{"2":{"66":3,"69":1}}],["id1",{"2":{"66":3,"69":1}}],["identifier",{"2":{"34":1,"91":1,"92":1,"93":1}}],["issue",{"2":{"102":1}}],["isinstance",{"2":{"34":4}}],["is",{"2":{"34":6}}],["ifixed",{"2":{"42":2}}],["if",{"2":{"34":23,"48":1,"91":1,"92":1,"93":1}}],["ip4",{"2":{"74":2,"75":2}}],["ip3",{"2":{"74":2,"75":2}}],["ip2",{"2":{"74":2,"75":2}}],["ip1",{"2":{"74":2,"75":2}}],["ip=",{"2":{"48":1}}],["ip=ip",{"2":{"48":1}}],["ip",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1,"83":1}}],["imagecenter",{"2":{"95":1}}],["image",{"2":{"12":4,"34":6,"124":1,"129":1}}],["import",{"2":{"11":1,"12":2,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"33":3,"34":12,"48":2,"79":3,"83":2,"91":3,"92":3,"93":3,"94":3,"100":1,"101":1,"109":2,"114":1,"126":2,"127":2,"128":3}}],["in",{"2":{"34":2}}],["int",{"2":{"34":18}}],["ini",{"2":{"108":2,"119":1,"124":1}}],["inix86",{"2":{"21":1}}],["init",{"2":{"7":1,"48":1,"57":1,"63":1,"99":3,"108":4,"123":1,"124":2}}],["install",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"56":6,"78":1,"81":1,"89":1,"101":1}}],["inspect",{"2":{"10":1}}],["info",{"2":{"9":1,"11":2,"12":1,"34":11,"92":2,"93":2,"94":1}}],["items",{"2":{"34":2}}],["it",{"2":{"7":1}}],["autotest",{"2":{"57":2,"97":1}}],["auto",{"2":{"48":3}}],["amp",{"2":{"40":3,"41":5}}],["album",{"2":{"37":2}}],["all",{"2":{"34":5}}],["allure",{"2":{"12":2}}],["and",{"2":{"34":3,"64":4,"65":1}}],["any",{"2":{"34":3}}],["arrch64",{"2":{"40":1}}],["args",{"2":{"34":7}}],["arch",{"2":{"3":2}}],["actual",{"2":{"34":10}}],["as",{"2":{"34":6}}],["assertoptionerror",{"2":{"34":3}}],["assertionerror",{"2":{"34":18}}],["assertmethod",{"2":{"33":5,"128":5}}],["assertx",{"2":{"33":1}}],["assert",{"2":{"33":6,"34":18,"108":1,"124":2,"127":1,"128":9,"129":1}}],["abspath=",{"2":{"84":1,"86":1}}],["abspath=config",{"2":{"48":1}}],["abspath=pic",{"2":{"34":2}}],["abspath=picture",{"2":{"34":2}}],["abspath=none",{"2":{"34":2}}],["abspath",{"2":{"34":9,"48":1}}],["aarch64",{"2":{"21":1,"40":4,"41":1}}],["apache",{"2":{"91":1,"92":1,"93":1}}],["apt",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1}}],["app",{"2":{"12":5,"33":1,"34":10,"63":1}}],["appmethod",{"2":{"9":1,"12":2}}],["attr",{"2":{"9":1,"12":1,"34":2,"48":3}}],["a",{"2":{"7":1}}],["button",{"2":{"95":1}}],["bus",{"2":{"95":1}}],["btn",{"2":{"48":1,"126":1}}],["bool",{"2":{"34":4,"87":2}}],["bin",{"2":{"34":1,"91":1,"92":1,"93":1}}],["basemethod",{"2":{"126":2}}],["baselog",{"2":{"91":2,"92":2,"93":2}}],["base",{"2":{"33":1,"63":1,"91":6,"108":2,"124":2,"126":1,"127":1,"128":2}}],["basecase",{"2":{"33":3,"127":2,"128":5}}],["bashcd",{"2":{"57":1}}],["bashmkdir",{"2":{"57":1}}],["bashmy",{"2":{"15":1,"18":1}}],["bashpip",{"2":{"56":5}}],["bashpython3",{"2":{"42":1}}],["bash$",{"2":{"52":1,"59":2,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6,"72":3,"75":2}}],["bash",{"2":{"46":1}}],["bashyouqu3",{"2":{"16":2,"19":2,"46":1,"49":2,"50":1,"51":1}}],["bash>>",{"2":{"12":1}}],["bar",{"2":{"3":1,"6":1}}],["by",{"2":{"9":1,"12":1,"34":6,"48":3}}],["because",{"2":{"7":1}}],["警告信息",{"2":{"7":1}}],["收集器节点的列表",{"2":{"5":1}}],["source",{"2":{"76":1,"88":1}}],["software",{"2":{"34":1,"91":2,"92":2,"93":2}}],["smoke",{"2":{"63":4,"65":2}}],["slaves",{"2":{"46":3}}],["slaves对象提供远程机器信息",{"0":{"46":1}}],["sleep",{"2":{"21":3}}],["systemctl",{"2":{"72":1}}],["system",{"2":{"40":1}}],["s",{"2":{"40":1}}],["skipif",{"2":{"40":8,"41":6}}],["skiped",{"2":{"39":1}}],["skip",{"2":{"36":1,"38":1,"39":2,"42":3,"43":1}}],["skipped",{"2":{"4":1}}],["similarity=similarity",{"2":{"34":2}}],["similarity=0",{"2":{"34":2,"87":1}}],["similarity",{"2":{"34":1,"87":1}}],["screen",{"2":{"34":8}}],["spdx",{"2":{"34":2,"91":2,"92":2,"93":2}}],["ssh",{"2":{"27":1,"72":3}}],["sw64",{"2":{"40":4}}],["sw",{"2":{"21":1}}],["sudo权限执行",{"0":{"26":1,"30":1}}],["sudo",{"2":{"16":1,"19":1,"26":1,"30":1,"31":1,"40":1,"72":1}}],["summary",{"0":{"4":1},"2":{"2":2}}],["shell$",{"2":{"123":1}}],["shellpip",{"2":{"101":1}}],["shelluos",{"2":{"99":1,"108":1}}],["shellocr",{"2":{"87":1}}],["shellautotest",{"2":{"63":1,"124":1}}],["shell",{"0":{"52":1},"2":{"16":1,"19":1,"50":1,"52":2}}],["str",{"2":{"34":6}}],["step",{"2":{"12":1}}],["static",{"2":{"91":4,"92":2,"124":1,"129":1}}],["staticmethod",{"2":{"34":14,"91":2,"92":1}}],["status",{"2":{"34":2,"127":1}}],["start",{"2":{"15":2,"16":3,"18":1}}],["startswith",{"2":{"11":1,"94":2}}],["stage",{"2":{"6":3}}],["server",{"2":{"78":1,"79":8,"83":1}}],["secret",{"2":{"27":1}}],["setting",{"2":{"11":5,"34":6,"79":2,"83":3,"91":2,"92":2,"93":2,"94":6,"119":2}}],["setattr",{"2":{"10":1}}],["setup",{"2":{"6":1}}],["self",{"2":{"9":1,"12":1,"33":3,"48":4,"62":2,"91":8,"126":1,"127":2,"128":1}}],["fr",{"2":{"87":1}}],["from",{"2":{"12":2,"33":3,"34":17,"48":2,"79":2,"83":1,"91":3,"92":3,"93":3,"109":1,"126":2,"127":2,"128":3}}],["false",{"2":{"34":11,"41":2}}],["fail",{"2":{"6":2}}],["failed",{"2":{"4":1,"6":1}}],["float",{"2":{"34":13,"87":1}}],["fixture",{"2":{"124":1}}],["fixed",{"2":{"36":1,"42":3,"43":1}}],["filter",{"2":{"34":2}}],["file",{"2":{"34":14,"48":2,"94":2,"99":2,"100":2,"101":1,"108":2,"109":1,"126":1,"127":2}}],["filecopyrighttext",{"2":{"34":1,"91":1,"92":1,"93":1}}],["first=true",{"2":{"87":2}}],["first=return",{"2":{"34":2}}],["first=false",{"2":{"34":2}}],["first",{"2":{"34":3,"87":1}}],["find",{"2":{"12":4,"34":6}}],["f",{"2":{"12":1,"34":34,"67":6}}],["funnylog2",{"2":{"95":1}}],["funnylog",{"0":{"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"11":1,"88":1,"89":1,"91":3,"92":3,"93":3,"94":3}}],["func",{"2":{"10":1}}],["foo0",{"2":{"6":1}}],["foo",{"2":{"3":1,"6":3,"7":2}}],["汇总信息",{"2":{"4":1}}],["2024",{"2":{"111":1}}],["2021",{"2":{"111":1}}],["2023",{"2":{"34":1,"91":1,"92":1,"93":1,"111":1}}],["28",{"2":{"12":1}}],["22",{"2":{"3":1}}],["2",{"0":{"40":1,"80":1,"83":1,"84":2,"85":1,"86":1,"87":1,"92":1,"98":1,"99":1,"100":2,"107":1,"108":1,"109":2,"112":1,"115":1,"119":1,"125":1,"126":1,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1},"1":{"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"99":1,"100":1,"108":1,"109":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"135":1,"136":1,"137":1},"2":{"3":1,"4":2,"21":3,"34":1,"37":1,"46":2,"62":1,"74":1,"75":2,"95":1,"111":2,"124":1}}],["55",{"2":{"48":1}}],["50",{"2":{"6":1,"75":1}}],["5",{"0":{"87":1,"103":1,"122":1,"130":1,"134":1},"1":{"135":1,"136":1,"137":1},"2":{"3":2,"21":3,"95":1,"111":1}}],["56",{"2":{"3":1}}],["wdotool",{"2":{"95":1}}],["w5821",{"2":{"40":1}}],["widget",{"2":{"34":18,"48":1}}],["with",{"2":{"3":1}}],["web",{"2":{"54":1,"95":2,"135":1}}],["webassert",{"2":{"33":2}}],["webui",{"2":{"33":1,"56":2}}],["wayland",{"2":{"40":1,"41":1,"95":1}}],["want",{"2":{"16":1,"19":1}}],["warnings",{"0":{"7":1},"2":{"2":2}}],["what",{"2":{"16":1,"19":1}}],["x11",{"2":{"40":1}}],["xdg",{"2":{"40":1,"41":1}}],["xdist",{"2":{"3":1}}],["x3c",{"2":{"34":19}}],["x",{"2":{"12":2,"34":4}}],["xxx",{"2":{"9":1,"11":3,"12":1,"33":1,"36":3,"39":1,"42":2,"62":7,"94":1}}],["xxxx",{"2":{"0":1}}],["xpassed",{"2":{"4":1}}],["xfailed",{"2":{"4":1}}],["x86",{"2":{"3":1,"12":1,"40":2}}],["9",{"2":{"3":1,"12":2,"95":1}}],["7",{"0":{"132":1},"2":{"48":1,"95":1}}],["78",{"2":{"3":1}}],["7981803",{"2":{"2":1}}],["40",{"2":{"34":6}}],["47",{"2":{"12":1}}],["48",{"2":{"12":1}}],["4",{"0":{"86":1,"102":1,"117":1,"118":1,"119":1,"120":1,"121":2,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":2,"130":1,"131":1,"132":1,"133":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"124":1,"125":1,"126":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"133":2,"135":1,"136":1,"137":1},"2":{"3":3,"95":1}}],["679537",{"2":{"39":1,"42":1,"43":1}}],["64",{"2":{"3":1,"12":1,"21":2,"40":2}}],["6",{"0":{"104":1,"131":1},"2":{"3":2,"12":1,"34":2,"87":1,"95":1}}],["3",{"0":{"41":1,"85":1,"93":1,"101":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":2,"121":1,"122":1,"128":1},"1":{"114":1,"115":1,"116":1,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2},"2":{"3":2,"4":1,"95":1}}],["public",{"0":{"104":1},"2":{"104":4}}],["pr",{"2":{"102":2}}],["project",{"2":{"48":2}}],["product",{"2":{"40":1}}],["process",{"2":{"34":4,"127":1}}],["popmethod",{"2":{"126":1}}],["po",{"2":{"100":1,"114":1,"126":1}}],["port",{"2":{"79":1,"83":1}}],["pms",{"2":{"95":2}}],["pdocr",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"76":1,"78":1,"79":3,"81":1,"83":2,"95":1}}],["pip",{"2":{"56":1,"101":1}}],["picture",{"2":{"34":13,"84":1,"86":1}}],["pic",{"2":{"12":1,"34":14}}],["png",{"2":{"12":2,"34":4,"84":2,"86":1}}],["playwright",{"2":{"95":2}}],["platform",{"2":{"3":1,"40":5,"41":1}}],["plugins",{"2":{"3":1}}],["pluggy",{"2":{"3":1}}],["pypi",{"2":{"101":1}}],["pydbussend",{"2":{"95":1}}],["pylinuxauto",{"2":{"34":14,"95":1,"109":1}}],["py",{"2":{"3":1,"6":2,"7":2,"12":2,"15":2,"16":1,"18":2,"19":1,"33":3,"37":2,"41":2,"42":1,"48":1,"62":2,"63":4,"64":2,"67":6,"79":2,"91":1,"92":1,"93":1,"99":6,"108":12,"124":11,"126":1,"127":1,"128":4}}],["pytest",{"2":{"3":1,"38":1,"65":2,"95":3,"108":1}}],["pythonocr",{"2":{"84":1,"85":1,"86":1,"87":3}}],["python3",{"2":{"16":1,"19":1,"34":1,"91":1,"92":1,"93":1}}],["pythondfmwidget",{"2":{"12":1}}],["pythonfrom",{"2":{"11":1,"21":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"79":1,"83":1,"94":3,"100":1,"101":1,"109":1}}],["pythonclass",{"2":{"9":1,"33":1}}],["python",{"2":{"3":1,"12":2,"33":2,"34":1,"48":1,"62":1,"79":1,"112":1,"114":1,"126":1,"127":1,"128":3}}],["paddleocr",{"2":{"76":1}}],["pause=pause",{"2":{"34":4}}],["pause",{"2":{"34":8}}],["pass",{"2":{"34":4}}],["password=",{"2":{"48":1}}],["password=password",{"2":{"48":1}}],["password2",{"2":{"46":1}}],["password1",{"2":{"46":2}}],["password",{"2":{"27":1,"29":1,"30":1,"31":1,"48":1}}],["passed",{"2":{"4":1}}],["param",{"2":{"12":2,"34":32}}],["packages",{"2":{"3":1}}],["path",{"2":{"2":1,"7":2,"12":1,"34":17,"48":1,"94":2}}],["cd",{"2":{"112":1}}],["ci",{"2":{"112":1}}],["center",{"2":{"95":1}}],["c",{"2":{"75":2}}],["cpu",{"2":{"40":3}}],["csv文件",{"2":{"37":1}}],["csv文件与脚本对应关系",{"0":{"37":1}}],["csv",{"2":{"36":1,"37":6,"38":2,"39":1,"40":1,"44":1,"65":1,"108":2,"124":1,"130":2}}],["ch",{"2":{"34":2,"87":2}}],["cmd",{"2":{"25":3,"26":3,"27":3,"29":1,"30":1,"31":1,"34":4}}],["cli",{"2":{"111":1}}],["click",{"2":{"9":1,"12":1,"48":3,"126":2,"127":1}}],["clone",{"2":{"16":1,"19":1}}],["cls",{"2":{"12":2,"34":1,"91":4}}],["classmethod",{"2":{"12":1,"34":1,"91":2}}],["class",{"2":{"7":1,"11":3,"12":2,"33":2,"34":1,"48":1,"62":1,"91":3,"92":3,"93":3,"94":4,"126":1,"127":1,"128":3}}],["cargo",{"0":{"51":1},"2":{"50":1,"51":2,"59":1,"61":1,"62":2,"63":1,"64":1,"65":1,"66":1,"67":3,"72":1,"75":1}}],["cache",{"2":{"34":5}}],["case",{"2":{"15":2,"18":2,"33":2,"63":2,"64":1,"67":8,"108":3,"109":1,"124":4,"126":1,"127":3,"128":3}}],["cannot",{"2":{"7":1}}],["call",{"2":{"6":1}}],["c1",{"2":{"7":1}}],["commit",{"2":{"95":2}}],["com",{"2":{"76":1,"88":1}}],["count",{"2":{"34":1}}],["co",{"2":{"34":1,"91":1,"92":1,"93":1}}],["coding",{"2":{"34":1,"91":1,"92":1,"93":1}}],["code",{"2":{"7":1,"76":1,"88":1}}],["consolepip",{"2":{"78":1,"81":1,"89":1}}],["constructor",{"2":{"7":1}}],["contain",{"2":{"11":1,"94":1}}],["conftest",{"2":{"124":1}}],["config",{"2":{"12":1,"48":2,"108":1,"124":1}}],["conf",{"2":{"11":1,"79":1,"83":1,"91":1,"92":1,"93":1,"94":3}}],["collect",{"2":{"7":1}}],["collected",{"2":{"4":1}}],["collectors",{"0":{"5":1},"2":{"2":2}}],["created",{"2":{"2":1}}],["e",{"2":{"72":2}}],["equal",{"2":{"34":2}}],["ele",{"2":{"126":1}}],["elementnotfound",{"2":{"34":1}}],["element",{"2":{"12":2,"34":8,"48":1}}],["elements",{"2":{"12":5}}],["elif",{"2":{"34":4}}],["else",{"2":{"34":8}}],["events=",{"2":{"27":1}}],["expr=",{"2":{"34":2}}],["expr",{"2":{"34":10}}],["expanduser",{"2":{"34":2}}],["expect",{"2":{"27":1,"31":1,"34":18}}],["expect交互",{"0":{"27":1,"31":1}}],["excel",{"2":{"44":1}}],["exception",{"2":{"34":6}}],["exceptions",{"2":{"34":13}}],["except",{"2":{"34":8}}],["exc",{"2":{"34":12}}],["exists",{"2":{"34":2}}],["exist",{"2":{"34":11}}],["exitcode",{"2":{"2":1}}],["en",{"2":{"87":1}}],["envx",{"2":{"50":2}}],["env",{"2":{"34":1,"91":1,"92":1,"93":1,"108":1,"124":1}}],["environment",{"0":{"3":1},"2":{"2":2}}],["end",{"2":{"18":1,"19":3}}],["endswith",{"2":{"11":1,"91":1,"92":1,"93":1,"94":1}}],["error",{"2":{"4":1,"11":1,"92":2,"93":2}}],["titlemethod",{"2":{"126":1}}],["timeout=timeout",{"2":{"34":4}}],["timeout",{"2":{"34":5}}],["time",{"2":{"21":1,"34":4}}],["tmp",{"2":{"94":1}}],["t",{"2":{"65":2,"66":2}}],["type",{"2":{"40":1,"41":1}}],["typing",{"2":{"34":1}}],["tags",{"0":{"69":1},"2":{"37":1,"68":1,"69":3}}],["txt",{"0":{"69":1,"70":1},"2":{"34":3,"68":3,"69":3,"74":1,"108":1,"124":1}}],["transfer",{"2":{"95":1}}],["trace",{"2":{"10":2}}],["true表示返回原始数据",{"2":{"87":1}}],["true",{"2":{"34":4,"41":2,"127":1}}],["try",{"2":{"34":4}}],["tuple",{"2":{"12":1,"34":2,"94":1}}],["templateelementfound",{"2":{"34":3}}],["templateelementnotfound",{"2":{"34":5}}],["technology",{"2":{"34":1,"91":1,"92":1,"93":1}}],["teardown",{"2":{"6":1}}],["testlog",{"2":{"91":7,"92":2,"93":1}}],["testmusic",{"2":{"64":1}}],["testmycase",{"2":{"33":1,"127":1}}],["testcase",{"2":{"62":1,"128":1}}],["testfoo",{"2":{"7":2}}],["test",{"2":{"6":8,"7":3,"33":1,"37":2,"62":7,"63":2,"64":2,"67":6,"84":2,"86":1,"94":1,"108":2,"124":2,"127":2,"128":2}}],["tests",{"0":{"6":1},"2":{"2":3,"7":1,"99":1}}],["toolkit",{"2":{"97":1,"99":1}}],["todo",{"2":{"31":1}}],["total",{"2":{"4":1}}],["to",{"2":{"2":1,"7":1}}],["rightmethod",{"2":{"126":1}}],["rm",{"0":{"53":1},"2":{"50":1,"53":1}}],["rpcgui",{"0":{"48":1},"2":{"48":2}}],["rpc",{"0":{"76":1},"1":{"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"45":2,"48":1,"76":2,"78":1,"79":3,"81":1,"83":2,"95":4}}],["raise",{"2":{"34":22}}],["rate=rate",{"2":{"34":2}}],["rate=0",{"2":{"12":1}}],["rate",{"2":{"12":1,"34":7}}],["run",{"2":{"16":2,"19":2,"25":1,"26":1,"27":1,"29":1,"30":1,"31":1,"42":1,"46":1,"49":1,"51":1,"52":1,"59":3,"61":2,"62":4,"63":2,"64":2,"65":2,"66":2,"67":6}}],["requirements",{"2":{"108":1,"124":1}}],["readme",{"2":{"99":1,"108":1}}],["record",{"2":{"95":1}}],["recursive",{"2":{"34":1}}],["removed",{"2":{"36":1,"43":2}}],["remotemethod",{"2":{"48":2}}],["remote",{"2":{"29":1,"30":1,"31":1,"48":1,"56":1,"72":3,"75":2}}],["remotecmd",{"2":{"29":2,"30":2,"31":2}}],["retry=network",{"2":{"34":4}}],["retry",{"2":{"34":9}}],["return",{"2":{"12":2,"34":6,"87":5}}],["restart",{"2":{"48":2,"72":1}}],["restart=false",{"2":{"48":1}}],["res",{"2":{"12":1,"34":21,"124":3,"129":3}}],["report",{"2":{"0":2,"95":1}}],["rootdir",{"2":{"48":1}}],["root",{"2":{"2":1,"46":3}}],["16",{"2":{"95":1}}],["168",{"2":{"46":3,"83":1}}],["15",{"2":{"95":1}}],["1518371686",{"2":{"2":1}}],["14",{"2":{"95":1}}],["13",{"2":{"95":1}}],["12",{"2":{"95":1}}],["1235666275024414",{"2":{"2":1}}],["11",{"2":{"95":1}}],["192",{"2":{"46":3,"83":1}}],["17",{"2":{"12":1,"95":1}}],["1071",{"2":{"101":1}}],["1070",{"2":{"101":1}}],["100",{"2":{"75":3}}],["10",{"2":{"4":2,"48":1,"95":1}}],["1",{"0":{"39":1,"77":1,"83":1,"91":1,"97":1,"99":1,"106":1,"108":1,"111":1,"114":1,"118":1,"124":1,"126":1},"1":{"78":1,"79":1},"2":{"2":1,"3":4,"4":3,"21":3,"34":7,"37":1,"46":5,"48":1,"62":3,"83":1,"87":1,"95":1,"111":1,"124":1}}],["002",{"2":{"63":1,"67":2,"124":1}}],["001",{"2":{"12":2,"33":2,"36":1,"37":2,"40":1,"62":7,"63":1,"64":5,"67":4,"108":2,"124":1,"127":2,"128":2}}],["02",{"2":{"12":1}}],["0",{"2":{"2":1,"3":4,"12":1,"34":1,"83":1,"111":2}}],["报告中",{"2":{"12":1}}],["报告内容",{"0":{"1":1},"1":{"2":1,"3":1,"4":1,"5":1,"6":1,"7":1}}],["报告",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"2":{"0":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.uXxUzkwX.js b/assets/chunks/VPLocalSearchBox.Re7xpDUq.js similarity index 99% rename from assets/chunks/VPLocalSearchBox.uXxUzkwX.js rename to assets/chunks/VPLocalSearchBox.Re7xpDUq.js index 4b52700..bffe1f1 100644 --- a/assets/chunks/VPLocalSearchBox.uXxUzkwX.js +++ b/assets/chunks/VPLocalSearchBox.Re7xpDUq.js @@ -1,4 +1,4 @@ -var Nt=Object.defineProperty;var kt=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>kt(o,typeof e!="symbol"?e+"":e,t);import{X as It,h as oe,y as $e,at as Dt,au as Ot,d as Rt,G as xe,av as tt,k as Fe,aw as _t,ax as Mt,z as Lt,ay as zt,l as Re,R as de,P as Ee,az as Pt,aA as Bt,Y as Vt,j as $t,aB as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,aC as Jt,aD as Ut,aE as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,aF as Gt,q as qt,s as Qt,aG as it,a3 as Yt,aj as Zt,ap as Xt,aH as er,_ as tr}from"./framework.CoRJFuj9.js";import{u as rr,c as ar}from"./theme.D89Al4wk.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.gI043LAz.js"),[])};/*! +var Nt=Object.defineProperty;var kt=(o,e,t)=>e in o?Nt(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t;var Oe=(o,e,t)=>kt(o,typeof e!="symbol"?e+"":e,t);import{X as It,h as oe,y as $e,at as Dt,au as Ot,d as Rt,G as xe,av as tt,k as Fe,aw as _t,ax as Mt,z as Lt,ay as zt,l as Re,R as de,P as Ee,az as Pt,aA as Bt,Y as Vt,j as $t,aB as Wt,o as ee,b as jt,m as E,a1 as Kt,p as U,aC as Jt,aD as Ut,aE as Ht,c as re,n as rt,e as Se,E as at,F as nt,a as ve,t as pe,aF as Gt,q as qt,s as Qt,aG as it,a3 as Yt,aj as Zt,ap as Xt,aH as er,_ as tr}from"./framework.DPHCW6-_.js";import{u as rr,c as ar}from"./theme.F2IToOfj.js";const nr={root:()=>It(()=>import("./@localSearchIndexroot.BXd6ZsaL.js"),[])};/*! * tabbable 6.2.0 * @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE */var mt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Te=mt.join(","),yt=typeof Element>"u",ue=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ne=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},ke=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},ir=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},gt=function(e,t,r){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Te));return t&&ue.call(e,Te)&&n.unshift(e),n=n.filter(r),n},bt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var h=ue.call(i,Te);h&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var d=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!ke(d,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(d&&v){var m=o(d===!0?i.children:d.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},wt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},se=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||ir(e))&&!wt(e)?0:e.tabIndex},or=function(e,t){var r=se(e);return r<0&&t&&!wt(e)?0:r},sr=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},xt=function(e){return e.tagName==="INPUT"},ur=function(e){return xt(e)&&e.type==="hidden"},lr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},cr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(ue.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ne(e);if(u&&!u.shadowRoot&&n(u)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(vr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return ot(e);return!1},mr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},gr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=or(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(sr).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},br=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:yr}):r=gt(e,t.includeContainer,We.bind(null,t)),gr(r)},wr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=bt([e],t.includeContainer,{filter:Ie.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=gt(e,t.includeContainer,Ie.bind(null,t)),r},le=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,Te)===!1?!1:We(t,e)},xr=mt.concat("iframe").join(","),_e=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ue.call(e,xr)===!1?!1:Ie(t,e)};/*! diff --git a/assets/chunks/framework.CoRJFuj9.js b/assets/chunks/framework.DPHCW6-_.js similarity index 99% rename from assets/chunks/framework.CoRJFuj9.js rename to assets/chunks/framework.DPHCW6-_.js index 57e0a58..c1f36c6 100644 --- a/assets/chunks/framework.CoRJFuj9.js +++ b/assets/chunks/framework.DPHCW6-_.js @@ -14,4 +14,4 @@ * @vue/runtime-dom v3.4.33 * (c) 2018-present Yuxi (Evan) You and Vue contributors * @license MIT -**/const jc="http://www.w3.org/2000/svg",Bc="http://www.w3.org/1998/Math/MathML",He=typeof document<"u"?document:null,Es=He&&He.createElement("template"),Dc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?He.createElementNS(jc,e):t==="mathml"?He.createElementNS(Bc,e):n?He.createElement(e,{is:n}):He.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>He.createTextNode(e),createComment:e=>He.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>He.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Es.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Es.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ve="transition",Mt="animation",Kt=Symbol("_vtc"),ai=(e,{slots:t})=>yr(Il,Vc(e),t);ai.displayName="Transition";const ui={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ai.props=fe({},So,ui);const it=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},Cs=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function Vc(e){const t={};for(const S in e)S in ui||(t[S]=e[S]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,w=Uc(s),M=w&&w[0],D=w&&w[1],{onBeforeEnter:W,onEnter:V,onEnterCancelled:g,onLeave:_,onLeaveCancelled:P,onBeforeAppear:T=W,onAppear:N=V,onAppearCancelled:$=g}=t,L=(S,G,ee)=>{lt(S,G?f:l),lt(S,G?a:i),ee&&ee()},b=(S,G)=>{S._isLeaving=!1,lt(S,h),lt(S,y),lt(S,p),G&&G()},F=S=>(G,ee)=>{const re=S?N:V,U=()=>L(G,S,ee);it(re,[G,U]),xs(()=>{lt(G,S?c:o),Ue(G,S?f:l),Cs(re)||Ss(G,r,M,U)})};return fe(t,{onBeforeEnter(S){it(W,[S]),Ue(S,o),Ue(S,i)},onBeforeAppear(S){it(T,[S]),Ue(S,c),Ue(S,a)},onEnter:F(!1),onAppear:F(!0),onLeave(S,G){S._isLeaving=!0;const ee=()=>b(S,G);Ue(S,h),Ue(S,p),Wc(),xs(()=>{S._isLeaving&&(lt(S,h),Ue(S,y),Cs(_)||Ss(S,r,D,ee))}),it(_,[S,ee])},onEnterCancelled(S){L(S,!1),it(g,[S])},onAppearCancelled(S){L(S,!0),it($,[S])},onLeaveCancelled(S){b(S),it(P,[S])}})}function Uc(e){if(e==null)return null;if(Z(e))return[Xn(e.enter),Xn(e.leave)];{const t=Xn(e);return[t,t]}}function Xn(e){return ji(e)}function Ue(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Kt]||(e[Kt]=new Set)).add(t)}function lt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Kt];n&&(n.delete(t),n.size||(e[Kt]=void 0))}function xs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let kc=0;function Ss(e,t,n,r){const s=e._endId=++kc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Kc(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,p),o()},p=y=>{y.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[w]||"").split(", "),s=r(`${Ve}Delay`),o=r(`${Ve}Duration`),i=Ts(s,o),l=r(`${Mt}Delay`),c=r(`${Mt}Duration`),a=Ts(l,c);let f=null,h=0,p=0;t===Ve?i>0&&(f=Ve,h=i,p=o.length):t===Mt?a>0&&(f=Mt,h=a,p=c.length):(h=Math.max(i,a),f=h>0?i>a?Ve:Mt:null,p=f?f===Ve?o.length:c.length:0);const y=f===Ve&&/\b(transform|all)(,|$)/.test(r(`${Ve}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:y}}function Ts(e,t){for(;e.lengthAs(n)+As(e[r])))}function As(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Wc(){return document.body.offsetHeight}function qc(e,t,n){const r=e[Kt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Rs=Symbol("_vod"),Gc=Symbol("_vsh"),zc=Symbol(""),Yc=/(^|;)\s*display\s*:/;function Jc(e,t,n){const r=e.style,s=se(n);let o=!1;if(n&&!s){if(t)if(se(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&mn(r,l,"")}else for(const i in t)n[i]==null&&mn(r,i,"");for(const i in n)i==="display"&&(o=!0),mn(r,i,n[i])}else if(s){if(t!==n){const i=r[zc];i&&(n+=";"+i),r.cssText=n,o=Yc.test(n)}}else t&&e.removeAttribute("style");Rs in e&&(e[Rs]=o?r.display:"",e[Gc]&&(r.display="none"))}const Os=/\s*!important$/;function mn(e,t,n){if(k(n))n.forEach(r=>mn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Xc(e,t);Os.test(n)?e.setProperty(tt(r),n.replace(Os,""),"important"):e[r]=n}}const Ls=["Webkit","Moz","ms"],Qn={};function Xc(e,t){const n=Qn[t];if(n)return n;let r=Oe(t);if(r!=="filter"&&r in e)return Qn[t]=r;r=On(r);for(let s=0;sZn||(na.then(()=>Zn=0),Zn=Date.now());function sa(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ae(oa(r,n.value),t,5,[r])};return n.value=e,n.attached=ra(),n}function oa(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Ns=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ia=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?qc(e,r,i):t==="style"?Jc(e,n,r):Wt(t)?vr(t)||ea(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):la(e,t,r,i))?(Qc(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ps(e,t,r,i,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ps(e,t,r,i))};function la(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ns(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Ns(t)&&se(n)?!1:t in e}const $s=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>hn(t,n):t};function ca(e){e.target.composing=!0}function Hs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const er=Symbol("_assign"),vu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[er]=$s(s);const o=r||s.props&&s.props.type==="number";_t(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=or(l)),e[er](l)}),n&&_t(e,"change",()=>{e.value=e.value.trim()}),t||(_t(e,"compositionstart",ca),_t(e,"compositionend",Hs),_t(e,"change",Hs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[er]=$s(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?or(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},aa=["ctrl","shift","alt","meta"],ua={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>aa.some(n=>e[`${n}Key`]&&!t.includes(n))},wu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=tt(s.key);if(t.some(i=>i===o||fa[i]===o))return e(s)})},fi=fe({patchProp:ia},Dc);let Bt,js=!1;function di(){return Bt||(Bt=dc(fi))}function da(){return Bt=js?Bt:hc(fi),js=!0,Bt}const Cu=(...e)=>{di().render(...e)},xu=(...e)=>{const t=di().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,hi(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Su=(...e)=>{const t=da().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(s)return n(s,!0,hi(s))},t};function hi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function pi(e){return se(e)?document.querySelector(e):e}const ha=window.__VP_SITE_DATA__;function Vr(e){return so()?(zi(e),!0):!1}function Ne(e){return typeof e=="function"?e():vo(e)}const gi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const pa=Object.prototype.toString,ga=e=>pa.call(e)==="[object Object]",Je=()=>{},_r=ma();function ma(){var e,t;return gi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ya(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const mi=e=>e();function _a(e,t={}){let n,r,s=Je;const o=l=>{clearTimeout(l),s(),s=Je};return l=>{const c=Ne(e),a=Ne(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function ba(e=mi){const t=le(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Pn(t),pause:n,resume:r,eventFilter:s}}function va(e){return Dn()}function yi(...e){if(e.length!==1)return Cl(...e);const t=e[0];return typeof t=="function"?Pn(vl(()=>({get:t,set:Je}))):le(t)}function _i(e,t,n={}){const{eventFilter:r=mi,...s}=n;return Ye(e,ya(r,t),s)}function wa(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=ba(r);return{stop:_i(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function bi(e,t=!0,n){va()?Rt(e,n):t?e():In(e)}function Tu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return _i(e,t,{...o,eventFilter:_a(r,{maxWait:s})})}function Au(e,t,n){let r;de(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Je}=r,c=le(!s),a=i?Ir(t):le(t);let f=0;return Br(async h=>{if(!c.value)return;f++;const p=f;let y=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const w=await e(M=>{h(()=>{o&&(o.value=!1),y||M()})});p===f&&(a.value=w)}catch(w){l(w)}finally{o&&p===f&&(o.value=!1),y=!0}}),s?oe(()=>(c.value=!0,a.value)):a}function bt(e){var t;const n=Ne(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Le=gi?window:void 0;function Xe(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Le):[t,n,r,s]=e,!t)return Je;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,p,y)=>(f.addEventListener(h,p,y),()=>f.removeEventListener(h,p,y)),c=Ye(()=>[bt(t),Ne(s)],([f,h])=>{if(i(),!f)return;const p=ga(h)?{...h}:h;o.push(...n.flatMap(y=>r.map(w=>l(f,y,w,p))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Vr(a),a}let Bs=!1;function Ru(e,t,n={}){const{window:r=Le,ignore:s=[],capture:o=!0,detectIframe:i=!1}=n;if(!r)return Je;_r&&!Bs&&(Bs=!0,Array.from(r.document.body.children).forEach(p=>p.addEventListener("click",Je)),r.document.documentElement.addEventListener("click",Je));let l=!0;const c=p=>s.some(y=>{if(typeof y=="string")return Array.from(r.document.querySelectorAll(y)).some(w=>w===p.target||p.composedPath().includes(w));{const w=bt(y);return w&&(p.target===w||p.composedPath().includes(w))}}),f=[Xe(r,"click",p=>{const y=bt(e);if(!(!y||y===p.target||p.composedPath().includes(y))){if(p.detail===0&&(l=!c(p)),!l){l=!0;return}t(p)}},{passive:!0,capture:o}),Xe(r,"pointerdown",p=>{const y=bt(e);l=!c(p)&&!!(y&&!p.composedPath().includes(y))},{passive:!0}),i&&Xe(r,"blur",p=>{setTimeout(()=>{var y;const w=bt(e);((y=r.document.activeElement)==null?void 0:y.tagName)==="IFRAME"&&!(w!=null&&w.contains(r.document.activeElement))&&t(p)},0)})].filter(Boolean);return()=>f.forEach(p=>p())}function Ea(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Ou(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Le,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Ea(t);return Xe(s,o,f=>{f.repeat&&Ne(l)||c(f)&&n(f)},i)}function Ca(){const e=le(!1),t=Dn();return t&&Rt(()=>{e.value=!0},t),e}function xa(e){const t=Ca();return oe(()=>(t.value,!!e()))}function Sa(e,t={}){const{window:n=Le}=t,r=xa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=le(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Br(()=>{r.value&&(l(),s=n.matchMedia(Ne(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Vr(()=>{c(),l(),s=void 0}),o}const an=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},un="__vueuse_ssr_handlers__",Ta=Aa();function Aa(){return un in an||(an[un]=an[un]||{}),an[un]}function vi(e,t){return Ta[e]||t}function Ra(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Oa={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ds="vueuse-storage";function Ur(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=Le,eventFilter:p,onError:y=b=>{console.error(b)},initOnMounted:w}=r,M=(f?Ir:le)(typeof t=="function"?t():t);if(!n)try{n=vi("getDefaultStorage",()=>{var b;return(b=Le)==null?void 0:b.localStorage})()}catch(b){y(b)}if(!n)return M;const D=Ne(t),W=Ra(D),V=(s=r.serializer)!=null?s:Oa[W],{pause:g,resume:_}=wa(M,()=>T(M.value),{flush:o,deep:i,eventFilter:p});h&&l&&bi(()=>{Xe(h,"storage",$),Xe(h,Ds,L),w&&$()}),w||$();function P(b,F){h&&h.dispatchEvent(new CustomEvent(Ds,{detail:{key:e,oldValue:b,newValue:F,storageArea:n}}))}function T(b){try{const F=n.getItem(e);if(b==null)P(F,null),n.removeItem(e);else{const S=V.write(b);F!==S&&(n.setItem(e,S),P(F,S))}}catch(F){y(F)}}function N(b){const F=b?b.newValue:n.getItem(e);if(F==null)return c&&D!=null&&n.setItem(e,V.write(D)),D;if(!b&&a){const S=V.read(F);return typeof a=="function"?a(S,D):W==="object"&&!Array.isArray(S)?{...D,...S}:S}else return typeof F!="string"?F:V.read(F)}function $(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){M.value=D;return}if(!(b&&b.key!==e)){g();try{(b==null?void 0:b.newValue)!==V.write(M.value)&&(M.value=N(b))}catch(F){y(F)}finally{b?In(_):_()}}}}function L(b){$(b.detail)}return M}function wi(e){return Sa("(prefers-color-scheme: dark)",e)}function La(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Le,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},p=wi({window:s}),y=oe(()=>p.value?"dark":"light"),w=c||(i==null?yi(r):Ur(i,r,o,{window:s,listenToStorageChanges:l})),M=oe(()=>w.value==="auto"?y.value:w.value),D=vi("updateHTMLAttrs",(_,P,T)=>{const N=typeof _=="string"?s==null?void 0:s.document.querySelector(_):bt(_);if(!N)return;let $;if(f&&($=s.document.createElement("style"),$.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild($)),P==="class"){const L=T.split(/\s/g);Object.values(h).flatMap(b=>(b||"").split(/\s/g)).filter(Boolean).forEach(b=>{L.includes(b)?N.classList.add(b):N.classList.remove(b)})}else N.setAttribute(P,T);f&&(s.getComputedStyle($).opacity,document.head.removeChild($))});function W(_){var P;D(t,n,(P=h[_])!=null?P:_)}function V(_){e.onChanged?e.onChanged(_,W):W(_)}Ye(M,V,{flush:"post",immediate:!0}),bi(()=>V(M.value));const g=oe({get(){return a?w.value:M.value},set(_){w.value=_}});try{return Object.assign(g,{store:w,system:y,state:M})}catch{return g}}function Ma(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Le}=e,s=La({...e,onChanged:(l,c)=>{var a;e.onChanged?(a=e.onChanged)==null||a.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=oe(()=>s.system?s.system.value:wi({window:r}).value?"dark":"light");return oe({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function tr(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Lu(e,t,n={}){const{window:r=Le}=n;return Ur(e,t,r==null?void 0:r.localStorage,n)}function Ei(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const nr=new WeakMap;function Mu(e,t=!1){const n=le(t);let r=null,s="";Ye(yi(e),l=>{const c=tr(Ne(l));if(c){const a=c;if(nr.get(a)||nr.set(a,a.style.overflow),a.style.overflow!=="hidden"&&(s=a.style.overflow),a.style.overflow==="hidden")return n.value=!0;if(n.value)return a.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=tr(Ne(e));!l||n.value||(_r&&(r=Xe(l,"touchmove",c=>{Pa(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=tr(Ne(e));!l||!n.value||(_r&&(r==null||r()),l.style.overflow=s,nr.delete(l),n.value=!1)};return Vr(i),oe({get(){return n.value},set(l){l?o():i()}})}function Pu(e,t,n={}){const{window:r=Le}=n;return Ur(e,t,r==null?void 0:r.sessionStorage,n)}function Iu(e={}){const{window:t=Le,behavior:n="auto"}=e;if(!t)return{x:le(0),y:le(0)};const r=le(t.scrollX),s=le(t.scrollY),o=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Xe(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}const Ci=/^(?:[a-z]+:|\/\/)/i,Ia="vitepress-theme-appearance",xi=/#.*$/,Fa=/(index)?\.(md|html)$/,Se=typeof document<"u",Si={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Na(e,t,n=!1){if(t===void 0)return!1;if(e=Vs(`/${e}`),n)return new RegExp(t).test(e);if(Vs(t)!==e)return!1;const r=t.match(xi);return r?(Se?location.hash:"")===r[0]:!0}function Vs(e){return decodeURI(e).replace(xi,"").replace(Fa,"")}function $a(e){return Ci.test(e)}function Ha(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!$a(f)&&Na(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Ai(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function Ti(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ja(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function ja(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ba(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function Ai(e,t){return[...e.filter(n=>!Ba(t,n)),...t]}const Da=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Va=/^[a-z]:/i;function Us(e){const t=Va.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Da,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ua=new Set("3g2,3gp,7z,aac,abw,ai,aif,aifc,aiff,arc,asf,asr,asx,au,avi,avif,axs,azw,bin,bmp,bz,bz2,c,cda,cer,class,crl,crt,csh,css,csv,dcr,der,dll,doc,docx,eot,eps,epub,exe,gif,gtar,gz,gzip,ico,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,latex,m3u,man,mdb,mht,mhtml,mid,midi,mjs,mov,mp2,mp3,mp4,mpa,mpe,mpeg,mpg,mpkg,mpp,odp,ods,odt,oga,ogv,ogx,opus,otf,p10,p12,p7b,p7c,p7m,p7r,p7s,pbm,pdf,pfx,php,png,ppt,pptx,ps,pub,qt,rar,roff,rtf,rtx,ser,sh,spc,svg,swf,t,tar,tcl,tex,texi,texinfo,tgz,tif,tiff,tr,ts,tsv,ttf,txt,ua,viv,vivo,vsd,wav,weba,webm,webp,woff,woff2,xbm,xhtml,xls,xlsx,xml,xul,zip,conf".split(","));function ka(e){const t=e.split(".").pop();return t==null||!Ua.has(t.toLowerCase())}function Fu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Ka=Symbol(),ht=Ir(ha);function Nu(e){const t=oe(()=>Ha(ht.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?le(!0):n?Ma({storageKey:Ia,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):le(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>Ti(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function Wa(){const e=Tt(Ka);if(!e)throw new Error("vitepress data not properly injected in app");return e}function qa(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ks(e){return Ci.test(e)||!e.startsWith("/")?e:qa(ht.value.base,e)}function Ga(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Se){const n="/youqu3/";t=Us(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Us(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let yn=[];function $u(e){yn.push(e),Hn(()=>{yn=yn.filter(t=>t!==e)})}const za=Symbol(),Ri="http://a.com",Ya=()=>({path:"/",component:null,data:Si});function Hu(e,t){const n=Mn(Ya()),r={route:n,go:s};async function s(l=Se?location.href:"/"){var c,a;l=Tn(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(qs(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var p;if(await((p=r.onBeforePageLoad)==null?void 0:p.call(r,l))===!1)return;const f=new URL(l,Ri),h=o=f.pathname;try{let y=await e(h);if(!y)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:w,__pageData:M}=y;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=Se?h:ks(h),n.component=pn(w),n.data=pn(M),Se&&In(()=>{let D=ht.value.base+M.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ht.value.cleanUrls&&!D.endsWith("/")&&(D+=".html"),D!==f.pathname&&(f.pathname=D,l=D+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(V){console.warn(V)}if(W){Ks(W,f.hash);return}}window.scrollTo(0,c)})}}catch(y){if(!/fetch|Page not found/.test(y.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(y),!a)try{const w=await fetch(ht.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Se?h:ks(h),n.component=t?pn(t):null,n.data=Si)}}return Se&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:p,pathname:y,hash:w,search:M}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),D=window.location;!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&p===D.origin&&ka(y)&&(l.preventDefault(),y===D.pathname&&M===D.search?(w!==D.hash&&(history.pushState(null,"",w),window.dispatchEvent(new Event("hashchange"))),w?Ks(a,w,a.classList.contains("header-anchor")):(qs(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await i(Tn(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Ja(){const e=Tt(za);if(!e)throw new Error("useRouter() is called without provider.");return e}function Oi(){return Ja().route}function Ks(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(a-window.scrollY)>window.innerHeight?window.scrollTo(0,a):window.scrollTo({left:0,top:a,behavior:"smooth"})},o=ht.value.scrollOffset,i=0,l=24;if(typeof o=="object"&&"padding"in o&&(l=o.padding,o=o.selector),typeof o=="number")i=o;else if(typeof o=="string")i=Ws(o,l);else if(Array.isArray(o))for(const f of o){const h=Ws(f,l);if(h){i=h;break}}const c=parseInt(window.getComputedStyle(r).paddingTop,10),a=window.scrollY+r.getBoundingClientRect().top-i+c;requestAnimationFrame(s)}}function Ws(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function qs(e){Se&&Tn(e)!==Tn(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function Tn(e){const t=new URL(e,Ri);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ht.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const rr=()=>yn.forEach(e=>e()),ju=Nr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Oi(),{site:n}=Wa();return()=>yr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?yr(t.component,{onVnodeMounted:rr,onVnodeUpdated:rr,onVnodeUnmounted:rr}):"404 Page Not Found"])}}),Bu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Xa="modulepreload",Qa=function(e){return"/youqu3/"+e},Gs={},Du=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=Qa(l),l in Gs)return;Gs[l]=!0;const c=l.endsWith(".css"),a=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${a}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":Xa,c||(f.as="script",f.crossOrigin=""),f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),c)return new Promise((h,p)=>{f.addEventListener("load",h),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Vu="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/assert.png",Uu="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",ku="/youqu3/logo.png",Ku="/youqu3/install.gif",Wu="/youqu3/init.gif",qu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/log.png",Gu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/inside.png",zu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/outside.png",Yu="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",Ju="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",Xu=Nr({setup(e,{slots:t}){const n=le(!1);return Rt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Qu(){Se&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Zu(){if(Se){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let a=c.textContent||"";i&&(a=a.replace(/^ *(\$|>) /gm,"").trim()),Za(a).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Za(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function ef(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}const i=o.map(zs);n.forEach((l,c)=>{const a=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete n[c])}),i.forEach(l=>l&&document.head.appendChild(l)),n=[...n,...i].filter(Boolean)};Br(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=Ti(i,o);a!==document.title&&(document.title=a);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):zs(["meta",{name:"description",content:f}]),s(Ai(i.head,tu(c)))})}function zs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function eu(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function tu(e){return e.filter(t=>!eu(t))}const sr=new Set,Li=()=>document.createElement("link"),nu=e=>{const t=Li();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ru=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let fn;const su=Se&&(fn=Li())&&fn.relList&&fn.relList.supports&&fn.relList.supports("prefetch")?nu:ru;function tf(){if(!Se||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!sr.has(c)){sr.add(c);const a=Ga(c);a&&su(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):sr.add(l))})})};Rt(r);const s=Oi();Ye(()=>s.path,r),Hn(()=>{n&&n.disconnect()})}export{hu as $,Hn as A,mu as B,Bl as C,au as D,fu as E,ye as F,Ir as G,$u as H,ie as I,uu as J,Ci as K,Oi as L,Rc as M,Tt as N,Ru as O,Ou as P,Cr as Q,In as R,Iu as S,ai as T,_u as U,Pn as V,cu as W,Du as X,Mu as Y,Zl as Z,Bu as _,oi as a,Eu as a0,wu as a1,pu as a2,xu as a3,yr as a4,Cu as a5,Vu as a6,Uu as a7,ku as a8,Ku as a9,Xe as aA,Lo as aB,lu as aC,vu as aD,de as aE,gu as aF,pn as aG,Fu as aH,Wu as aa,qu as ab,Gu as ac,zu as ad,Yu as ae,Ju as af,ef as ag,za as ah,Nu as ai,Ka as aj,ju as ak,Xu as al,ht as am,Su as an,Hu as ao,Ga as ap,tf as aq,Zu as ar,Qu as as,bt as at,Vr as au,Au as av,Pu as aw,Lu as ax,Tu as ay,Ja as az,ni as b,yu as c,Nr as d,bu as e,ka as f,ks as g,le as h,$a as i,Se as j,oe as k,Rt as l,si as m,xr as n,ei as o,vo as p,ou as q,du as r,iu as s,Wi as t,Wa as u,Na as v,Ll as w,Sa as x,Ye as y,Br as z}; +**/const jc="http://www.w3.org/2000/svg",Bc="http://www.w3.org/1998/Math/MathML",He=typeof document<"u"?document:null,Es=He&&He.createElement("template"),Dc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?He.createElementNS(jc,e):t==="mathml"?He.createElementNS(Bc,e):n?He.createElement(e,{is:n}):He.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>He.createTextNode(e),createComment:e=>He.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>He.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,o){const i=n?n.previousSibling:t.lastChild;if(s&&(s===o||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===o||!(s=s.nextSibling)););else{Es.innerHTML=r==="svg"?`${e}`:r==="mathml"?`${e}`:e;const l=Es.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},Ve="transition",Mt="animation",Kt=Symbol("_vtc"),ai=(e,{slots:t})=>yr(Il,Vc(e),t);ai.displayName="Transition";const ui={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ai.props=fe({},So,ui);const it=(e,t=[])=>{k(e)?e.forEach(n=>n(...t)):e&&e(...t)},Cs=e=>e?k(e)?e.some(t=>t.length>1):e.length>1:!1;function Vc(e){const t={};for(const S in e)S in ui||(t[S]=e[S]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:o=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=o,appearActiveClass:a=i,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,w=Uc(s),M=w&&w[0],D=w&&w[1],{onBeforeEnter:W,onEnter:V,onEnterCancelled:g,onLeave:_,onLeaveCancelled:P,onBeforeAppear:T=W,onAppear:N=V,onAppearCancelled:$=g}=t,L=(S,G,ee)=>{lt(S,G?f:l),lt(S,G?a:i),ee&&ee()},b=(S,G)=>{S._isLeaving=!1,lt(S,h),lt(S,y),lt(S,p),G&&G()},F=S=>(G,ee)=>{const re=S?N:V,U=()=>L(G,S,ee);it(re,[G,U]),xs(()=>{lt(G,S?c:o),Ue(G,S?f:l),Cs(re)||Ss(G,r,M,U)})};return fe(t,{onBeforeEnter(S){it(W,[S]),Ue(S,o),Ue(S,i)},onBeforeAppear(S){it(T,[S]),Ue(S,c),Ue(S,a)},onEnter:F(!1),onAppear:F(!0),onLeave(S,G){S._isLeaving=!0;const ee=()=>b(S,G);Ue(S,h),Ue(S,p),Wc(),xs(()=>{S._isLeaving&&(lt(S,h),Ue(S,y),Cs(_)||Ss(S,r,D,ee))}),it(_,[S,ee])},onEnterCancelled(S){L(S,!1),it(g,[S])},onAppearCancelled(S){L(S,!0),it($,[S])},onLeaveCancelled(S){b(S),it(P,[S])}})}function Uc(e){if(e==null)return null;if(Z(e))return[Xn(e.enter),Xn(e.leave)];{const t=Xn(e);return[t,t]}}function Xn(e){return ji(e)}function Ue(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Kt]||(e[Kt]=new Set)).add(t)}function lt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[Kt];n&&(n.delete(t),n.size||(e[Kt]=void 0))}function xs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let kc=0;function Ss(e,t,n,r){const s=e._endId=++kc,o=()=>{s===e._endId&&r()};if(n)return setTimeout(o,n);const{type:i,timeout:l,propCount:c}=Kc(e,t);if(!i)return r();const a=i+"end";let f=0;const h=()=>{e.removeEventListener(a,p),o()},p=y=>{y.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[w]||"").split(", "),s=r(`${Ve}Delay`),o=r(`${Ve}Duration`),i=Ts(s,o),l=r(`${Mt}Delay`),c=r(`${Mt}Duration`),a=Ts(l,c);let f=null,h=0,p=0;t===Ve?i>0&&(f=Ve,h=i,p=o.length):t===Mt?a>0&&(f=Mt,h=a,p=c.length):(h=Math.max(i,a),f=h>0?i>a?Ve:Mt:null,p=f?f===Ve?o.length:c.length:0);const y=f===Ve&&/\b(transform|all)(,|$)/.test(r(`${Ve}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:y}}function Ts(e,t){for(;e.lengthAs(n)+As(e[r])))}function As(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Wc(){return document.body.offsetHeight}function qc(e,t,n){const r=e[Kt];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Rs=Symbol("_vod"),Gc=Symbol("_vsh"),zc=Symbol(""),Yc=/(^|;)\s*display\s*:/;function Jc(e,t,n){const r=e.style,s=se(n);let o=!1;if(n&&!s){if(t)if(se(t))for(const i of t.split(";")){const l=i.slice(0,i.indexOf(":")).trim();n[l]==null&&mn(r,l,"")}else for(const i in t)n[i]==null&&mn(r,i,"");for(const i in n)i==="display"&&(o=!0),mn(r,i,n[i])}else if(s){if(t!==n){const i=r[zc];i&&(n+=";"+i),r.cssText=n,o=Yc.test(n)}}else t&&e.removeAttribute("style");Rs in e&&(e[Rs]=o?r.display:"",e[Gc]&&(r.display="none"))}const Os=/\s*!important$/;function mn(e,t,n){if(k(n))n.forEach(r=>mn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Xc(e,t);Os.test(n)?e.setProperty(tt(r),n.replace(Os,""),"important"):e[r]=n}}const Ls=["Webkit","Moz","ms"],Qn={};function Xc(e,t){const n=Qn[t];if(n)return n;let r=Oe(t);if(r!=="filter"&&r in e)return Qn[t]=r;r=On(r);for(let s=0;sZn||(na.then(()=>Zn=0),Zn=Date.now());function sa(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ae(oa(r,n.value),t,5,[r])};return n.value=e,n.attached=ra(),n}function oa(e,t){if(k(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Ns=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ia=(e,t,n,r,s,o)=>{const i=s==="svg";t==="class"?qc(e,r,i):t==="style"?Jc(e,n,r):Wt(t)?vr(t)||ea(e,t,n,r,o):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):la(e,t,r,i))?(Qc(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ps(e,t,r,i,o,t!=="value")):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ps(e,t,r,i))};function la(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Ns(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Ns(t)&&se(n)?!1:t in e}const $s=e=>{const t=e.props["onUpdate:modelValue"]||!1;return k(t)?n=>hn(t,n):t};function ca(e){e.target.composing=!0}function Hs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const er=Symbol("_assign"),vu={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[er]=$s(s);const o=r||s.props&&s.props.type==="number";_t(e,t?"change":"input",i=>{if(i.target.composing)return;let l=e.value;n&&(l=l.trim()),o&&(l=or(l)),e[er](l)}),n&&_t(e,"change",()=>{e.value=e.value.trim()}),t||(_t(e,"compositionstart",ca),_t(e,"compositionend",Hs),_t(e,"change",Hs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:o}},i){if(e[er]=$s(i),e.composing)return;const l=(o||e.type==="number")&&!/^0\d/.test(e.value)?or(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},aa=["ctrl","shift","alt","meta"],ua={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>aa.some(n=>e[`${n}Key`]&&!t.includes(n))},wu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...o)=>{for(let i=0;i{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const o=tt(s.key);if(t.some(i=>i===o||fa[i]===o))return e(s)})},fi=fe({patchProp:ia},Dc);let Bt,js=!1;function di(){return Bt||(Bt=dc(fi))}function da(){return Bt=js?Bt:hc(fi),js=!0,Bt}const Cu=(...e)=>{di().render(...e)},xu=(...e)=>{const t=di().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(!s)return;const o=t._component;!K(o)&&!o.render&&!o.template&&(o.template=s.innerHTML),s.innerHTML="";const i=n(s,!1,hi(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),i},t},Su=(...e)=>{const t=da().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=pi(r);if(s)return n(s,!0,hi(s))},t};function hi(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function pi(e){return se(e)?document.querySelector(e):e}const ha=window.__VP_SITE_DATA__;function Vr(e){return so()?(zi(e),!0):!1}function Ne(e){return typeof e=="function"?e():vo(e)}const gi=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const pa=Object.prototype.toString,ga=e=>pa.call(e)==="[object Object]",Je=()=>{},_r=ma();function ma(){var e,t;return gi&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function ya(e,t){function n(...r){return new Promise((s,o)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(o)})}return n}const mi=e=>e();function _a(e,t={}){let n,r,s=Je;const o=l=>{clearTimeout(l),s(),s=Je};return l=>{const c=Ne(e),a=Ne(t.maxWait);return n&&o(n),c<=0||a!==void 0&&a<=0?(r&&(o(r),r=null),Promise.resolve(l())):new Promise((f,h)=>{s=t.rejectOnCancel?h:f,a&&!r&&(r=setTimeout(()=>{n&&o(n),r=null,f(l())},a)),n=setTimeout(()=>{r&&o(r),r=null,f(l())},c)})}}function ba(e=mi){const t=le(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...o)=>{t.value&&e(...o)};return{isActive:Pn(t),pause:n,resume:r,eventFilter:s}}function va(e){return Dn()}function yi(...e){if(e.length!==1)return Cl(...e);const t=e[0];return typeof t=="function"?Pn(vl(()=>({get:t,set:Je}))):le(t)}function _i(e,t,n={}){const{eventFilter:r=mi,...s}=n;return Ye(e,ya(r,t),s)}function wa(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:o,pause:i,resume:l,isActive:c}=ba(r);return{stop:_i(e,t,{...s,eventFilter:o}),pause:i,resume:l,isActive:c}}function bi(e,t=!0,n){va()?Rt(e,n):t?e():In(e)}function Tu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...o}=n;return _i(e,t,{...o,eventFilter:_a(r,{maxWait:s})})}function Au(e,t,n){let r;de(n)?r={evaluating:n}:r={};const{lazy:s=!1,evaluating:o=void 0,shallow:i=!0,onError:l=Je}=r,c=le(!s),a=i?Ir(t):le(t);let f=0;return Br(async h=>{if(!c.value)return;f++;const p=f;let y=!1;o&&Promise.resolve().then(()=>{o.value=!0});try{const w=await e(M=>{h(()=>{o&&(o.value=!1),y||M()})});p===f&&(a.value=w)}catch(w){l(w)}finally{o&&p===f&&(o.value=!1),y=!0}}),s?oe(()=>(c.value=!0,a.value)):a}function bt(e){var t;const n=Ne(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Le=gi?window:void 0;function Xe(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Le):[t,n,r,s]=e,!t)return Je;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const o=[],i=()=>{o.forEach(f=>f()),o.length=0},l=(f,h,p,y)=>(f.addEventListener(h,p,y),()=>f.removeEventListener(h,p,y)),c=Ye(()=>[bt(t),Ne(s)],([f,h])=>{if(i(),!f)return;const p=ga(h)?{...h}:h;o.push(...n.flatMap(y=>r.map(w=>l(f,y,w,p))))},{immediate:!0,flush:"post"}),a=()=>{c(),i()};return Vr(a),a}let Bs=!1;function Ru(e,t,n={}){const{window:r=Le,ignore:s=[],capture:o=!0,detectIframe:i=!1}=n;if(!r)return Je;_r&&!Bs&&(Bs=!0,Array.from(r.document.body.children).forEach(p=>p.addEventListener("click",Je)),r.document.documentElement.addEventListener("click",Je));let l=!0;const c=p=>s.some(y=>{if(typeof y=="string")return Array.from(r.document.querySelectorAll(y)).some(w=>w===p.target||p.composedPath().includes(w));{const w=bt(y);return w&&(p.target===w||p.composedPath().includes(w))}}),f=[Xe(r,"click",p=>{const y=bt(e);if(!(!y||y===p.target||p.composedPath().includes(y))){if(p.detail===0&&(l=!c(p)),!l){l=!0;return}t(p)}},{passive:!0,capture:o}),Xe(r,"pointerdown",p=>{const y=bt(e);l=!c(p)&&!!(y&&!p.composedPath().includes(y))},{passive:!0}),i&&Xe(r,"blur",p=>{setTimeout(()=>{var y;const w=bt(e);((y=r.document.activeElement)==null?void 0:y.tagName)==="IFRAME"&&!(w!=null&&w.contains(r.document.activeElement))&&t(p)},0)})].filter(Boolean);return()=>f.forEach(p=>p())}function Ea(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function Ou(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Le,eventName:o="keydown",passive:i=!1,dedupe:l=!1}=r,c=Ea(t);return Xe(s,o,f=>{f.repeat&&Ne(l)||c(f)&&n(f)},i)}function Ca(){const e=le(!1),t=Dn();return t&&Rt(()=>{e.value=!0},t),e}function xa(e){const t=Ca();return oe(()=>(t.value,!!e()))}function Sa(e,t={}){const{window:n=Le}=t,r=xa(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const o=le(!1),i=a=>{o.value=a.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",i):s.removeListener(i))},c=Br(()=>{r.value&&(l(),s=n.matchMedia(Ne(e)),"addEventListener"in s?s.addEventListener("change",i):s.addListener(i),o.value=s.matches)});return Vr(()=>{c(),l(),s=void 0}),o}const an=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},un="__vueuse_ssr_handlers__",Ta=Aa();function Aa(){return un in an||(an[un]=an[un]||{}),an[un]}function vi(e,t){return Ta[e]||t}function Ra(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Oa={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Ds="vueuse-storage";function Ur(e,t,n,r={}){var s;const{flush:o="pre",deep:i=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:a=!1,shallow:f,window:h=Le,eventFilter:p,onError:y=b=>{console.error(b)},initOnMounted:w}=r,M=(f?Ir:le)(typeof t=="function"?t():t);if(!n)try{n=vi("getDefaultStorage",()=>{var b;return(b=Le)==null?void 0:b.localStorage})()}catch(b){y(b)}if(!n)return M;const D=Ne(t),W=Ra(D),V=(s=r.serializer)!=null?s:Oa[W],{pause:g,resume:_}=wa(M,()=>T(M.value),{flush:o,deep:i,eventFilter:p});h&&l&&bi(()=>{Xe(h,"storage",$),Xe(h,Ds,L),w&&$()}),w||$();function P(b,F){h&&h.dispatchEvent(new CustomEvent(Ds,{detail:{key:e,oldValue:b,newValue:F,storageArea:n}}))}function T(b){try{const F=n.getItem(e);if(b==null)P(F,null),n.removeItem(e);else{const S=V.write(b);F!==S&&(n.setItem(e,S),P(F,S))}}catch(F){y(F)}}function N(b){const F=b?b.newValue:n.getItem(e);if(F==null)return c&&D!=null&&n.setItem(e,V.write(D)),D;if(!b&&a){const S=V.read(F);return typeof a=="function"?a(S,D):W==="object"&&!Array.isArray(S)?{...D,...S}:S}else return typeof F!="string"?F:V.read(F)}function $(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){M.value=D;return}if(!(b&&b.key!==e)){g();try{(b==null?void 0:b.newValue)!==V.write(M.value)&&(M.value=N(b))}catch(F){y(F)}finally{b?In(_):_()}}}}function L(b){$(b.detail)}return M}function wi(e){return Sa("(prefers-color-scheme: dark)",e)}function La(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Le,storage:o,storageKey:i="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:a,disableTransition:f=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},p=wi({window:s}),y=oe(()=>p.value?"dark":"light"),w=c||(i==null?yi(r):Ur(i,r,o,{window:s,listenToStorageChanges:l})),M=oe(()=>w.value==="auto"?y.value:w.value),D=vi("updateHTMLAttrs",(_,P,T)=>{const N=typeof _=="string"?s==null?void 0:s.document.querySelector(_):bt(_);if(!N)return;let $;if(f&&($=s.document.createElement("style"),$.appendChild(document.createTextNode("*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}")),s.document.head.appendChild($)),P==="class"){const L=T.split(/\s/g);Object.values(h).flatMap(b=>(b||"").split(/\s/g)).filter(Boolean).forEach(b=>{L.includes(b)?N.classList.add(b):N.classList.remove(b)})}else N.setAttribute(P,T);f&&(s.getComputedStyle($).opacity,document.head.removeChild($))});function W(_){var P;D(t,n,(P=h[_])!=null?P:_)}function V(_){e.onChanged?e.onChanged(_,W):W(_)}Ye(M,V,{flush:"post",immediate:!0}),bi(()=>V(M.value));const g=oe({get(){return a?w.value:M.value},set(_){w.value=_}});try{return Object.assign(g,{store:w,system:y,state:M})}catch{return g}}function Ma(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Le}=e,s=La({...e,onChanged:(l,c)=>{var a;e.onChanged?(a=e.onChanged)==null||a.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),o=oe(()=>s.system?s.system.value:wi({window:r}).value?"dark":"light");return oe({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";o.value===c?s.value="auto":s.value=c}})}function tr(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Lu(e,t,n={}){const{window:r=Le}=n;return Ur(e,t,r==null?void 0:r.localStorage,n)}function Ei(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const nr=new WeakMap;function Mu(e,t=!1){const n=le(t);let r=null,s="";Ye(yi(e),l=>{const c=tr(Ne(l));if(c){const a=c;if(nr.get(a)||nr.set(a,a.style.overflow),a.style.overflow!=="hidden"&&(s=a.style.overflow),a.style.overflow==="hidden")return n.value=!0;if(n.value)return a.style.overflow="hidden"}},{immediate:!0});const o=()=>{const l=tr(Ne(e));!l||n.value||(_r&&(r=Xe(l,"touchmove",c=>{Pa(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},i=()=>{const l=tr(Ne(e));!l||!n.value||(_r&&(r==null||r()),l.style.overflow=s,nr.delete(l),n.value=!1)};return Vr(i),oe({get(){return n.value},set(l){l?o():i()}})}function Pu(e,t,n={}){const{window:r=Le}=n;return Ur(e,t,r==null?void 0:r.sessionStorage,n)}function Iu(e={}){const{window:t=Le,behavior:n="auto"}=e;if(!t)return{x:le(0),y:le(0)};const r=le(t.scrollX),s=le(t.scrollY),o=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),i=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return Xe(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:o,y:i}}const Ci=/^(?:[a-z]+:|\/\/)/i,Ia="vitepress-theme-appearance",xi=/#.*$/,Fa=/(index)?\.(md|html)$/,Se=typeof document<"u",Si={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Na(e,t,n=!1){if(t===void 0)return!1;if(e=Vs(`/${e}`),n)return new RegExp(t).test(e);if(Vs(t)!==e)return!1;const r=t.match(xi);return r?(Se?location.hash:"")===r[0]:!0}function Vs(e){return decodeURI(e).replace(xi,"").replace(Fa,"")}function $a(e){return Ci.test(e)}function Ha(e,t){var r,s,o,i,l,c,a;const n=Object.keys(e.locales).find(f=>f!=="root"&&!$a(f)&&Na(t,`/${f}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((o=e.locales[n])==null?void 0:o.title)??e.title,titleTemplate:((i=e.locales[n])==null?void 0:i.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Ai(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(a=e.locales[n])==null?void 0:a.themeConfig}})}function Ti(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=ja(e.title,r);return n===s.slice(3)?n:`${n}${s}`}function ja(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Ba(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([o,i])=>o===n&&i[s[0]]===s[1])}function Ai(e,t){return[...e.filter(n=>!Ba(t,n)),...t]}const Da=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,Va=/^[a-z]:/i;function Us(e){const t=Va.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Da,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Ua=new Set("3g2,3gp,7z,aac,abw,ai,aif,aifc,aiff,arc,asf,asr,asx,au,avi,avif,axs,azw,bin,bmp,bz,bz2,c,cda,cer,class,crl,crt,csh,css,csv,dcr,der,dll,doc,docx,eot,eps,epub,exe,gif,gtar,gz,gzip,ico,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,latex,m3u,man,mdb,mht,mhtml,mid,midi,mjs,mov,mp2,mp3,mp4,mpa,mpe,mpeg,mpg,mpkg,mpp,odp,ods,odt,oga,ogv,ogx,opus,otf,p10,p12,p7b,p7c,p7m,p7r,p7s,pbm,pdf,pfx,php,png,ppt,pptx,ps,pub,qt,rar,roff,rtf,rtx,ser,sh,spc,svg,swf,t,tar,tcl,tex,texi,texinfo,tgz,tif,tiff,tr,ts,tsv,ttf,txt,ua,viv,vivo,vsd,wav,weba,webm,webp,woff,woff2,xbm,xhtml,xls,xlsx,xml,xul,zip,conf".split(","));function ka(e){const t=e.split(".").pop();return t==null||!Ua.has(t.toLowerCase())}function Fu(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const Ka=Symbol(),ht=Ir(ha);function Nu(e){const t=oe(()=>Ha(ht.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?le(!0):n?Ma({storageKey:Ia,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):le(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>Ti(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function Wa(){const e=Tt(Ka);if(!e)throw new Error("vitepress data not properly injected in app");return e}function qa(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ks(e){return Ci.test(e)||!e.startsWith("/")?e:qa(ht.value.base,e)}function Ga(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Se){const n="/youqu3/";t=Us(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${Us(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let yn=[];function $u(e){yn.push(e),Hn(()=>{yn=yn.filter(t=>t!==e)})}const za=Symbol(),Ri="http://a.com",Ya=()=>({path:"/",component:null,data:Si});function Hu(e,t){const n=Mn(Ya()),r={route:n,go:s};async function s(l=Se?location.href:"/"){var c,a;l=Tn(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(qs(l),await i(l),await((a=r.onAfterRouteChanged)==null?void 0:a.call(r,l)))}let o=null;async function i(l,c=0,a=!1){var p;if(await((p=r.onBeforePageLoad)==null?void 0:p.call(r,l))===!1)return;const f=new URL(l,Ri),h=o=f.pathname;try{let y=await e(h);if(!y)throw new Error(`Page not found: ${h}`);if(o===h){o=null;const{default:w,__pageData:M}=y;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=Se?h:ks(h),n.component=pn(w),n.data=pn(M),Se&&In(()=>{let D=ht.value.base+M.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!ht.value.cleanUrls&&!D.endsWith("/")&&(D+=".html"),D!==f.pathname&&(f.pathname=D,l=D+f.search+f.hash,history.replaceState(null,"",l)),f.hash&&!c){let W=null;try{W=document.getElementById(decodeURIComponent(f.hash).slice(1))}catch(V){console.warn(V)}if(W){Ks(W,f.hash);return}}window.scrollTo(0,c)})}}catch(y){if(!/fetch|Page not found/.test(y.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(y),!a)try{const w=await fetch(ht.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await i(l,c,!0);return}catch{}o===h&&(o=null,n.path=Se?h:ks(h),n.component=t?pn(t):null,n.data=Si)}}return Se&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const a=l.target.closest("a");if(a&&!a.closest(".vp-raw")&&(a instanceof SVGElement||!a.download)){const{target:f}=a,{href:h,origin:p,pathname:y,hash:w,search:M}=new URL(a.href instanceof SVGAnimatedString?a.href.animVal:a.href,a.baseURI),D=window.location;!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!f&&p===D.origin&&ka(y)&&(l.preventDefault(),y===D.pathname&&M===D.search?(w!==D.hash&&(history.pushState(null,"",w),window.dispatchEvent(new Event("hashchange"))),w?Ks(a,w,a.classList.contains("header-anchor")):(qs(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",async l=>{var c;await i(Tn(location.href),l.state&&l.state.scrollPosition||0),(c=r.onAfterRouteChanged)==null||c.call(r,location.href)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Ja(){const e=Tt(za);if(!e)throw new Error("useRouter() is called without provider.");return e}function Oi(){return Ja().route}function Ks(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let s=function(){!n||Math.abs(a-window.scrollY)>window.innerHeight?window.scrollTo(0,a):window.scrollTo({left:0,top:a,behavior:"smooth"})},o=ht.value.scrollOffset,i=0,l=24;if(typeof o=="object"&&"padding"in o&&(l=o.padding,o=o.selector),typeof o=="number")i=o;else if(typeof o=="string")i=Ws(o,l);else if(Array.isArray(o))for(const f of o){const h=Ws(f,l);if(h){i=h;break}}const c=parseInt(window.getComputedStyle(r).paddingTop,10),a=window.scrollY+r.getBoundingClientRect().top-i+c;requestAnimationFrame(s)}}function Ws(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function qs(e){Se&&Tn(e)!==Tn(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function Tn(e){const t=new URL(e,Ri);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),ht.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const rr=()=>yn.forEach(e=>e()),ju=Nr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Oi(),{site:n}=Wa();return()=>yr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?yr(t.component,{onVnodeMounted:rr,onVnodeUpdated:rr,onVnodeUnmounted:rr}):"404 Page Not Found"])}}),Bu=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Xa="modulepreload",Qa=function(e){return"/youqu3/"+e},Gs={},Du=function(t,n,r){let s=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),i=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));s=Promise.all(n.map(l=>{if(l=Qa(l),l in Gs)return;Gs[l]=!0;const c=l.endsWith(".css"),a=c?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${l}"]${a}`))return;const f=document.createElement("link");if(f.rel=c?"stylesheet":Xa,c||(f.as="script",f.crossOrigin=""),f.href=l,i&&f.setAttribute("nonce",i),document.head.appendChild(f),c)return new Promise((h,p)=>{f.addEventListener("load",h),f.addEventListener("error",()=>p(new Error(`Unable to preload CSS for ${l}`)))})}))}return s.then(()=>t()).catch(o=>{const i=new Event("vite:preloadError",{cancelable:!0});if(i.payload=o,window.dispatchEvent(i),!i.defaultPrevented)throw o})},Vu="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/assert.png",Uu="/youqu3/init.gif",ku="/youqu3/%E6%8C%87%E5%8D%97/%E4%B8%8E%E7%94%9F%E4%BF%B1%E6%9D%A5/remote_control.png",Ku="/youqu3/logo.png",Wu="/youqu3/install.gif",qu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/log.png",Gu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/inside.png",zu="/youqu3/%E6%8F%92%E4%BB%B6/%E6%97%A5%E5%BF%97/outside.png",Yu="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1.drawio.png",Ju="/youqu3/%E8%AE%BE%E8%AE%A1/YouQu3%E6%9E%B6%E6%9E%84%E6%80%BB%E8%A7%88.drawio.png",Xu=Nr({setup(e,{slots:t}){const n=le(!1);return Rt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function Qu(){Se&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const o=r.querySelector(".blocks");if(!o)return;const i=Array.from(o.children).find(a=>a.classList.contains("active"));if(!i)return;const l=o.children[s];if(!l||i===l)return;i.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function Zu(){if(Se){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,o=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!o)return;const i=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className),l=[".vp-copy-ignore",".diff.remove"],c=o.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(f=>f.remove());let a=c.textContent||"";i&&(a=a.replace(/^ *(\$|>) /gm,"").trim()),Za(a).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const f=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,f)})}})}}async function Za(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function ef(e,t){let n=[],r=!0;const s=o=>{if(r){r=!1;return}const i=o.map(zs);n.forEach((l,c)=>{const a=i.findIndex(f=>f==null?void 0:f.isEqualNode(l??null));a!==-1?delete i[a]:(l==null||l.remove(),delete n[c])}),i.forEach(l=>l&&document.head.appendChild(l)),n=[...n,...i].filter(Boolean)};Br(()=>{const o=e.data,i=t.value,l=o&&o.description,c=o&&o.frontmatter.head||[],a=Ti(i,o);a!==document.title&&(document.title=a);const f=l||i.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==f&&h.setAttribute("content",f):zs(["meta",{name:"description",content:f}]),s(Ai(i.head,tu(c)))})}function zs([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function eu(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function tu(e){return e.filter(t=>!eu(t))}const sr=new Set,Li=()=>document.createElement("link"),nu=e=>{const t=Li();t.rel="prefetch",t.href=e,document.head.appendChild(t)},ru=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let fn;const su=Se&&(fn=Li())&&fn.relList&&fn.relList.supports&&fn.relList.supports("prefetch")?nu:ru;function tf(){if(!Se||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(o=>{o.forEach(i=>{if(i.isIntersecting){const l=i.target;n.unobserve(l);const{pathname:c}=l;if(!sr.has(c)){sr.add(c);const a=Ga(c);a&&su(a)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(o=>{const{hostname:i,pathname:l}=new URL(o.href instanceof SVGAnimatedString?o.href.animVal:o.href,o.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||o.target!=="_blank"&&i===location.hostname&&(l!==location.pathname?n.observe(o):sr.add(l))})})};Rt(r);const s=Oi();Ye(()=>s.path,r),Hn(()=>{n&&n.disconnect()})}export{hu as $,Hn as A,mu as B,Bl as C,au as D,fu as E,ye as F,Ir as G,$u as H,ie as I,uu as J,Ci as K,Oi as L,Rc as M,Tt as N,Ru as O,Ou as P,Cr as Q,In as R,Iu as S,ai as T,_u as U,Pn as V,cu as W,Du as X,Mu as Y,Zl as Z,Bu as _,oi as a,Eu as a0,wu as a1,pu as a2,xu as a3,yr as a4,Cu as a5,Vu as a6,Uu as a7,ku as a8,Ku as a9,Xe as aA,Lo as aB,lu as aC,vu as aD,de as aE,gu as aF,pn as aG,Fu as aH,Wu as aa,qu as ab,Gu as ac,zu as ad,Yu as ae,Ju as af,ef as ag,za as ah,Nu as ai,Ka as aj,ju as ak,Xu as al,ht as am,Su as an,Hu as ao,Ga as ap,tf as aq,Zu as ar,Qu as as,bt as at,Vr as au,Au as av,Pu as aw,Lu as ax,Tu as ay,Ja as az,ni as b,yu as c,Nr as d,bu as e,ka as f,ks as g,le as h,$a as i,Se as j,oe as k,Rt as l,si as m,xr as n,ei as o,vo as p,ou as q,du as r,iu as s,Wi as t,Wa as u,Na as v,Ll as w,Sa as x,Ye as y,Br as z}; diff --git a/assets/chunks/theme.D89Al4wk.js b/assets/chunks/theme.F2IToOfj.js similarity index 99% rename from assets/chunks/theme.D89Al4wk.js rename to assets/chunks/theme.F2IToOfj.js index ddfd7fb..726d681 100644 --- a/assets/chunks/theme.D89Al4wk.js +++ b/assets/chunks/theme.F2IToOfj.js @@ -1,4 +1,4 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.uXxUzkwX.js","assets/chunks/framework.CoRJFuj9.js"])))=>i.map(i=>d[i]); -import{d as b,o as s,c as l,r as v,n as H,a as j,t as T,b as y,w as p,e as f,T as ze,_ as g,u as Re,i as jt,f as Ut,g as qe,h as E,j as le,k as L,l as Y,m as u,p as i,q as Z,s as X,v as ie,x as Fe,y as te,z as Ce,A as Ke,B as ut,C as Gt,D as ce,F as A,E as G,G as dt,H as Te,I as _,J as re,K as mt,L as fe,M as we,N as Me,O as Rt,P as xe,Q as qt,R as We,S as vt,U as Kt,V as Wt,W as Yt,X as pt,Y as ht,Z as ft,$ as Zt,a0 as Xt,a1 as Jt,a2 as Qt,a3 as en,a4 as Ve,a5 as tn}from"./framework.CoRJFuj9.js";const nn=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(s(),l("span",{class:H(["VPBadge",e.type])},[v(e.$slots,"default",{},()=>[j(T(e.text),1)])],2))}}),on={key:0,class:"VPBackdrop"},an=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(s(),y(ze,{name:"fade"},{default:p(()=>[e.show?(s(),l("div",on)):f("",!0)]),_:1}))}}),sn=g(an,[["__scopeId","data-v-7400d5fd"]]),z=Re;function rn(n,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(n,e):(n(),(o=!0)&&setTimeout(()=>o=!1,e))}}function je(n){return/^\//.test(n)?n:`/${n}`}function Ye(n){const{pathname:e,search:t,hash:o,protocol:a}=new URL(n,"http://a.com");if(jt(n)||n.startsWith("#")||!a.startsWith("http")||!Ut(e))return n;const{site:r}=z(),c=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${o}`);return qe(c)}const Ze=E(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function _e({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:o,page:a,theme:r}=z(),c=L(()=>{var m,k;return{label:(m=t.value.locales[o.value])==null?void 0:m.label,link:((k=t.value.locales[o.value])==null?void 0:k.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:L(()=>Object.entries(t.value.locales).flatMap(([m,k])=>n&&c.value.label===k.label?[]:{text:k.label,link:ln(k.link||(m==="root"?"/":`/${m}/`),r.value.i18nRouting!==!1&&e,a.value.relativePath.slice(c.value.link.length-1),!t.value.cleanUrls)+Ze.value})),currentLang:c}}function ln(n,e,t,o){return e?n.replace(/\/$/,"")+je(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):n}const cn=n=>(Z("data-v-922e1a30"),n=n(),X(),n),un={class:"NotFound"},dn={class:"code"},mn={class:"title"},vn=cn(()=>u("div",{class:"divider"},null,-1)),pn={class:"quote"},hn={class:"action"},fn=["href","aria-label"],_n=b({__name:"NotFound",setup(n){const{site:e,theme:t}=z(),{localeLinks:o}=_e({removeCurrent:!1}),a=E("/");return Y(()=>{var c;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(a.value=((c=o.value.find(({link:d})=>d.startsWith(r)))==null?void 0:c.link)||o.value[0].link)}),(r,c)=>{var d,m,k,$,w;return s(),l("div",un,[u("p",dn,T(((d=i(t).notFound)==null?void 0:d.code)??"404"),1),u("h1",mn,T(((m=i(t).notFound)==null?void 0:m.title)??"PAGE NOT FOUND"),1),vn,u("blockquote",pn,T(((k=i(t).notFound)==null?void 0:k.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),u("div",hn,[u("a",{class:"link",href:i(qe)(a.value),"aria-label":(($=i(t).notFound)==null?void 0:$.linkLabel)??"go to home"},T(((w=i(t).notFound)==null?void 0:w.linkText)??"Take me home"),9,fn)])])}}}),gn=g(_n,[["__scopeId","data-v-922e1a30"]]);function _t(n,e){if(Array.isArray(n))return Le(n);if(n==null)return[];e=je(e);const t=Object.keys(n).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(je(a))),o=t?n[t]:[];return Array.isArray(o)?Le(o):Le(o.items,o.base)}function bn(n){const e=[];let t=0;for(const o in n){const a=n[o];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function kn(n){const e=[];function t(o){for(const a of o)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(n),e}function Ue(n,e){return Array.isArray(e)?e.some(t=>Ue(n,t)):ie(n,e.link)?!0:e.items?Ue(n,e.items):!1}function Le(n,e){return[...n].map(t=>{const o={...t},a=o.base||e;return a&&o.link&&(o.link=a+o.link),o.items&&(o.items=Le(o.items,a)),o})}function ne(){const{frontmatter:n,page:e,theme:t}=z(),o=Fe("(min-width: 960px)"),a=E(!1),r=L(()=>{const I=t.value.sidebar,N=e.value.relativePath;return I?_t(I,N):[]}),c=E(r.value);te(r,(I,N)=>{JSON.stringify(I)!==JSON.stringify(N)&&(c.value=r.value)});const d=L(()=>n.value.sidebar!==!1&&c.value.length>0&&n.value.layout!=="home"),m=L(()=>k?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),k=L(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),$=L(()=>d.value&&o.value),w=L(()=>d.value?bn(c.value):[]);function S(){a.value=!0}function B(){a.value=!1}function V(){a.value?B():S()}return{isOpen:a,sidebar:c,sidebarGroups:w,hasSidebar:d,hasAside:k,leftAside:m,isSidebarEnabled:$,open:S,close:B,toggle:V}}function $n(n,e){let t;Ce(()=>{t=n.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),Ke(()=>{window.removeEventListener("keyup",o)});function o(a){a.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function yn(n){const{page:e}=z(),t=E(!1),o=L(()=>n.value.collapsed!=null),a=L(()=>!!n.value.link),r=E(!1),c=()=>{r.value=ie(e.value.relativePath,n.value.link)};te([e,n,Ze],c),Y(c);const d=L(()=>r.value?!0:n.value.items?Ue(e.value.relativePath,n.value.items):!1),m=L(()=>!!(n.value.items&&n.value.items.length));Ce(()=>{t.value=!!(o.value&&n.value.collapsed)}),ut(()=>{(r.value||d.value)&&(t.value=!1)});function k(){o.value&&(t.value=!t.value)}return{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:d,hasChildren:m,toggle:k}}function wn(){const{hasSidebar:n}=ne(),e=Fe("(min-width: 960px)"),t=Fe("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ge=[];function gt(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Xe(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:Ln(t),link:"#"+t.id,level:o}});return Pn(e,n)}function Ln(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pn(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(c=>c.level>=o&&c.level<=a),Ge.length=0;for(const{element:c,link:d}of n)Ge.push({element:c,link:d});const r=[];e:for(let c=0;c=0;m--){const k=n[m];if(k.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Gt(()=>{c(location.hash)}),Ke(()=>{window.removeEventListener("scroll",o)});function r(){if(!t.value)return;const d=(()=>{var I;const V=(I=document.querySelector("#VPContent .VPDoc"))==null?void 0:I.firstElementChild;return V?ot(V):78})(),m=window.scrollY,k=window.innerHeight,$=document.body.offsetHeight,w=Math.abs(m+k-$)<1,S=Ge.map(({element:V,link:I})=>({link:I,top:ot(V)})).filter(({top:V})=>!Number.isNaN(V)).sort((V,I)=>V.top-I.top);if(!S.length){c(null);return}if(m<1){c(null);return}if(w){c(S[S.length-1].link);return}let B=null;for(const{link:V,top:I}of S){if(I>m+d)break;B=V}c(B)}function c(d){a&&a.classList.remove("active"),d==null?a=null:a=n.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const m=a;m?(m.classList.add("active"),e.value.style.top=m.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ot(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const Sn=["href","title"],zn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const o=t.href.split("#")[1],a=document.getElementById(decodeURIComponent(o));a==null||a.focus({preventScroll:!0})}return(t,o)=>{const a=ce("VPDocOutlineItem",!0);return s(),l("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),l(A,null,G(t.headers,({children:r,link:c,title:d})=>(s(),l("li",null,[u("a",{class:"outline-link",href:c,onClick:e,title:d},T(d),9,Sn),r!=null&&r.length?(s(),y(a,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}}),bt=g(zn,[["__scopeId","data-v-cf5865db"]]),Cn=n=>(Z("data-v-e2c17725"),n=n(),X(),n),Tn={class:"content"},Mn={class:"outline-title",role:"heading","aria-level":"2"},In={"aria-labelledby":"doc-outline-aria-label"},En=Cn(()=>u("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Nn=b({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=z(),o=dt([]);Te(()=>{o.value=Xe(e.value.outline??t.value.outline)});const a=E(),r=E();return Vn(a,r),(c,d)=>(s(),l("div",{class:H(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:a,role:"navigation"},[u("div",Tn,[u("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),u("div",Mn,T(i(gt)(i(t))),1),u("nav",In,[En,_(bt,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Hn=g(Nn,[["__scopeId","data-v-e2c17725"]]),An={class:"VPDocAsideCarbonAds"},Bn=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,o)=>(s(),l("div",An,[_(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),On=n=>(Z("data-v-8b9c5d2d"),n=n(),X(),n),Dn={class:"VPDocAside"},Fn=On(()=>u("div",{class:"spacer"},null,-1)),xn=b({__name:"VPDocAside",setup(n){const{theme:e}=z();return(t,o)=>(s(),l("div",Dn,[v(t.$slots,"aside-top",{},void 0,!0),v(t.$slots,"aside-outline-before",{},void 0,!0),_(Hn),v(t.$slots,"aside-outline-after",{},void 0,!0),Fn,v(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),y(Bn,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),v(t.$slots,"aside-ads-after",{},void 0,!0),v(t.$slots,"aside-bottom",{},void 0,!0)]))}}),jn=g(xn,[["__scopeId","data-v-8b9c5d2d"]]);function Un(){const{theme:n,page:e}=z();return L(()=>{const{text:t="Edit this page",pattern:o=""}=n.value.editLink||{};let a;return typeof o=="function"?a=o(e.value):a=o.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function Gn(){const{page:n,theme:e,frontmatter:t}=z();return L(()=>{var m,k,$,w,S,B,V,I;const o=_t(e.value.sidebar,n.value.relativePath),a=kn(o),r=a.findIndex(N=>ie(n.value.relativePath,N.link)),c=((m=e.value.docFooter)==null?void 0:m.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((k=e.value.docFooter)==null?void 0:k.next)===!1&&!t.value.next||t.value.next===!1;return{prev:c?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??(($=a[r-1])==null?void 0:$.docFooterText)??((w=a[r-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=a[r-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((B=a[r+1])==null?void 0:B.docFooterText)??((V=a[r+1])==null?void 0:V.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((I=a[r+1])==null?void 0:I.link)}}})}const Rn={},qn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kn=u("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Wn=u("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Yn=[Kn,Wn];function Zn(n,e){return s(),l("svg",qn,Yn)}const Xn=g(Rn,[["render",Zn]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=L(()=>e.tag??(e.href?"a":"span")),o=L(()=>e.href&&mt.test(e.href));return(a,r)=>(s(),y(re(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":o.value,"no-icon":a.noIcon}]),href:a.href?i(Ye)(a.href):void 0,target:a.target??(o.value?"_blank":void 0),rel:a.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[v(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jn={class:"VPLastUpdated"},Qn=["datetime"],eo=b({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:o,lang:a}=z(),r=L(()=>new Date(o.value.lastUpdated??t.value.lastUpdated)),c=L(()=>r.value.toISOString()),d=E("");return Y(()=>{Ce(()=>{var m,k,$;d.value=new Intl.DateTimeFormat((k=(m=e.value.lastUpdated)==null?void 0:m.formatOptions)!=null&&k.forceLocale?a.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(m,k)=>{var $;return s(),l("p",Jn,[j(T((($=i(e).lastUpdated)==null?void 0:$.text)||i(e).lastUpdatedText||"Last updated")+": ",1),u("time",{datetime:c.value},T(d.value),9,Qn)])}}}),to=g(eo,[["__scopeId","data-v-42f5af39"]]),no={key:0,class:"VPDocFooter"},oo={key:0,class:"edit-info"},ao={key:0,class:"edit-link"},so={key:1,class:"last-updated"},ro={key:1,class:"prev-next"},io={class:"pager"},lo=["innerHTML"],co=["innerHTML"],uo={class:"pager"},mo=["innerHTML"],vo=["innerHTML"],po=b({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:o}=z(),a=Un(),r=Gn(),c=L(()=>e.value.editLink&&o.value.editLink!==!1),d=L(()=>t.value.lastUpdated&&o.value.lastUpdated!==!1),m=L(()=>c.value||d.value||r.value.prev||r.value.next);return(k,$)=>{var w,S,B,V;return m.value?(s(),l("footer",no,[v(k.$slots,"doc-footer-before",{},void 0,!0),c.value||d.value?(s(),l("div",oo,[c.value?(s(),l("div",ao,[_(K,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[_(Xn,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+T(i(a).text),1)]),_:1},8,["href"])])):f("",!0),d.value?(s(),l("div",so,[_(to)])):f("",!0)])):f("",!0),(w=i(r).prev)!=null&&w.link||(S=i(r).next)!=null&&S.link?(s(),l("nav",ro,[u("div",io,[(B=i(r).prev)!=null&&B.link?(s(),y(K,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.prev)||"Previous page"},null,8,lo),u("span",{class:"title",innerHTML:i(r).prev.text},null,8,co)]}),_:1},8,["href"])):f("",!0)]),u("div",uo,[(V=i(r).next)!=null&&V.link?(s(),y(K,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.next)||"Next page"},null,8,mo),u("span",{class:"title",innerHTML:i(r).next.text},null,8,vo)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),ho=g(po,[["__scopeId","data-v-c6c7078a"]]),fo=n=>(Z("data-v-c1252fdc"),n=n(),X(),n),_o={class:"container"},go=fo(()=>u("div",{class:"aside-curtain"},null,-1)),bo={class:"aside-container"},ko={class:"aside-content"},$o={class:"content"},yo={class:"content-container"},wo={class:"main"},Lo=b({__name:"VPDoc",setup(n){const{theme:e}=z(),t=fe(),{hasSidebar:o,hasAside:a,leftAside:r}=ne(),c=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,m)=>{const k=ce("Content");return s(),l("div",{class:H(["VPDoc",{"has-sidebar":i(o),"has-aside":i(a)}])},[v(d.$slots,"doc-top",{},void 0,!0),u("div",_o,[i(a)?(s(),l("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[go,u("div",bo,[u("div",ko,[_(jn,null,{"aside-top":p(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),u("div",$o,[u("div",yo,[v(d.$slots,"doc-before",{},void 0,!0),u("main",wo,[_(k,{class:H(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(ho,null,{"doc-footer-before":p(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(d.$slots,"doc-after",{},void 0,!0)])])]),v(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Po=g(Lo,[["__scopeId","data-v-c1252fdc"]]),Vo=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=L(()=>e.href&&mt.test(e.href)),o=L(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),y(re(o.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ye)(a.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[j(T(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),So=g(Vo,[["__scopeId","data-v-5a0572b2"]]),zo=["src","alt"],Co=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const o=ce("VPImage",!0);return e.image?(s(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),l("img",we({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(qe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,zo)):(s(),l(A,{key:1},[_(o,we({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,we({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Se=g(Co,[["__scopeId","data-v-52554789"]]),To=n=>(Z("data-v-27e36ebe"),n=n(),X(),n),Mo={class:"container"},Io={class:"main"},Eo={key:0,class:"name"},No=["innerHTML"],Ho=["innerHTML"],Ao=["innerHTML"],Bo={key:0,class:"actions"},Oo={key:0,class:"image"},Do={class:"image-container"},Fo=To(()=>u("div",{class:"image-bg"},null,-1)),xo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=Me("hero-image-slot-exists");return(t,o)=>(s(),l("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[u("div",Mo,[u("div",Io,[v(t.$slots,"home-hero-info",{},()=>[t.name?(s(),l("h1",Eo,[u("span",{innerHTML:t.name,class:"clip"},null,8,No)])):f("",!0),t.text?(s(),l("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ho)):f("",!0),t.tagline?(s(),l("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ao)):f("",!0)],!0),t.actions?(s(),l("div",Bo,[(s(!0),l(A,null,G(t.actions,a=>(s(),l("div",{key:a.link,class:"action"},[_(So,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(s(),l("div",Oo,[u("div",Do,[Fo,v(t.$slots,"home-hero-image",{},()=>[t.image?(s(),y(Se,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),jo=g(xo,[["__scopeId","data-v-27e36ebe"]]),Uo=b({__name:"VPHomeHero",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).hero?(s(),y(jo,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[v(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[v(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Go={},Ro={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qo=u("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Ko=[qo];function Wo(n,e){return s(),l("svg",Ro,Ko)}const Yo=g(Go,[["render",Wo]]),Zo={class:"box"},Xo={key:0,class:"icon"},Jo=["innerHTML"],Qo=["innerHTML"],ea=["innerHTML"],ta={key:4,class:"link-text"},na={class:"link-text-value"},oa=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(s(),y(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[u("article",Zo,[typeof e.icon=="object"&&e.icon.wrap?(s(),l("div",Xo,[_(Se,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),y(Se,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),l("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Jo)):f("",!0),u("h2",{class:"title",innerHTML:e.title},null,8,Qo),e.details?(s(),l("p",{key:3,class:"details",innerHTML:e.details},null,8,ea)):f("",!0),e.linkText?(s(),l("div",ta,[u("p",na,[j(T(e.linkText)+" ",1),_(Yo,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),aa=g(oa,[["__scopeId","data-v-790a0f07"]]),sa={key:0,class:"VPFeatures"},ra={class:"container"},ia={class:"items"},la=b({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=L(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,a)=>o.features?(s(),l("div",sa,[u("div",ra,[u("div",ia,[(s(!0),l(A,null,G(o.features,r=>(s(),l("div",{key:r.title,class:H(["item",[t.value]])},[_(aa,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),ca=g(la,[["__scopeId","data-v-8c75346a"]]),ua=b({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).features?(s(),y(ca,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),da={class:"VPHome"},ma=b({__name:"VPHome",setup(n){return(e,t)=>{const o=ce("Content");return s(),l("div",da,[v(e.$slots,"home-hero-before",{},void 0,!0),_(Uo,null,{"home-hero-info":p(()=>[v(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(e.$slots,"home-hero-after",{},void 0,!0),v(e.$slots,"home-features-before",{},void 0,!0),_(ua),v(e.$slots,"home-features-after",{},void 0,!0),_(o)])}}}),va=g(ma,[["__scopeId","data-v-f308d76d"]]),pa={},ha={class:"VPPage"};function fa(n,e){const t=ce("Content");return s(),l("div",ha,[v(n.$slots,"page-top"),_(t),v(n.$slots,"page-bottom")])}const _a=g(pa,[["render",fa]]),ga=b({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>(s(),l("div",{class:H(["VPContent",{"has-sidebar":i(o),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(a.$slots,"not-found",{key:0},()=>[_(gn)],!0):i(t).layout==="page"?(s(),y(_a,{key:1},{"page-top":p(()=>[v(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),y(va,{key:2},{"home-hero-before":p(()=>[v(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),y(re(i(t).layout),{key:3})):(s(),y(Po,{key:4},{"doc-top":p(()=>[v(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[v(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[v(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[v(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[v(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ba=g(ga,[["__scopeId","data-v-d9b0d414"]]),ka={class:"container"},$a=["innerHTML"],ya=["innerHTML"],wa=b({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),l("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(o)}])},[u("div",ka,[i(e).footer.message?(s(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,$a)):f("",!0),i(e).footer.copyright?(s(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ya)):f("",!0)])],2)):f("",!0)}}),La=g(wa,[["__scopeId","data-v-83c9c484"]]);function kt(){const{theme:n,frontmatter:e}=z(),t=dt([]),o=L(()=>t.value.length>0);return Te(()=>{t.value=Xe(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:o}}const Pa={},Va={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Sa=u("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),za=[Sa];function Ca(n,e){return s(),l("svg",Va,za)}const $t=g(Pa,[["render",Ca]]),Ta={class:"header"},Ma={class:"outline"},Ia=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=z(),o=E(!1),a=E(0),r=E(),c=E();Rt(r,()=>{o.value=!1}),xe("Escape",()=>{o.value=!1}),Te(()=>{o.value=!1});function d(){o.value=!o.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function m($){$.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),We(()=>{o.value=!1}))}function k(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(s(),l("div",{class:"VPLocalNavOutlineDropdown",style:qt({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[$.headers.length>0?(s(),l("button",{key:0,onClick:d,class:H({open:o.value})},[j(T(i(gt)(i(t)))+" ",1),_($t,{class:"icon"})],2)):(s(),l("button",{key:1,onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)),_(ze,{name:"flyout"},{default:p(()=>[o.value?(s(),l("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:m},[u("div",Ta,[u("a",{class:"top-link",href:"#",onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)]),u("div",Ma,[_(bt,{headers:$.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ea=g(Ia,[["__scopeId","data-v-2d2d5d54"]]),Na={},Ha={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Aa=u("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ba=u("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Oa=u("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Da=u("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Fa=[Aa,Ba,Oa,Da];function xa(n,e){return s(),l("svg",Ha,Fa)}const ja=g(Na,[["render",xa]]),Ua={class:"container"},Ga=["aria-expanded"],Ra={class:"menu-text"},qa=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne(),{headers:a}=kt(),{y:r}=vt(),c=E(0);Y(()=>{c.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Te(()=>{a.value=Xe(t.value.outline??e.value.outline)});const d=L(()=>a.value.length===0),m=L(()=>d.value&&!o.value),k=L(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:m.value}));return($,w)=>i(t).layout!=="home"&&(!m.value||i(r)>=c.value)?(s(),l("div",{key:0,class:H(k.value)},[u("div",Ua,[i(o)?(s(),l("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[_(ja,{class:"menu-icon"}),u("span",Ra,T(i(e).sidebarMenuLabel||"Menu"),1)],8,Ga)):f("",!0),_(Ea,{headers:i(a),navHeight:c.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Ka=g(qa,[["__scopeId","data-v-2158a76a"]]);function Wa(){const n=E(!1);function e(){n.value=!0,window.addEventListener("resize",a)}function t(){n.value=!1,window.removeEventListener("resize",a)}function o(){n.value?t():e()}function a(){window.outerWidth>=768&&t()}const r=fe();return te(()=>r.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:o}}const Ya={},Za={class:"VPSwitch",type:"button",role:"switch"},Xa={class:"check"},Ja={key:0,class:"icon"};function Qa(n,e){return s(),l("button",Za,[u("span",Xa,[n.$slots.default?(s(),l("span",Ja,[v(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const es=g(Ya,[["render",Qa],["__scopeId","data-v-79d0ed95"]]),ts={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},os=u("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),as=[os];function ss(n,e){return s(),l("svg",ns,as)}const rs=g(ts,[["render",ss]]),is={},ls={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},cs=Kt('',9),us=[cs];function ds(n,e){return s(),l("svg",ls,us)}const ms=g(is,[["render",ds]]),vs=b({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=z(),o=Me("toggle-appearance",()=>{e.value=!e.value}),a=L(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(r,c)=>(s(),y(es,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(o)},{default:p(()=>[_(ms,{class:"sun"}),_(rs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Je=g(vs,[["__scopeId","data-v-0298adb0"]]),ps={key:0,class:"VPNavBarAppearance"},hs=b({__name:"VPNavBarAppearance",setup(n){const{site:e}=z();return(t,o)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",ps,[_(Je)])):f("",!0)}}),fs=g(hs,[["__scopeId","data-v-0e934124"]]),Qe=E();let yt=!1,Oe=0;function _s(n){const e=E(!1);if(le){!yt&&gs(),Oe++;const t=te(Qe,o=>{var a,r,c;o===n.el.value||(a=n.el.value)!=null&&a.contains(o)?(e.value=!0,(r=n.onFocus)==null||r.call(n)):(e.value=!1,(c=n.onBlur)==null||c.call(n))});Ke(()=>{t(),Oe--,Oe||bs()})}return Wt(e)}function gs(){document.addEventListener("focusin",wt),yt=!0,Qe.value=document.activeElement}function bs(){document.removeEventListener("focusin",wt)}function wt(){Qe.value=document.activeElement}const ks={},$s={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ys=u("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),ws=[ys];function Ls(n,e){return s(),l("svg",$s,ws)}const Lt=g(ks,[["render",Ls]]),Ps={},Vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ss=u("circle",{cx:"12",cy:"12",r:"2"},null,-1),zs=u("circle",{cx:"19",cy:"12",r:"2"},null,-1),Cs=u("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ts=[Ss,zs,Cs];function Ms(n,e){return s(),l("svg",Vs,Ts)}const Is=g(Ps,[["render",Ms]]),Es={class:"VPMenuLink"},Ns=b({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),l("div",Es,[_(K,{class:H({active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ie=g(Ns,[["__scopeId","data-v-9d1535a1"]]),Hs={class:"VPMenuGroup"},As={key:0,class:"title"},Bs=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",Hs,[e.text?(s(),l("p",As,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),l(A,null,["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),Os=g(Bs,[["__scopeId","data-v-c1904112"]]),Ds={class:"VPMenu"},Fs={key:0,class:"items"},xs=b({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(s(),l("div",Ds,[e.items?(s(),l("div",Fs,[(s(!0),l(A,null,G(e.items,o=>(s(),l(A,{key:o.text},["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):(s(),y(Os,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),v(e.$slots,"default",{},void 0,!0)]))}}),js=g(xs,[["__scopeId","data-v-e699aa0c"]]),Us=["aria-expanded","aria-label"],Gs={key:0,class:"text"},Rs=["innerHTML"],qs={class:"menu"},Ks=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=E(!1),t=E();_s({el:t,onBlur:o});function o(){e.value=!1}return(a,r)=>(s(),l("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[u("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:r[0]||(r[0]=c=>e.value=!e.value)},[a.button||a.icon?(s(),l("span",Gs,[a.icon?(s(),y(re(a.icon),{key:0,class:"option-icon"})):f("",!0),a.button?(s(),l("span",{key:1,innerHTML:a.button},null,8,Rs)):f("",!0),_(Lt,{class:"text-icon"})])):(s(),y(Is,{key:1,class:"icon"}))],8,Us),u("div",qs,[_(js,{items:a.items},{default:p(()=>[v(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),et=g(Ks,[["__scopeId","data-v-eaf183b7"]]),Ws={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Ys=["href","aria-label","innerHTML"],Zs=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=L(()=>typeof e.icon=="object"?e.icon.svg:Ws[e.icon]);return(o,a)=>(s(),l("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ys))}}),Xs=g(Zs,[["__scopeId","data-v-f4d58015"]]),Js={class:"VPSocialLinks"},Qs=b({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(s(),l("div",Js,[(s(!0),l(A,null,G(e.links,({link:o,icon:a,ariaLabel:r})=>(s(),y(Xs,{key:o,icon:a,link:o,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),Ee=g(Qs,[["__scopeId","data-v-20ea2c3a"]]),er={key:0,class:"group translations"},tr={class:"trans-title"},nr={key:1,class:"group"},or={class:"item appearance"},ar={class:"label"},sr={class:"appearance-action"},rr={key:2,class:"group"},ir={class:"item social-links"},lr=b({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=z(),{localeLinks:o,currentLang:a}=_e({correspondingLink:!0}),r=L(()=>o.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(c,d)=>r.value?(s(),y(et,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(a).label?(s(),l("div",er,[u("p",tr,T(i(a).label),1),(s(!0),l(A,null,G(i(o),m=>(s(),y(Ie,{key:m.link,item:m},null,8,["item"]))),128))])):f("",!0),i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",nr,[u("div",or,[u("p",ar,T(i(t).darkModeSwitchLabel||"Appearance"),1),u("div",sr,[_(Je)])])])):f("",!0),i(t).socialLinks?(s(),l("div",rr,[u("div",ir,[_(Ee,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),cr=g(lr,[["__scopeId","data-v-a4952b56"]]),ur=n=>(Z("data-v-5df5a4ba"),n=n(),X(),n),dr=["aria-expanded"],mr=ur(()=>u("span",{class:"container"},[u("span",{class:"top"}),u("span",{class:"middle"}),u("span",{class:"bottom"})],-1)),vr=[mr],pr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(s(),l("button",{type:"button",class:H(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},vr,10,dr))}}),hr=g(pr,[["__scopeId","data-v-5df5a4ba"]]),fr=["innerHTML"],_r=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),y(K,{class:H({VPNavBarMenuLink:!0,active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[u("span",{innerHTML:t.item.text},null,8,fr)]),_:1},8,["class","href","target","rel"]))}}),gr=g(_r,[["__scopeId","data-v-01a9a2a9"]]),br=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=z(),o=r=>"link"in r?ie(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(o),a=L(()=>o(e.item));return(r,c)=>(s(),y(et,{class:H({VPNavBarMenuGroup:!0,active:i(ie)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),kr=n=>(Z("data-v-10e7ffc9"),n=n(),X(),n),$r={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},yr=kr(()=>u("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),wr=b({__name:"VPNavBarMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",$r,[yr,(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(gr,{key:0,item:a},null,8,["item"])):(s(),y(br,{key:1,item:a},null,8,["item"]))],64))),128))])):f("",!0)}}),Lr=g(wr,[["__scopeId","data-v-10e7ffc9"]]);function Pr(n){const{localeIndex:e,theme:t}=z();function o(a){var V,I,N;const r=a.split("."),c=(V=t.value.search)==null?void 0:V.options,d=c&&typeof c=="object",m=d&&((N=(I=c.locales)==null?void 0:I[e.value])==null?void 0:N.translations)||null,k=d&&c.translations||null;let $=m,w=k,S=n;const B=r.pop();for(const ue of r){let J=null;const F=S==null?void 0:S[ue];F&&(J=S=F);const oe=w==null?void 0:w[ue];oe&&(J=w=oe);const Q=$==null?void 0:$[ue];Q&&(J=$=Q),F||(S=J),oe||(w=J),Q||($=J)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return o}const Vr=["aria-label"],Sr={class:"DocSearch-Button-Container"},zr=u("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[u("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Cr={class:"DocSearch-Button-Placeholder"},Tr=u("span",{class:"DocSearch-Button-Keys"},[u("kbd",{class:"DocSearch-Button-Key"}),u("kbd",{class:"DocSearch-Button-Key"},"K")],-1),at=b({__name:"VPNavBarSearchButton",setup(n){const t=Pr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,a)=>(s(),l("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[u("span",Sr,[zr,u("span",Cr,T(i(t)("button.buttonText")),1)]),Tr],8,Vr))}}),Mr={class:"VPNavBarSearch"},Ir={id:"local-search"},Er={key:1,id:"docsearch"},Nr=b({__name:"VPNavBarSearch",setup(n){const e=Yt(()=>pt(()=>import("./VPLocalSearchBox.uXxUzkwX.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=z(),a=E(!1),r=E(!1);Y(()=>{});function c(){a.value||(a.value=!0,setTimeout(d,16))}function d(){const w=new Event("keydown");w.key="k",w.metaKey=!0,window.dispatchEvent(w),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function m(w){const S=w.target,B=S.tagName;return S.isContentEditable||B==="INPUT"||B==="SELECT"||B==="TEXTAREA"}const k=E(!1);xe("k",w=>{(w.ctrlKey||w.metaKey)&&(w.preventDefault(),k.value=!0)}),xe("/",w=>{m(w)||(w.preventDefault(),k.value=!0)});const $="local";return(w,S)=>{var B;return s(),l("div",Mr,[i($)==="local"?(s(),l(A,{key:0},[k.value?(s(),y(i(e),{key:0,onClose:S[0]||(S[0]=V=>k.value=!1)})):f("",!0),u("div",Ir,[_(at,{onClick:S[1]||(S[1]=V=>k.value=!0)})])],64)):i($)==="algolia"?(s(),l(A,{key:1},[a.value?(s(),y(i(t),{key:0,algolia:((B=i(o).search)==null?void 0:B.options)??i(o).algolia,onVnodeBeforeMount:S[2]||(S[2]=V=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(s(),l("div",Er,[_(at,{onClick:c})]))],64)):f("",!0)])}}}),Hr=b({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar=g(Hr,[["__scopeId","data-v-17479deb"]]),Br=["href","rel","target"],Or=b({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=z(),{hasSidebar:o}=ne(),{currentLang:a}=_e(),r=L(()=>{var m;return typeof t.value.logoLink=="string"?t.value.logoLink:(m=t.value.logoLink)==null?void 0:m.link}),c=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.rel}),d=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.target});return(m,k)=>(s(),l("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(o)}])},[u("a",{class:"title",href:r.value??i(Ye)(i(a).link),rel:c.value,target:d.value},[v(m.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),y(Se,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(s(),l(A,{key:1},[j(T(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(s(),l(A,{key:2},[j(T(i(e).title),1)],64)):f("",!0),v(m.$slots,"nav-bar-title-after",{},void 0,!0)],8,Br)],2))}}),Dr=g(Or,[["__scopeId","data-v-2256aec7"]]),Fr={},xr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jr=u("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ur=u("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Gr=[jr,Ur];function Rr(n,e){return s(),l("svg",xr,Gr)}const Pt=g(Fr,[["render",Rr]]),qr={class:"items"},Kr={class:"title"},Wr=b({__name:"VPNavBarTranslations",setup(n){const{theme:e}=z(),{localeLinks:t,currentLang:o}=_e({correspondingLink:!0});return(a,r)=>i(t).length&&i(o).label?(s(),y(et,{key:0,class:"VPNavBarTranslations",icon:Pt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[u("div",qr,[u("p",Kr,T(i(o).label),1),(s(!0),l(A,null,G(i(t),c=>(s(),y(Ie,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Yr=g(Wr,[["__scopeId","data-v-56a52592"]]),Zr=n=>(Z("data-v-9ec51abf"),n=n(),X(),n),Xr={class:"wrapper"},Jr={class:"container"},Qr={class:"title"},ei={class:"content"},ti={class:"content-body"},ni=Zr(()=>u("div",{class:"divider"},[u("div",{class:"divider-line"})],-1)),oi=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=vt(),{hasSidebar:t}=ne(),{hasLocalNav:o}=kt(),{frontmatter:a}=z(),r=E({});return ut(()=>{r.value={"has-sidebar":t.value,"has-local-nav":o.value,top:a.value.layout==="home"&&e.value===0}}),(c,d)=>(s(),l("div",{class:H(["VPNavBar",r.value])},[u("div",Xr,[u("div",Jr,[u("div",Qr,[_(Dr,null,{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),u("div",ei,[u("div",ti,[v(c.$slots,"nav-bar-content-before",{},void 0,!0),_(Nr,{class:"search"}),_(Lr,{class:"menu"}),_(Yr,{class:"translations"}),_(fs,{class:"appearance"}),_(Ar,{class:"social-links"}),_(cr,{class:"extra"}),v(c.$slots,"nav-bar-content-after",{},void 0,!0),_(hr,{class:"hamburger",active:c.isScreenOpen,onClick:d[0]||(d[0]=m=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),ni],2))}}),ai=g(oi,[["__scopeId","data-v-9ec51abf"]]),si={key:0,class:"VPNavScreenAppearance"},ri={class:"text"},ii=b({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=z();return(o,a)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",si,[u("p",ri,T(i(t).darkModeSwitchLabel||"Appearance"),1),_(Je)])):f("",!0)}}),li=g(ii,[["__scopeId","data-v-2f05ca60"]]),ci=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ui=g(ci,[["__scopeId","data-v-13a0f76d"]]),di={},mi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vi=u("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),pi=[vi];function hi(n,e){return s(),l("svg",mi,pi)}const fi=g(di,[["render",hi]]),_i=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Vt=g(_i,[["__scopeId","data-v-a77909ab"]]),gi={class:"VPNavScreenMenuGroupSection"},bi={key:0,class:"title"},ki=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",gi,[e.text?(s(),l("p",bi,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),y(Vt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),$i=g(ki,[["__scopeId","data-v-02647012"]]),yi=["aria-controls","aria-expanded"],wi=["innerHTML"],Li=["id"],Pi={key:1,class:"group"},Vi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=E(!1),o=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,c)=>(s(),l("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[u("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:a},[u("span",{class:"button-text",innerHTML:r.text},null,8,wi),_(fi,{class:"button-icon"})],8,yi),u("div",{id:o.value,class:"items"},[(s(!0),l(A,null,G(r.items,d=>(s(),l(A,{key:d.text},["link"in d?(s(),l("div",{key:d.text,class:"item"},[_(Vt,{item:d},null,8,["item"])])):(s(),l("div",Pi,[_($i,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,Li)],2))}}),Si=g(Vi,[["__scopeId","data-v-add8adf0"]]),zi={key:0,class:"VPNavScreenMenu"},Ci=b({__name:"VPNavScreenMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",zi,[(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(ui,{key:0,item:a},null,8,["item"])):(s(),y(Si,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ti=b({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Mi={class:"list"},Ii=b({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=_e({correspondingLink:!0}),o=E(!1);function a(){o.value=!o.value}return(r,c)=>i(e).length&&i(t).label?(s(),l("div",{key:0,class:H(["VPNavScreenTranslations",{open:o.value}])},[u("button",{class:"title",onClick:a},[_(Pt,{class:"icon lang"}),j(" "+T(i(t).label)+" ",1),_(Lt,{class:"icon chevron"})]),u("ul",Mi,[(s(!0),l(A,null,G(i(e),d=>(s(),l("li",{key:d.link,class:"item"},[_(K,{class:"link",href:d.link},{default:p(()=>[j(T(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ei=g(Ii,[["__scopeId","data-v-e924fe42"]]),Ni={class:"container"},Hi=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=E(null),t=ht(le?document.body:null);return(o,a)=>(s(),y(ze,{name:"fade",onEnter:a[0]||(a[0]=r=>t.value=!0),onAfterLeave:a[1]||(a[1]=r=>t.value=!1)},{default:p(()=>[o.open?(s(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[u("div",Ni,[v(o.$slots,"nav-screen-content-before",{},void 0,!0),_(Ci,{class:"menu"}),_(Ei,{class:"translations"}),_(li,{class:"appearance"}),_(Ti,{class:"social-links"}),v(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Ai=g(Hi,[["__scopeId","data-v-b4543032"]]),Bi={key:0,class:"VPNav"},Oi=b({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=Wa(),{frontmatter:a}=z(),r=L(()=>a.value.navbar!==!1);return ft("close-screen",t),Ce(()=>{le&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(c,d)=>r.value?(s(),l("header",Bi,[_(ai,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Ai,{open:i(e)},{"nav-screen-content-before":p(()=>[v(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Di=g(Oi,[["__scopeId","data-v-ca0a69ce"]]),Fi=n=>(Z("data-v-eb64199c"),n=n(),X(),n),xi=["role","tabindex"],ji=Fi(()=>u("div",{class:"indicator"},null,-1)),Ui={key:1,class:"items"},Gi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:c,hasChildren:d,toggle:m}=yn(L(()=>e.item)),k=L(()=>d.value?"section":"div"),$=L(()=>a.value?"a":"div"),w=L(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),S=L(()=>a.value?void 0:"button"),B=L(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":c.value}]);function V(N){"key"in N&&N.key!=="Enter"||!e.item.link&&m()}function I(){e.item.link&&m()}return(N,ue)=>{const J=ce("VPSidebarItem",!0);return s(),y(re(k.value),{class:H(["VPSidebarItem",B.value])},{default:p(()=>[N.item.text?(s(),l("div",we({key:0,class:"item",role:S.value},Zt(N.item.items?{click:V,keydown:V}:{},!0),{tabindex:N.item.items&&0}),[ji,N.item.link?(s(),y(K,{key:0,tag:$.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:p(()=>[(s(),y(re(w.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),y(re(w.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null?(s(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:Xt(I,["enter"]),tabindex:"0"},[_($t,{class:"caret-icon"})],32)):f("",!0)],16,xi)):f("",!0),N.item.items&&N.item.items.length?(s(),l("div",Ui,[N.depth<5?(s(!0),l(A,{key:0},G(N.item.items,F=>(s(),y(J,{key:F.text,item:F,depth:N.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Ri=g(Gi,[["__scopeId","data-v-eb64199c"]]),St=n=>(Z("data-v-7b6857b5"),n=n(),X(),n),qi=St(()=>u("div",{class:"curtain"},null,-1)),Ki={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Wi=St(()=>u("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Yi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=ne(),o=n,a=E(null),r=ht(le?document.body:null);return te([o,a],()=>{var c;o.open?(r.value=!0,(c=a.value)==null||c.focus()):r.value=!1},{immediate:!0,flush:"post"}),(c,d)=>i(t)?(s(),l("aside",{key:0,class:H(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:a,onClick:d[0]||(d[0]=Jt(()=>{},["stop"]))},[qi,u("nav",Ki,[Wi,v(c.$slots,"sidebar-nav-before",{},void 0,!0),(s(!0),l(A,null,G(i(e),m=>(s(),l("div",{key:m.text,class:"group"},[_(Ri,{item:m,depth:0},null,8,["item"])]))),128)),v(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),Zi=g(Yi,[["__scopeId","data-v-7b6857b5"]]),Xi=b({__name:"VPSkipLink",setup(n){const e=fe(),t=E();te(()=>e.path,()=>t.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const c=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",c)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",c),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(s(),l(A,null,[u("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),u("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ji=g(Xi,[["__scopeId","data-v-2cc3dcc2"]]),Qi=b({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o}=ne(),a=fe();te(()=>a.path,o),$n(e,o);const{frontmatter:r}=z(),c=Qt(),d=L(()=>!!c["home-hero-image"]);return ft("hero-image-slot-exists",d),(m,k)=>{const $=ce("Content");return i(r).layout!==!1?(s(),l("div",{key:0,class:H(["Layout",i(r).pageClass])},[v(m.$slots,"layout-top",{},void 0,!0),_(Ji),_(sn,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),_(Di,null,{"nav-bar-title-before":p(()=>[v(m.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(m.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(m.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(m.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[v(m.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(m.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(Ka,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),_(Zi,{open:i(e)},{"sidebar-nav-before":p(()=>[v(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[v(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ba,null,{"page-top":p(()=>[v(m.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(m.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[v(m.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[v(m.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(m.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(m.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(m.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(m.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(m.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[v(m.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(m.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(m.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[v(m.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(m.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[v(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(La),v(m.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),y($,{key:1}))}}}),el=g(Qi,[["__scopeId","data-v-6b5043bc"]]),tl={},nl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ol=u("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),al=[ol];function sl(n,e){return s(),l("svg",nl,al)}const rl=g(tl,[["render",sl]]),il={},ll={class:"VPTeamPage"};function cl(n,e){return s(),l("div",ll,[v(n.$slots,"default")])}const oc=g(il,[["render",cl],["__scopeId","data-v-0dac1e67"]]),ul={},dl={class:"VPTeamPageTitle"},ml={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return s(),l("div",dl,[n.$slots.title?(s(),l("h1",ml,[v(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(s(),l("p",vl,[v(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const ac=g(ul,[["render",pl],["__scopeId","data-v-867cfc0f"]]),hl={class:"profile"},fl={class:"avatar"},_l=["src","alt"],gl={class:"data"},bl={class:"name"},kl={key:0,class:"affiliation"},$l={key:0,class:"title"},yl={key:1,class:"at"},wl=["innerHTML"],Ll={key:2,class:"links"},Pl={key:0,class:"sp"},Vl=b({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(s(),l("article",{class:H(["VPTeamMembersItem",[e.size]])},[u("div",hl,[u("figure",fl,[u("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,_l)]),u("div",gl,[u("h1",bl,T(e.member.name),1),e.member.title||e.member.org?(s(),l("p",kl,[e.member.title?(s(),l("span",$l,T(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(s(),l("span",yl," @ ")):f("",!0),e.member.org?(s(),y(K,{key:2,class:H(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[j(T(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(s(),l("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,wl)):f("",!0),e.member.links?(s(),l("div",Ll,[_(Ee,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(s(),l("div",Pl,[_(K,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[_(rl,{class:"sp-icon"}),j(" "+T(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):f("",!0)],2))}}),Sl=g(Vl,[["__scopeId","data-v-c8b9bdef"]]),zl={class:"container"},Cl=b({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=L(()=>[e.size,`count-${e.members.length}`]);return(o,a)=>(s(),l("div",{class:H(["VPTeamMembers",t.value])},[u("div",zl,[(s(!0),l(A,null,G(o.members,r=>(s(),l("div",{key:r.name,class:"item"},[_(Sl,{size:o.size,member:r},null,8,["size","member"])]))),128))])],2))}}),sc=g(Cl,[["__scopeId","data-v-130c6a1d"]]),st={Layout:el,enhanceApp:({app:n})=>{n.component("Badge",nn)}},Tl=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],Ml=b({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(n){const e=E(!1);return Y(()=>{e.value=!0,pt(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,o)=>e.value?(s(),l("giscus-widget",{key:0,id:t.id,host:t.host,repo:t.repo,repoid:t.repoId,category:t.category,categoryid:t.categoryId,mapping:t.mapping,term:t.term,strict:t.strict,reactionsenabled:t.reactionsEnabled,emitmetadata:t.emitMetadata,inputposition:t.inputPosition,theme:t.theme,lang:t.lang,loading:t.loading},null,8,Tl)):f("",!0)}}),rt=(n,e,t=!0)=>{var k;const o={id:"comment",host:"https://giscus.app",category:"General",mapping:"pathname",term:"Welcome to giscus!",reactionsEnabled:"1",inputPosition:"top",lang:"zh-CN",loading:"lazy",repo:"xxx/xxx",repoId:"",homePageShowComment:!1};if(n.locales){const w=document.querySelector("html").getAttribute("lang");w&&n.locales[w]&&(n.lang=n.locales[w])}const a=n.lightTheme||"light",r=n.darkTheme||"transparent_dark";let c=document.getElementById("giscus");if(c&&c.parentNode.removeChild(c),(e==null?void 0:e.value.comment)!==void 0){if(!(e!=null&&e.value.comment))return}else if(!t)return;if(!n.homePageShowComment&&(!location.pathname||location.pathname==="/"))return;const d=((k=document.querySelector("html"))==null?void 0:k.className.indexOf("dark"))!==-1,m=document.getElementsByClassName("content-container")[0];if(m){const $=document.createElement("div");$.setAttribute("id","giscus"),$.style.height="auto",$.style.marginTop="40px",$.style.borderTop="1px solid var(--vp-c-divider)",$.style.paddingTop="20px",m.append($),en({render:()=>Ve(Ml,{...o,theme:d?r:a,...n})}).mount("#giscus")}},Il=n=>{const e=document.querySelector("html"),t=n.lightTheme||"light",o=n.darkTheme||"transparent_dark";new MutationObserver(r=>{r.forEach(c=>{if(c.type=="attributes"){let d=document.getElementById("comment");d==null||d.setAttribute("theme",e.className.indexOf("dark")!==-1?o:t)}})}).observe(e,{attributeFilter:["class"]})},El=(n,e,t=!0)=>{Y(()=>{rt(n,e.frontmatter,t),Il(n)}),te(()=>e.route.path,()=>We(()=>{rt(n,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var se=Object.assign||function(n){for(var e=1;ei.map(i=>d[i]); +import{d as b,o as s,c as l,r as v,n as H,a as j,t as T,b as y,w as p,e as f,T as ze,_ as g,u as Re,i as jt,f as Ut,g as qe,h as E,j as le,k as L,l as Y,m as u,p as i,q as Z,s as X,v as ie,x as Fe,y as te,z as Ce,A as Ke,B as ut,C as Gt,D as ce,F as A,E as G,G as dt,H as Te,I as _,J as re,K as mt,L as fe,M as we,N as Me,O as Rt,P as xe,Q as qt,R as We,S as vt,U as Kt,V as Wt,W as Yt,X as pt,Y as ht,Z as ft,$ as Zt,a0 as Xt,a1 as Jt,a2 as Qt,a3 as en,a4 as Ve,a5 as tn}from"./framework.DPHCW6-_.js";const nn=b({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(s(),l("span",{class:H(["VPBadge",e.type])},[v(e.$slots,"default",{},()=>[j(T(e.text),1)])],2))}}),on={key:0,class:"VPBackdrop"},an=b({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(s(),y(ze,{name:"fade"},{default:p(()=>[e.show?(s(),l("div",on)):f("",!0)]),_:1}))}}),sn=g(an,[["__scopeId","data-v-7400d5fd"]]),z=Re;function rn(n,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(n,e):(n(),(o=!0)&&setTimeout(()=>o=!1,e))}}function je(n){return/^\//.test(n)?n:`/${n}`}function Ye(n){const{pathname:e,search:t,hash:o,protocol:a}=new URL(n,"http://a.com");if(jt(n)||n.startsWith("#")||!a.startsWith("http")||!Ut(e))return n;const{site:r}=z(),c=e.endsWith("/")||e.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,r.value.cleanUrls?"":".html")}${t}${o}`);return qe(c)}const Ze=E(le?location.hash:"");le&&window.addEventListener("hashchange",()=>{Ze.value=location.hash});function _e({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:o,page:a,theme:r}=z(),c=L(()=>{var m,k;return{label:(m=t.value.locales[o.value])==null?void 0:m.label,link:((k=t.value.locales[o.value])==null?void 0:k.link)||(o.value==="root"?"/":`/${o.value}/`)}});return{localeLinks:L(()=>Object.entries(t.value.locales).flatMap(([m,k])=>n&&c.value.label===k.label?[]:{text:k.label,link:ln(k.link||(m==="root"?"/":`/${m}/`),r.value.i18nRouting!==!1&&e,a.value.relativePath.slice(c.value.link.length-1),!t.value.cleanUrls)+Ze.value})),currentLang:c}}function ln(n,e,t,o){return e?n.replace(/\/$/,"")+je(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):n}const cn=n=>(Z("data-v-922e1a30"),n=n(),X(),n),un={class:"NotFound"},dn={class:"code"},mn={class:"title"},vn=cn(()=>u("div",{class:"divider"},null,-1)),pn={class:"quote"},hn={class:"action"},fn=["href","aria-label"],_n=b({__name:"NotFound",setup(n){const{site:e,theme:t}=z(),{localeLinks:o}=_e({removeCurrent:!1}),a=E("/");return Y(()=>{var c;const r=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");o.value.length&&(a.value=((c=o.value.find(({link:d})=>d.startsWith(r)))==null?void 0:c.link)||o.value[0].link)}),(r,c)=>{var d,m,k,$,w;return s(),l("div",un,[u("p",dn,T(((d=i(t).notFound)==null?void 0:d.code)??"404"),1),u("h1",mn,T(((m=i(t).notFound)==null?void 0:m.title)??"PAGE NOT FOUND"),1),vn,u("blockquote",pn,T(((k=i(t).notFound)==null?void 0:k.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),u("div",hn,[u("a",{class:"link",href:i(qe)(a.value),"aria-label":(($=i(t).notFound)==null?void 0:$.linkLabel)??"go to home"},T(((w=i(t).notFound)==null?void 0:w.linkText)??"Take me home"),9,fn)])])}}}),gn=g(_n,[["__scopeId","data-v-922e1a30"]]);function _t(n,e){if(Array.isArray(n))return Le(n);if(n==null)return[];e=je(e);const t=Object.keys(n).sort((a,r)=>r.split("/").length-a.split("/").length).find(a=>e.startsWith(je(a))),o=t?n[t]:[];return Array.isArray(o)?Le(o):Le(o.items,o.base)}function bn(n){const e=[];let t=0;for(const o in n){const a=n[o];if(a.items){t=e.push(a);continue}e[t]||e.push({items:[]}),e[t].items.push(a)}return e}function kn(n){const e=[];function t(o){for(const a of o)a.text&&a.link&&e.push({text:a.text,link:a.link,docFooterText:a.docFooterText}),a.items&&t(a.items)}return t(n),e}function Ue(n,e){return Array.isArray(e)?e.some(t=>Ue(n,t)):ie(n,e.link)?!0:e.items?Ue(n,e.items):!1}function Le(n,e){return[...n].map(t=>{const o={...t},a=o.base||e;return a&&o.link&&(o.link=a+o.link),o.items&&(o.items=Le(o.items,a)),o})}function ne(){const{frontmatter:n,page:e,theme:t}=z(),o=Fe("(min-width: 960px)"),a=E(!1),r=L(()=>{const I=t.value.sidebar,N=e.value.relativePath;return I?_t(I,N):[]}),c=E(r.value);te(r,(I,N)=>{JSON.stringify(I)!==JSON.stringify(N)&&(c.value=r.value)});const d=L(()=>n.value.sidebar!==!1&&c.value.length>0&&n.value.layout!=="home"),m=L(()=>k?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),k=L(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),$=L(()=>d.value&&o.value),w=L(()=>d.value?bn(c.value):[]);function S(){a.value=!0}function B(){a.value=!1}function V(){a.value?B():S()}return{isOpen:a,sidebar:c,sidebarGroups:w,hasSidebar:d,hasAside:k,leftAside:m,isSidebarEnabled:$,open:S,close:B,toggle:V}}function $n(n,e){let t;Ce(()=>{t=n.value?document.activeElement:void 0}),Y(()=>{window.addEventListener("keyup",o)}),Ke(()=>{window.removeEventListener("keyup",o)});function o(a){a.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}function yn(n){const{page:e}=z(),t=E(!1),o=L(()=>n.value.collapsed!=null),a=L(()=>!!n.value.link),r=E(!1),c=()=>{r.value=ie(e.value.relativePath,n.value.link)};te([e,n,Ze],c),Y(c);const d=L(()=>r.value?!0:n.value.items?Ue(e.value.relativePath,n.value.items):!1),m=L(()=>!!(n.value.items&&n.value.items.length));Ce(()=>{t.value=!!(o.value&&n.value.collapsed)}),ut(()=>{(r.value||d.value)&&(t.value=!1)});function k(){o.value&&(t.value=!t.value)}return{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:d,hasChildren:m,toggle:k}}function wn(){const{hasSidebar:n}=ne(),e=Fe("(min-width: 960px)"),t=Fe("(min-width: 1280px)");return{isAsideEnabled:L(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const Ge=[];function gt(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function Xe(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:Ln(t),link:"#"+t.id,level:o}});return Pn(e,n)}function Ln(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function Pn(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,a]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(c=>c.level>=o&&c.level<=a),Ge.length=0;for(const{element:c,link:d}of n)Ge.push({element:c,link:d});const r=[];e:for(let c=0;c=0;m--){const k=n[m];if(k.level{requestAnimationFrame(r),window.addEventListener("scroll",o)}),Gt(()=>{c(location.hash)}),Ke(()=>{window.removeEventListener("scroll",o)});function r(){if(!t.value)return;const d=(()=>{var I;const V=(I=document.querySelector("#VPContent .VPDoc"))==null?void 0:I.firstElementChild;return V?ot(V):78})(),m=window.scrollY,k=window.innerHeight,$=document.body.offsetHeight,w=Math.abs(m+k-$)<1,S=Ge.map(({element:V,link:I})=>({link:I,top:ot(V)})).filter(({top:V})=>!Number.isNaN(V)).sort((V,I)=>V.top-I.top);if(!S.length){c(null);return}if(m<1){c(null);return}if(w){c(S[S.length-1].link);return}let B=null;for(const{link:V,top:I}of S){if(I>m+d)break;B=V}c(B)}function c(d){a&&a.classList.remove("active"),d==null?a=null:a=n.value.querySelector(`a[href="${decodeURIComponent(d)}"]`);const m=a;m?(m.classList.add("active"),e.value.style.top=m.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ot(n){let e=0;for(;n!==document.body;){if(n===null)return NaN;e+=n.offsetTop,n=n.offsetParent}return e}const Sn=["href","title"],zn=b({__name:"VPDocOutlineItem",props:{headers:{},root:{type:Boolean}},setup(n){function e({target:t}){const o=t.href.split("#")[1],a=document.getElementById(decodeURIComponent(o));a==null||a.focus({preventScroll:!0})}return(t,o)=>{const a=ce("VPDocOutlineItem",!0);return s(),l("ul",{class:H(["VPDocOutlineItem",t.root?"root":"nested"])},[(s(!0),l(A,null,G(t.headers,({children:r,link:c,title:d})=>(s(),l("li",null,[u("a",{class:"outline-link",href:c,onClick:e,title:d},T(d),9,Sn),r!=null&&r.length?(s(),y(a,{key:0,headers:r},null,8,["headers"])):f("",!0)]))),256))],2)}}}),bt=g(zn,[["__scopeId","data-v-cf5865db"]]),Cn=n=>(Z("data-v-e2c17725"),n=n(),X(),n),Tn={class:"content"},Mn={class:"outline-title",role:"heading","aria-level":"2"},In={"aria-labelledby":"doc-outline-aria-label"},En=Cn(()=>u("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),Nn=b({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=z(),o=dt([]);Te(()=>{o.value=Xe(e.value.outline??t.value.outline)});const a=E(),r=E();return Vn(a,r),(c,d)=>(s(),l("div",{class:H(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:a,role:"navigation"},[u("div",Tn,[u("div",{class:"outline-marker",ref_key:"marker",ref:r},null,512),u("div",Mn,T(i(gt)(i(t))),1),u("nav",In,[En,_(bt,{headers:o.value,root:!0},null,8,["headers"])])])],2))}}),Hn=g(Nn,[["__scopeId","data-v-e2c17725"]]),An={class:"VPDocAsideCarbonAds"},Bn=b({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,o)=>(s(),l("div",An,[_(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),On=n=>(Z("data-v-8b9c5d2d"),n=n(),X(),n),Dn={class:"VPDocAside"},Fn=On(()=>u("div",{class:"spacer"},null,-1)),xn=b({__name:"VPDocAside",setup(n){const{theme:e}=z();return(t,o)=>(s(),l("div",Dn,[v(t.$slots,"aside-top",{},void 0,!0),v(t.$slots,"aside-outline-before",{},void 0,!0),_(Hn),v(t.$slots,"aside-outline-after",{},void 0,!0),Fn,v(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(s(),y(Bn,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),v(t.$slots,"aside-ads-after",{},void 0,!0),v(t.$slots,"aside-bottom",{},void 0,!0)]))}}),jn=g(xn,[["__scopeId","data-v-8b9c5d2d"]]);function Un(){const{theme:n,page:e}=z();return L(()=>{const{text:t="Edit this page",pattern:o=""}=n.value.editLink||{};let a;return typeof o=="function"?a=o(e.value):a=o.replace(/:path/g,e.value.filePath),{url:a,text:t}})}function Gn(){const{page:n,theme:e,frontmatter:t}=z();return L(()=>{var m,k,$,w,S,B,V,I;const o=_t(e.value.sidebar,n.value.relativePath),a=kn(o),r=a.findIndex(N=>ie(n.value.relativePath,N.link)),c=((m=e.value.docFooter)==null?void 0:m.prev)===!1&&!t.value.prev||t.value.prev===!1,d=((k=e.value.docFooter)==null?void 0:k.next)===!1&&!t.value.next||t.value.next===!1;return{prev:c?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??(($=a[r-1])==null?void 0:$.docFooterText)??((w=a[r-1])==null?void 0:w.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((S=a[r-1])==null?void 0:S.link)},next:d?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((B=a[r+1])==null?void 0:B.docFooterText)??((V=a[r+1])==null?void 0:V.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((I=a[r+1])==null?void 0:I.link)}}})}const Rn={},qn={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},Kn=u("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),Wn=u("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1),Yn=[Kn,Wn];function Zn(n,e){return s(),l("svg",qn,Yn)}const Xn=g(Rn,[["render",Zn]]),K=b({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=L(()=>e.tag??(e.href?"a":"span")),o=L(()=>e.href&&mt.test(e.href));return(a,r)=>(s(),y(re(t.value),{class:H(["VPLink",{link:a.href,"vp-external-link-icon":o.value,"no-icon":a.noIcon}]),href:a.href?i(Ye)(a.href):void 0,target:a.target??(o.value?"_blank":void 0),rel:a.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[v(a.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),Jn={class:"VPLastUpdated"},Qn=["datetime"],eo=b({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:o,lang:a}=z(),r=L(()=>new Date(o.value.lastUpdated??t.value.lastUpdated)),c=L(()=>r.value.toISOString()),d=E("");return Y(()=>{Ce(()=>{var m,k,$;d.value=new Intl.DateTimeFormat((k=(m=e.value.lastUpdated)==null?void 0:m.formatOptions)!=null&&k.forceLocale?a.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(r.value)})}),(m,k)=>{var $;return s(),l("p",Jn,[j(T((($=i(e).lastUpdated)==null?void 0:$.text)||i(e).lastUpdatedText||"Last updated")+": ",1),u("time",{datetime:c.value},T(d.value),9,Qn)])}}}),to=g(eo,[["__scopeId","data-v-42f5af39"]]),no={key:0,class:"VPDocFooter"},oo={key:0,class:"edit-info"},ao={key:0,class:"edit-link"},so={key:1,class:"last-updated"},ro={key:1,class:"prev-next"},io={class:"pager"},lo=["innerHTML"],co=["innerHTML"],uo={class:"pager"},mo=["innerHTML"],vo=["innerHTML"],po=b({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:o}=z(),a=Un(),r=Gn(),c=L(()=>e.value.editLink&&o.value.editLink!==!1),d=L(()=>t.value.lastUpdated&&o.value.lastUpdated!==!1),m=L(()=>c.value||d.value||r.value.prev||r.value.next);return(k,$)=>{var w,S,B,V;return m.value?(s(),l("footer",no,[v(k.$slots,"doc-footer-before",{},void 0,!0),c.value||d.value?(s(),l("div",oo,[c.value?(s(),l("div",ao,[_(K,{class:"edit-link-button",href:i(a).url,"no-icon":!0},{default:p(()=>[_(Xn,{class:"edit-link-icon","aria-label":"edit icon"}),j(" "+T(i(a).text),1)]),_:1},8,["href"])])):f("",!0),d.value?(s(),l("div",so,[_(to)])):f("",!0)])):f("",!0),(w=i(r).prev)!=null&&w.link||(S=i(r).next)!=null&&S.link?(s(),l("nav",ro,[u("div",io,[(B=i(r).prev)!=null&&B.link?(s(),y(K,{key:0,class:"pager-link prev",href:i(r).prev.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.prev)||"Previous page"},null,8,lo),u("span",{class:"title",innerHTML:i(r).prev.text},null,8,co)]}),_:1},8,["href"])):f("",!0)]),u("div",uo,[(V=i(r).next)!=null&&V.link?(s(),y(K,{key:0,class:"pager-link next",href:i(r).next.link},{default:p(()=>{var I;return[u("span",{class:"desc",innerHTML:((I=i(e).docFooter)==null?void 0:I.next)||"Next page"},null,8,mo),u("span",{class:"title",innerHTML:i(r).next.text},null,8,vo)]}),_:1},8,["href"])):f("",!0)])])):f("",!0)])):f("",!0)}}}),ho=g(po,[["__scopeId","data-v-c6c7078a"]]),fo=n=>(Z("data-v-c1252fdc"),n=n(),X(),n),_o={class:"container"},go=fo(()=>u("div",{class:"aside-curtain"},null,-1)),bo={class:"aside-container"},ko={class:"aside-content"},$o={class:"content"},yo={class:"content-container"},wo={class:"main"},Lo=b({__name:"VPDoc",setup(n){const{theme:e}=z(),t=fe(),{hasSidebar:o,hasAside:a,leftAside:r}=ne(),c=L(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(d,m)=>{const k=ce("Content");return s(),l("div",{class:H(["VPDoc",{"has-sidebar":i(o),"has-aside":i(a)}])},[v(d.$slots,"doc-top",{},void 0,!0),u("div",_o,[i(a)?(s(),l("div",{key:0,class:H(["aside",{"left-aside":i(r)}])},[go,u("div",bo,[u("div",ko,[_(jn,null,{"aside-top":p(()=>[v(d.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(d.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(d.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(d.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(d.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(d.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),u("div",$o,[u("div",yo,[v(d.$slots,"doc-before",{},void 0,!0),u("main",wo,[_(k,{class:H(["vp-doc",[c.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(ho,null,{"doc-footer-before":p(()=>[v(d.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),v(d.$slots,"doc-after",{},void 0,!0)])])]),v(d.$slots,"doc-bottom",{},void 0,!0)],2)}}}),Po=g(Lo,[["__scopeId","data-v-c1252fdc"]]),Vo=b({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=L(()=>e.href&&mt.test(e.href)),o=L(()=>e.tag||e.href?"a":"button");return(a,r)=>(s(),y(re(o.value),{class:H(["VPButton",[a.size,a.theme]]),href:a.href?i(Ye)(a.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[j(T(a.text),1)]),_:1},8,["class","href","target","rel"]))}}),So=g(Vo,[["__scopeId","data-v-5a0572b2"]]),zo=["src","alt"],Co=b({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const o=ce("VPImage",!0);return e.image?(s(),l(A,{key:0},[typeof e.image=="string"||"src"in e.image?(s(),l("img",we({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(qe)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,zo)):(s(),l(A,{key:1},[_(o,we({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,we({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}}),Se=g(Co,[["__scopeId","data-v-52554789"]]),To=n=>(Z("data-v-27e36ebe"),n=n(),X(),n),Mo={class:"container"},Io={class:"main"},Eo={key:0,class:"name"},No=["innerHTML"],Ho=["innerHTML"],Ao=["innerHTML"],Bo={key:0,class:"actions"},Oo={key:0,class:"image"},Do={class:"image-container"},Fo=To(()=>u("div",{class:"image-bg"},null,-1)),xo=b({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=Me("hero-image-slot-exists");return(t,o)=>(s(),l("div",{class:H(["VPHero",{"has-image":t.image||i(e)}])},[u("div",Mo,[u("div",Io,[v(t.$slots,"home-hero-info",{},()=>[t.name?(s(),l("h1",Eo,[u("span",{innerHTML:t.name,class:"clip"},null,8,No)])):f("",!0),t.text?(s(),l("p",{key:1,innerHTML:t.text,class:"text"},null,8,Ho)):f("",!0),t.tagline?(s(),l("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ao)):f("",!0)],!0),t.actions?(s(),l("div",Bo,[(s(!0),l(A,null,G(t.actions,a=>(s(),l("div",{key:a.link,class:"action"},[_(So,{tag:"a",size:"medium",theme:a.theme,text:a.text,href:a.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(s(),l("div",Oo,[u("div",Do,[Fo,v(t.$slots,"home-hero-image",{},()=>[t.image?(s(),y(Se,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}}),jo=g(xo,[["__scopeId","data-v-27e36ebe"]]),Uo=b({__name:"VPHomeHero",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).hero?(s(),y(jo,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[v(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[v(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Go={},Ro={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},qo=u("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1),Ko=[qo];function Wo(n,e){return s(),l("svg",Ro,Ko)}const Yo=g(Go,[["render",Wo]]),Zo={class:"box"},Xo={key:0,class:"icon"},Jo=["innerHTML"],Qo=["innerHTML"],ea=["innerHTML"],ta={key:4,class:"link-text"},na={class:"link-text-value"},oa=b({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(s(),y(K,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[u("article",Zo,[typeof e.icon=="object"&&e.icon.wrap?(s(),l("div",Xo,[_(Se,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(s(),y(Se,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(s(),l("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Jo)):f("",!0),u("h2",{class:"title",innerHTML:e.title},null,8,Qo),e.details?(s(),l("p",{key:3,class:"details",innerHTML:e.details},null,8,ea)):f("",!0),e.linkText?(s(),l("div",ta,[u("p",na,[j(T(e.linkText)+" ",1),_(Yo,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),aa=g(oa,[["__scopeId","data-v-790a0f07"]]),sa={key:0,class:"VPFeatures"},ra={class:"container"},ia={class:"items"},la=b({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=L(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,a)=>o.features?(s(),l("div",sa,[u("div",ra,[u("div",ia,[(s(!0),l(A,null,G(o.features,r=>(s(),l("div",{key:r.title,class:H(["item",[t.value]])},[_(aa,{icon:r.icon,title:r.title,details:r.details,link:r.link,"link-text":r.linkText,rel:r.rel,target:r.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}}),ca=g(la,[["__scopeId","data-v-8c75346a"]]),ua=b({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=z();return(t,o)=>i(e).features?(s(),y(ca,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),da={class:"VPHome"},ma=b({__name:"VPHome",setup(n){return(e,t)=>{const o=ce("Content");return s(),l("div",da,[v(e.$slots,"home-hero-before",{},void 0,!0),_(Uo,null,{"home-hero-info":p(()=>[v(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),v(e.$slots,"home-hero-after",{},void 0,!0),v(e.$slots,"home-features-before",{},void 0,!0),_(ua),v(e.$slots,"home-features-after",{},void 0,!0),_(o)])}}}),va=g(ma,[["__scopeId","data-v-f308d76d"]]),pa={},ha={class:"VPPage"};function fa(n,e){const t=ce("Content");return s(),l("div",ha,[v(n.$slots,"page-top"),_(t),v(n.$slots,"page-bottom")])}const _a=g(pa,[["render",fa]]),ga=b({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>(s(),l("div",{class:H(["VPContent",{"has-sidebar":i(o),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?v(a.$slots,"not-found",{key:0},()=>[_(gn)],!0):i(t).layout==="page"?(s(),y(_a,{key:1},{"page-top":p(()=>[v(a.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(a.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(s(),y(va,{key:2},{"home-hero-before":p(()=>[v(a.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(a.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(a.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(a.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(a.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(a.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(s(),y(re(i(t).layout),{key:3})):(s(),y(Po,{key:4},{"doc-top":p(()=>[v(a.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(a.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[v(a.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(a.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(a.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[v(a.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[v(a.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(a.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(a.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(a.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[v(a.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),ba=g(ga,[["__scopeId","data-v-d9b0d414"]]),ka={class:"container"},$a=["innerHTML"],ya=["innerHTML"],wa=b({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne();return(a,r)=>i(e).footer&&i(t).footer!==!1?(s(),l("footer",{key:0,class:H(["VPFooter",{"has-sidebar":i(o)}])},[u("div",ka,[i(e).footer.message?(s(),l("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,$a)):f("",!0),i(e).footer.copyright?(s(),l("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,ya)):f("",!0)])],2)):f("",!0)}}),La=g(wa,[["__scopeId","data-v-83c9c484"]]);function kt(){const{theme:n,frontmatter:e}=z(),t=dt([]),o=L(()=>t.value.length>0);return Te(()=>{t.value=Xe(e.value.outline??n.value.outline)}),{headers:t,hasLocalNav:o}}const Pa={},Va={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Sa=u("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1),za=[Sa];function Ca(n,e){return s(),l("svg",Va,za)}const $t=g(Pa,[["render",Ca]]),Ta={class:"header"},Ma={class:"outline"},Ia=b({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=z(),o=E(!1),a=E(0),r=E(),c=E();Rt(r,()=>{o.value=!1}),xe("Escape",()=>{o.value=!1}),Te(()=>{o.value=!1});function d(){o.value=!o.value,a.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function m($){$.target.classList.contains("outline-link")&&(c.value&&(c.value.style.transition="none"),We(()=>{o.value=!1}))}function k(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return($,w)=>(s(),l("div",{class:"VPLocalNavOutlineDropdown",style:qt({"--vp-vh":a.value+"px"}),ref_key:"main",ref:r},[$.headers.length>0?(s(),l("button",{key:0,onClick:d,class:H({open:o.value})},[j(T(i(gt)(i(t)))+" ",1),_($t,{class:"icon"})],2)):(s(),l("button",{key:1,onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)),_(ze,{name:"flyout"},{default:p(()=>[o.value?(s(),l("div",{key:0,ref_key:"items",ref:c,class:"items",onClick:m},[u("div",Ta,[u("a",{class:"top-link",href:"#",onClick:k},T(i(t).returnToTopLabel||"Return to top"),1)]),u("div",Ma,[_(bt,{headers:$.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}}),Ea=g(Ia,[["__scopeId","data-v-2d2d5d54"]]),Na={},Ha={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Aa=u("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),Ba=u("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),Oa=u("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),Da=u("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1),Fa=[Aa,Ba,Oa,Da];function xa(n,e){return s(),l("svg",Ha,Fa)}const ja=g(Na,[["render",xa]]),Ua={class:"container"},Ga=["aria-expanded"],Ra={class:"menu-text"},qa=b({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=z(),{hasSidebar:o}=ne(),{headers:a}=kt(),{y:r}=vt(),c=E(0);Y(()=>{c.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Te(()=>{a.value=Xe(t.value.outline??e.value.outline)});const d=L(()=>a.value.length===0),m=L(()=>d.value&&!o.value),k=L(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:d.value,fixed:m.value}));return($,w)=>i(t).layout!=="home"&&(!m.value||i(r)>=c.value)?(s(),l("div",{key:0,class:H(k.value)},[u("div",Ua,[i(o)?(s(),l("button",{key:0,class:"menu","aria-expanded":$.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>$.$emit("open-menu"))},[_(ja,{class:"menu-icon"}),u("span",Ra,T(i(e).sidebarMenuLabel||"Menu"),1)],8,Ga)):f("",!0),_(Ea,{headers:i(a),navHeight:c.value},null,8,["headers","navHeight"])])],2)):f("",!0)}}),Ka=g(qa,[["__scopeId","data-v-2158a76a"]]);function Wa(){const n=E(!1);function e(){n.value=!0,window.addEventListener("resize",a)}function t(){n.value=!1,window.removeEventListener("resize",a)}function o(){n.value?t():e()}function a(){window.outerWidth>=768&&t()}const r=fe();return te(()=>r.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:o}}const Ya={},Za={class:"VPSwitch",type:"button",role:"switch"},Xa={class:"check"},Ja={key:0,class:"icon"};function Qa(n,e){return s(),l("button",Za,[u("span",Xa,[n.$slots.default?(s(),l("span",Ja,[v(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const es=g(Ya,[["render",Qa],["__scopeId","data-v-79d0ed95"]]),ts={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},os=u("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1),as=[os];function ss(n,e){return s(),l("svg",ns,as)}const rs=g(ts,[["render",ss]]),is={},ls={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},cs=Kt('',9),us=[cs];function ds(n,e){return s(),l("svg",ls,us)}const ms=g(is,[["render",ds]]),vs=b({__name:"VPSwitchAppearance",setup(n){const{isDark:e,theme:t}=z(),o=Me("toggle-appearance",()=>{e.value=!e.value}),a=L(()=>e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme");return(r,c)=>(s(),y(es,{title:a.value,class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(o)},{default:p(()=>[_(ms,{class:"sun"}),_(rs,{class:"moon"})]),_:1},8,["title","aria-checked","onClick"]))}}),Je=g(vs,[["__scopeId","data-v-0298adb0"]]),ps={key:0,class:"VPNavBarAppearance"},hs=b({__name:"VPNavBarAppearance",setup(n){const{site:e}=z();return(t,o)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",ps,[_(Je)])):f("",!0)}}),fs=g(hs,[["__scopeId","data-v-0e934124"]]),Qe=E();let yt=!1,Oe=0;function _s(n){const e=E(!1);if(le){!yt&&gs(),Oe++;const t=te(Qe,o=>{var a,r,c;o===n.el.value||(a=n.el.value)!=null&&a.contains(o)?(e.value=!0,(r=n.onFocus)==null||r.call(n)):(e.value=!1,(c=n.onBlur)==null||c.call(n))});Ke(()=>{t(),Oe--,Oe||bs()})}return Wt(e)}function gs(){document.addEventListener("focusin",wt),yt=!0,Qe.value=document.activeElement}function bs(){document.removeEventListener("focusin",wt)}function wt(){Qe.value=document.activeElement}const ks={},$s={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},ys=u("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1),ws=[ys];function Ls(n,e){return s(),l("svg",$s,ws)}const Lt=g(ks,[["render",Ls]]),Ps={},Vs={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},Ss=u("circle",{cx:"12",cy:"12",r:"2"},null,-1),zs=u("circle",{cx:"19",cy:"12",r:"2"},null,-1),Cs=u("circle",{cx:"5",cy:"12",r:"2"},null,-1),Ts=[Ss,zs,Cs];function Ms(n,e){return s(),l("svg",Vs,Ts)}const Is=g(Ps,[["render",Ms]]),Es={class:"VPMenuLink"},Ns=b({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),l("div",Es,[_(K,{class:H({active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}}),Ie=g(Ns,[["__scopeId","data-v-9d1535a1"]]),Hs={class:"VPMenuGroup"},As={key:0,class:"title"},Bs=b({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",Hs,[e.text?(s(),l("p",As,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),l(A,null,["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):f("",!0)],64))),256))]))}}),Os=g(Bs,[["__scopeId","data-v-c1904112"]]),Ds={class:"VPMenu"},Fs={key:0,class:"items"},xs=b({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(s(),l("div",Ds,[e.items?(s(),l("div",Fs,[(s(!0),l(A,null,G(e.items,o=>(s(),l(A,{key:o.text},["link"in o?(s(),y(Ie,{key:0,item:o},null,8,["item"])):(s(),y(Os,{key:1,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0),v(e.$slots,"default",{},void 0,!0)]))}}),js=g(xs,[["__scopeId","data-v-e699aa0c"]]),Us=["aria-expanded","aria-label"],Gs={key:0,class:"text"},Rs=["innerHTML"],qs={class:"menu"},Ks=b({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=E(!1),t=E();_s({el:t,onBlur:o});function o(){e.value=!1}return(a,r)=>(s(),l("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:r[1]||(r[1]=c=>e.value=!0),onMouseleave:r[2]||(r[2]=c=>e.value=!1)},[u("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":a.label,onClick:r[0]||(r[0]=c=>e.value=!e.value)},[a.button||a.icon?(s(),l("span",Gs,[a.icon?(s(),y(re(a.icon),{key:0,class:"option-icon"})):f("",!0),a.button?(s(),l("span",{key:1,innerHTML:a.button},null,8,Rs)):f("",!0),_(Lt,{class:"text-icon"})])):(s(),y(Is,{key:1,class:"icon"}))],8,Us),u("div",qs,[_(js,{items:a.items},{default:p(()=>[v(a.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),et=g(Ks,[["__scopeId","data-v-eaf183b7"]]),Ws={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},Ys=["href","aria-label","innerHTML"],Zs=b({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=L(()=>typeof e.icon=="object"?e.icon.svg:Ws[e.icon]);return(o,a)=>(s(),l("a",{class:"VPSocialLink no-icon",href:o.link,"aria-label":o.ariaLabel??(typeof o.icon=="string"?o.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,Ys))}}),Xs=g(Zs,[["__scopeId","data-v-f4d58015"]]),Js={class:"VPSocialLinks"},Qs=b({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(s(),l("div",Js,[(s(!0),l(A,null,G(e.links,({link:o,icon:a,ariaLabel:r})=>(s(),y(Xs,{key:o,icon:a,link:o,ariaLabel:r},null,8,["icon","link","ariaLabel"]))),128))]))}}),Ee=g(Qs,[["__scopeId","data-v-20ea2c3a"]]),er={key:0,class:"group translations"},tr={class:"trans-title"},nr={key:1,class:"group"},or={class:"item appearance"},ar={class:"label"},sr={class:"appearance-action"},rr={key:2,class:"group"},ir={class:"item social-links"},lr=b({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=z(),{localeLinks:o,currentLang:a}=_e({correspondingLink:!0}),r=L(()=>o.value.length&&a.value.label||e.value.appearance||t.value.socialLinks);return(c,d)=>r.value?(s(),y(et,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(o).length&&i(a).label?(s(),l("div",er,[u("p",tr,T(i(a).label),1),(s(!0),l(A,null,G(i(o),m=>(s(),y(Ie,{key:m.link,item:m},null,8,["item"]))),128))])):f("",!0),i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",nr,[u("div",or,[u("p",ar,T(i(t).darkModeSwitchLabel||"Appearance"),1),u("div",sr,[_(Je)])])])):f("",!0),i(t).socialLinks?(s(),l("div",rr,[u("div",ir,[_(Ee,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}}),cr=g(lr,[["__scopeId","data-v-a4952b56"]]),ur=n=>(Z("data-v-5df5a4ba"),n=n(),X(),n),dr=["aria-expanded"],mr=ur(()=>u("span",{class:"container"},[u("span",{class:"top"}),u("span",{class:"middle"}),u("span",{class:"bottom"})],-1)),vr=[mr],pr=b({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(s(),l("button",{type:"button",class:H(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},vr,10,dr))}}),hr=g(pr,[["__scopeId","data-v-5df5a4ba"]]),fr=["innerHTML"],_r=b({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=z();return(t,o)=>(s(),y(K,{class:H({VPNavBarMenuLink:!0,active:i(ie)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[u("span",{innerHTML:t.item.text},null,8,fr)]),_:1},8,["class","href","target","rel"]))}}),gr=g(_r,[["__scopeId","data-v-01a9a2a9"]]),br=b({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=z(),o=r=>"link"in r?ie(t.value.relativePath,r.link,!!e.item.activeMatch):r.items.some(o),a=L(()=>o(e.item));return(r,c)=>(s(),y(et,{class:H({VPNavBarMenuGroup:!0,active:i(ie)(i(t).relativePath,r.item.activeMatch,!!r.item.activeMatch)||a.value}),button:r.item.text,items:r.item.items},null,8,["class","button","items"]))}}),kr=n=>(Z("data-v-10e7ffc9"),n=n(),X(),n),$r={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},yr=kr(()=>u("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),wr=b({__name:"VPNavBarMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",$r,[yr,(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(gr,{key:0,item:a},null,8,["item"])):(s(),y(br,{key:1,item:a},null,8,["item"]))],64))),128))])):f("",!0)}}),Lr=g(wr,[["__scopeId","data-v-10e7ffc9"]]);function Pr(n){const{localeIndex:e,theme:t}=z();function o(a){var V,I,N;const r=a.split("."),c=(V=t.value.search)==null?void 0:V.options,d=c&&typeof c=="object",m=d&&((N=(I=c.locales)==null?void 0:I[e.value])==null?void 0:N.translations)||null,k=d&&c.translations||null;let $=m,w=k,S=n;const B=r.pop();for(const ue of r){let J=null;const F=S==null?void 0:S[ue];F&&(J=S=F);const oe=w==null?void 0:w[ue];oe&&(J=w=oe);const Q=$==null?void 0:$[ue];Q&&(J=$=Q),F||(S=J),oe||(w=J),Q||($=J)}return($==null?void 0:$[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return o}const Vr=["aria-label"],Sr={class:"DocSearch-Button-Container"},zr=u("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[u("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1),Cr={class:"DocSearch-Button-Placeholder"},Tr=u("span",{class:"DocSearch-Button-Keys"},[u("kbd",{class:"DocSearch-Button-Key"}),u("kbd",{class:"DocSearch-Button-Key"},"K")],-1),at=b({__name:"VPNavBarSearchButton",setup(n){const t=Pr({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,a)=>(s(),l("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":i(t)("button.buttonAriaLabel")},[u("span",Sr,[zr,u("span",Cr,T(i(t)("button.buttonText")),1)]),Tr],8,Vr))}}),Mr={class:"VPNavBarSearch"},Ir={id:"local-search"},Er={key:1,id:"docsearch"},Nr=b({__name:"VPNavBarSearch",setup(n){const e=Yt(()=>pt(()=>import("./VPLocalSearchBox.Re7xpDUq.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=z(),a=E(!1),r=E(!1);Y(()=>{});function c(){a.value||(a.value=!0,setTimeout(d,16))}function d(){const w=new Event("keydown");w.key="k",w.metaKey=!0,window.dispatchEvent(w),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||d()},16)}function m(w){const S=w.target,B=S.tagName;return S.isContentEditable||B==="INPUT"||B==="SELECT"||B==="TEXTAREA"}const k=E(!1);xe("k",w=>{(w.ctrlKey||w.metaKey)&&(w.preventDefault(),k.value=!0)}),xe("/",w=>{m(w)||(w.preventDefault(),k.value=!0)});const $="local";return(w,S)=>{var B;return s(),l("div",Mr,[i($)==="local"?(s(),l(A,{key:0},[k.value?(s(),y(i(e),{key:0,onClose:S[0]||(S[0]=V=>k.value=!1)})):f("",!0),u("div",Ir,[_(at,{onClick:S[1]||(S[1]=V=>k.value=!0)})])],64)):i($)==="algolia"?(s(),l(A,{key:1},[a.value?(s(),y(i(t),{key:0,algolia:((B=i(o).search)==null?void 0:B.options)??i(o).algolia,onVnodeBeforeMount:S[2]||(S[2]=V=>r.value=!0)},null,8,["algolia"])):f("",!0),r.value?f("",!0):(s(),l("div",Er,[_(at,{onClick:c})]))],64)):f("",!0)])}}}),Hr=b({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Ar=g(Hr,[["__scopeId","data-v-17479deb"]]),Br=["href","rel","target"],Or=b({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=z(),{hasSidebar:o}=ne(),{currentLang:a}=_e(),r=L(()=>{var m;return typeof t.value.logoLink=="string"?t.value.logoLink:(m=t.value.logoLink)==null?void 0:m.link}),c=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.rel}),d=L(()=>{var m;return typeof t.value.logoLink=="string"||(m=t.value.logoLink)==null?void 0:m.target});return(m,k)=>(s(),l("div",{class:H(["VPNavBarTitle",{"has-sidebar":i(o)}])},[u("a",{class:"title",href:r.value??i(Ye)(i(a).link),rel:c.value,target:d.value},[v(m.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(s(),y(Se,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(s(),l(A,{key:1},[j(T(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(s(),l(A,{key:2},[j(T(i(e).title),1)],64)):f("",!0),v(m.$slots,"nav-bar-title-after",{},void 0,!0)],8,Br)],2))}}),Dr=g(Or,[["__scopeId","data-v-2256aec7"]]),Fr={},xr={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},jr=u("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),Ur=u("path",{d:" M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z ",class:"css-c4d79v"},null,-1),Gr=[jr,Ur];function Rr(n,e){return s(),l("svg",xr,Gr)}const Pt=g(Fr,[["render",Rr]]),qr={class:"items"},Kr={class:"title"},Wr=b({__name:"VPNavBarTranslations",setup(n){const{theme:e}=z(),{localeLinks:t,currentLang:o}=_e({correspondingLink:!0});return(a,r)=>i(t).length&&i(o).label?(s(),y(et,{key:0,class:"VPNavBarTranslations",icon:Pt,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[u("div",qr,[u("p",Kr,T(i(o).label),1),(s(!0),l(A,null,G(i(t),c=>(s(),y(Ie,{key:c.link,item:c},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}}),Yr=g(Wr,[["__scopeId","data-v-56a52592"]]),Zr=n=>(Z("data-v-9ec51abf"),n=n(),X(),n),Xr={class:"wrapper"},Jr={class:"container"},Qr={class:"title"},ei={class:"content"},ti={class:"content-body"},ni=Zr(()=>u("div",{class:"divider"},[u("div",{class:"divider-line"})],-1)),oi=b({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=vt(),{hasSidebar:t}=ne(),{hasLocalNav:o}=kt(),{frontmatter:a}=z(),r=E({});return ut(()=>{r.value={"has-sidebar":t.value,"has-local-nav":o.value,top:a.value.layout==="home"&&e.value===0}}),(c,d)=>(s(),l("div",{class:H(["VPNavBar",r.value])},[u("div",Xr,[u("div",Jr,[u("div",Qr,[_(Dr,null,{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),u("div",ei,[u("div",ti,[v(c.$slots,"nav-bar-content-before",{},void 0,!0),_(Nr,{class:"search"}),_(Lr,{class:"menu"}),_(Yr,{class:"translations"}),_(fs,{class:"appearance"}),_(Ar,{class:"social-links"}),_(cr,{class:"extra"}),v(c.$slots,"nav-bar-content-after",{},void 0,!0),_(hr,{class:"hamburger",active:c.isScreenOpen,onClick:d[0]||(d[0]=m=>c.$emit("toggle-screen"))},null,8,["active"])])])])]),ni],2))}}),ai=g(oi,[["__scopeId","data-v-9ec51abf"]]),si={key:0,class:"VPNavScreenAppearance"},ri={class:"text"},ii=b({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=z();return(o,a)=>i(e).appearance&&i(e).appearance!=="force-dark"?(s(),l("div",si,[u("p",ri,T(i(t).darkModeSwitchLabel||"Appearance"),1),_(Je)])):f("",!0)}}),li=g(ii,[["__scopeId","data-v-2f05ca60"]]),ci=b({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),ui=g(ci,[["__scopeId","data-v-13a0f76d"]]),di={},mi={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"},vi=u("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1),pi=[vi];function hi(n,e){return s(),l("svg",mi,pi)}const fi=g(di,[["render",hi]]),_i=b({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=Me("close-screen");return(t,o)=>(s(),y(K,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[j(T(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}}),Vt=g(_i,[["__scopeId","data-v-a77909ab"]]),gi={class:"VPNavScreenMenuGroupSection"},bi={key:0,class:"title"},ki=b({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(s(),l("div",gi,[e.text?(s(),l("p",bi,T(e.text),1)):f("",!0),(s(!0),l(A,null,G(e.items,o=>(s(),y(Vt,{key:o.text,item:o},null,8,["item"]))),128))]))}}),$i=g(ki,[["__scopeId","data-v-02647012"]]),yi=["aria-controls","aria-expanded"],wi=["innerHTML"],Li=["id"],Pi={key:1,class:"group"},Vi=b({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=E(!1),o=L(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function a(){t.value=!t.value}return(r,c)=>(s(),l("div",{class:H(["VPNavScreenMenuGroup",{open:t.value}])},[u("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:a},[u("span",{class:"button-text",innerHTML:r.text},null,8,wi),_(fi,{class:"button-icon"})],8,yi),u("div",{id:o.value,class:"items"},[(s(!0),l(A,null,G(r.items,d=>(s(),l(A,{key:d.text},["link"in d?(s(),l("div",{key:d.text,class:"item"},[_(Vt,{item:d},null,8,["item"])])):(s(),l("div",Pi,[_($i,{text:d.text,items:d.items},null,8,["text","items"])]))],64))),128))],8,Li)],2))}}),Si=g(Vi,[["__scopeId","data-v-add8adf0"]]),zi={key:0,class:"VPNavScreenMenu"},Ci=b({__name:"VPNavScreenMenu",setup(n){const{theme:e}=z();return(t,o)=>i(e).nav?(s(),l("nav",zi,[(s(!0),l(A,null,G(i(e).nav,a=>(s(),l(A,{key:a.text},["link"in a?(s(),y(ui,{key:0,item:a},null,8,["item"])):(s(),y(Si,{key:1,text:a.text||"",items:a.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),Ti=b({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=z();return(t,o)=>i(e).socialLinks?(s(),y(Ee,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),Mi={class:"list"},Ii=b({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=_e({correspondingLink:!0}),o=E(!1);function a(){o.value=!o.value}return(r,c)=>i(e).length&&i(t).label?(s(),l("div",{key:0,class:H(["VPNavScreenTranslations",{open:o.value}])},[u("button",{class:"title",onClick:a},[_(Pt,{class:"icon lang"}),j(" "+T(i(t).label)+" ",1),_(Lt,{class:"icon chevron"})]),u("ul",Mi,[(s(!0),l(A,null,G(i(e),d=>(s(),l("li",{key:d.link,class:"item"},[_(K,{class:"link",href:d.link},{default:p(()=>[j(T(d.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}}),Ei=g(Ii,[["__scopeId","data-v-e924fe42"]]),Ni={class:"container"},Hi=b({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=E(null),t=ht(le?document.body:null);return(o,a)=>(s(),y(ze,{name:"fade",onEnter:a[0]||(a[0]=r=>t.value=!0),onAfterLeave:a[1]||(a[1]=r=>t.value=!1)},{default:p(()=>[o.open?(s(),l("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[u("div",Ni,[v(o.$slots,"nav-screen-content-before",{},void 0,!0),_(Ci,{class:"menu"}),_(Ei,{class:"translations"}),_(li,{class:"appearance"}),_(Ti,{class:"social-links"}),v(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}}),Ai=g(Hi,[["__scopeId","data-v-b4543032"]]),Bi={key:0,class:"VPNav"},Oi=b({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=Wa(),{frontmatter:a}=z(),r=L(()=>a.value.navbar!==!1);return ft("close-screen",t),Ce(()=>{le&&document.documentElement.classList.toggle("hide-nav",!r.value)}),(c,d)=>r.value?(s(),l("header",Bi,[_(ai,{"is-screen-open":i(e),onToggleScreen:i(o)},{"nav-bar-title-before":p(()=>[v(c.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(c.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(c.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(c.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(Ai,{open:i(e)},{"nav-screen-content-before":p(()=>[v(c.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(c.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}}),Di=g(Oi,[["__scopeId","data-v-ca0a69ce"]]),Fi=n=>(Z("data-v-eb64199c"),n=n(),X(),n),xi=["role","tabindex"],ji=Fi(()=>u("div",{class:"indicator"},null,-1)),Ui={key:1,class:"items"},Gi=b({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:o,isLink:a,isActiveLink:r,hasActiveLink:c,hasChildren:d,toggle:m}=yn(L(()=>e.item)),k=L(()=>d.value?"section":"div"),$=L(()=>a.value?"a":"div"),w=L(()=>d.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),S=L(()=>a.value?void 0:"button"),B=L(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":a.value},{"is-active":r.value},{"has-active":c.value}]);function V(N){"key"in N&&N.key!=="Enter"||!e.item.link&&m()}function I(){e.item.link&&m()}return(N,ue)=>{const J=ce("VPSidebarItem",!0);return s(),y(re(k.value),{class:H(["VPSidebarItem",B.value])},{default:p(()=>[N.item.text?(s(),l("div",we({key:0,class:"item",role:S.value},Zt(N.item.items?{click:V,keydown:V}:{},!0),{tabindex:N.item.items&&0}),[ji,N.item.link?(s(),y(K,{key:0,tag:$.value,class:"link",href:N.item.link,rel:N.item.rel,target:N.item.target},{default:p(()=>[(s(),y(re(w.value),{class:"text",innerHTML:N.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(s(),y(re(w.value),{key:1,class:"text",innerHTML:N.item.text},null,8,["innerHTML"])),N.item.collapsed!=null?(s(),l("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:I,onKeydown:Xt(I,["enter"]),tabindex:"0"},[_($t,{class:"caret-icon"})],32)):f("",!0)],16,xi)):f("",!0),N.item.items&&N.item.items.length?(s(),l("div",Ui,[N.depth<5?(s(!0),l(A,{key:0},G(N.item.items,F=>(s(),y(J,{key:F.text,item:F,depth:N.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}}),Ri=g(Gi,[["__scopeId","data-v-eb64199c"]]),St=n=>(Z("data-v-7b6857b5"),n=n(),X(),n),qi=St(()=>u("div",{class:"curtain"},null,-1)),Ki={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Wi=St(()=>u("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),Yi=b({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=ne(),o=n,a=E(null),r=ht(le?document.body:null);return te([o,a],()=>{var c;o.open?(r.value=!0,(c=a.value)==null||c.focus()):r.value=!1},{immediate:!0,flush:"post"}),(c,d)=>i(t)?(s(),l("aside",{key:0,class:H(["VPSidebar",{open:c.open}]),ref_key:"navEl",ref:a,onClick:d[0]||(d[0]=Jt(()=>{},["stop"]))},[qi,u("nav",Ki,[Wi,v(c.$slots,"sidebar-nav-before",{},void 0,!0),(s(!0),l(A,null,G(i(e),m=>(s(),l("div",{key:m.text,class:"group"},[_(Ri,{item:m,depth:0},null,8,["item"])]))),128)),v(c.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}}),Zi=g(Yi,[["__scopeId","data-v-7b6857b5"]]),Xi=b({__name:"VPSkipLink",setup(n){const e=fe(),t=E();te(()=>e.path,()=>t.value.focus());function o({target:a}){const r=document.getElementById(decodeURIComponent(a.hash).slice(1));if(r){const c=()=>{r.removeAttribute("tabindex"),r.removeEventListener("blur",c)};r.setAttribute("tabindex","-1"),r.addEventListener("blur",c),r.focus(),window.scrollTo(0,0)}}return(a,r)=>(s(),l(A,null,[u("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),u("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Ji=g(Xi,[["__scopeId","data-v-2cc3dcc2"]]),Qi=b({__name:"Layout",setup(n){const{isOpen:e,open:t,close:o}=ne(),a=fe();te(()=>a.path,o),$n(e,o);const{frontmatter:r}=z(),c=Qt(),d=L(()=>!!c["home-hero-image"]);return ft("hero-image-slot-exists",d),(m,k)=>{const $=ce("Content");return i(r).layout!==!1?(s(),l("div",{key:0,class:H(["Layout",i(r).pageClass])},[v(m.$slots,"layout-top",{},void 0,!0),_(Ji),_(sn,{class:"backdrop",show:i(e),onClick:i(o)},null,8,["show","onClick"]),_(Di,null,{"nav-bar-title-before":p(()=>[v(m.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[v(m.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[v(m.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[v(m.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[v(m.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[v(m.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(Ka,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),_(Zi,{open:i(e)},{"sidebar-nav-before":p(()=>[v(m.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[v(m.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(ba,null,{"page-top":p(()=>[v(m.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[v(m.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[v(m.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[v(m.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[v(m.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[v(m.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[v(m.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[v(m.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[v(m.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[v(m.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[v(m.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[v(m.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[v(m.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[v(m.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[v(m.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[v(m.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[v(m.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[v(m.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[v(m.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[v(m.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(La),v(m.$slots,"layout-bottom",{},void 0,!0)],2)):(s(),y($,{key:1}))}}}),el=g(Qi,[["__scopeId","data-v-6b5043bc"]]),tl={},nl={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},ol=u("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1),al=[ol];function sl(n,e){return s(),l("svg",nl,al)}const rl=g(tl,[["render",sl]]),il={},ll={class:"VPTeamPage"};function cl(n,e){return s(),l("div",ll,[v(n.$slots,"default")])}const oc=g(il,[["render",cl],["__scopeId","data-v-0dac1e67"]]),ul={},dl={class:"VPTeamPageTitle"},ml={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return s(),l("div",dl,[n.$slots.title?(s(),l("h1",ml,[v(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(s(),l("p",vl,[v(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const ac=g(ul,[["render",pl],["__scopeId","data-v-867cfc0f"]]),hl={class:"profile"},fl={class:"avatar"},_l=["src","alt"],gl={class:"data"},bl={class:"name"},kl={key:0,class:"affiliation"},$l={key:0,class:"title"},yl={key:1,class:"at"},wl=["innerHTML"],Ll={key:2,class:"links"},Pl={key:0,class:"sp"},Vl=b({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(s(),l("article",{class:H(["VPTeamMembersItem",[e.size]])},[u("div",hl,[u("figure",fl,[u("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,_l)]),u("div",gl,[u("h1",bl,T(e.member.name),1),e.member.title||e.member.org?(s(),l("p",kl,[e.member.title?(s(),l("span",$l,T(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(s(),l("span",yl," @ ")):f("",!0),e.member.org?(s(),y(K,{key:2,class:H(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[j(T(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(s(),l("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,wl)):f("",!0),e.member.links?(s(),l("div",Ll,[_(Ee,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(s(),l("div",Pl,[_(K,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[_(rl,{class:"sp-icon"}),j(" "+T(e.member.actionText||"Sponsor"),1)]),_:1},8,["href"])])):f("",!0)],2))}}),Sl=g(Vl,[["__scopeId","data-v-c8b9bdef"]]),zl={class:"container"},Cl=b({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=L(()=>[e.size,`count-${e.members.length}`]);return(o,a)=>(s(),l("div",{class:H(["VPTeamMembers",t.value])},[u("div",zl,[(s(!0),l(A,null,G(o.members,r=>(s(),l("div",{key:r.name,class:"item"},[_(Sl,{size:o.size,member:r},null,8,["size","member"])]))),128))])],2))}}),sc=g(Cl,[["__scopeId","data-v-130c6a1d"]]),st={Layout:el,enhanceApp:({app:n})=>{n.component("Badge",nn)}},Tl=["id","host","repo","repoid","category","categoryid","mapping","term","strict","reactionsenabled","emitmetadata","inputposition","theme","lang","loading"],Ml=b({__name:"Giscus",props:{id:{},host:{},repo:{},repoId:{},category:{},categoryId:{},mapping:{},term:{},theme:{},strict:{},reactionsEnabled:{},emitMetadata:{},inputPosition:{},lang:{},loading:{}},setup(n){const e=E(!1);return Y(()=>{e.value=!0,pt(()=>import("./giscus-aTimukGI.CKTvSCx2.js"),[])}),(t,o)=>e.value?(s(),l("giscus-widget",{key:0,id:t.id,host:t.host,repo:t.repo,repoid:t.repoId,category:t.category,categoryid:t.categoryId,mapping:t.mapping,term:t.term,strict:t.strict,reactionsenabled:t.reactionsEnabled,emitmetadata:t.emitMetadata,inputposition:t.inputPosition,theme:t.theme,lang:t.lang,loading:t.loading},null,8,Tl)):f("",!0)}}),rt=(n,e,t=!0)=>{var k;const o={id:"comment",host:"https://giscus.app",category:"General",mapping:"pathname",term:"Welcome to giscus!",reactionsEnabled:"1",inputPosition:"top",lang:"zh-CN",loading:"lazy",repo:"xxx/xxx",repoId:"",homePageShowComment:!1};if(n.locales){const w=document.querySelector("html").getAttribute("lang");w&&n.locales[w]&&(n.lang=n.locales[w])}const a=n.lightTheme||"light",r=n.darkTheme||"transparent_dark";let c=document.getElementById("giscus");if(c&&c.parentNode.removeChild(c),(e==null?void 0:e.value.comment)!==void 0){if(!(e!=null&&e.value.comment))return}else if(!t)return;if(!n.homePageShowComment&&(!location.pathname||location.pathname==="/"))return;const d=((k=document.querySelector("html"))==null?void 0:k.className.indexOf("dark"))!==-1,m=document.getElementsByClassName("content-container")[0];if(m){const $=document.createElement("div");$.setAttribute("id","giscus"),$.style.height="auto",$.style.marginTop="40px",$.style.borderTop="1px solid var(--vp-c-divider)",$.style.paddingTop="20px",m.append($),en({render:()=>Ve(Ml,{...o,theme:d?r:a,...n})}).mount("#giscus")}},Il=n=>{const e=document.querySelector("html"),t=n.lightTheme||"light",o=n.darkTheme||"transparent_dark";new MutationObserver(r=>{r.forEach(c=>{if(c.type=="attributes"){let d=document.getElementById("comment");d==null||d.setAttribute("theme",e.className.indexOf("dark")!==-1?o:t)}})}).observe(e,{attributeFilter:["class"]})},El=(n,e,t=!0)=>{Y(()=>{rt(n,e.frontmatter,t),Il(n)}),te(()=>e.route.path,()=>We(()=>{rt(n,e.frontmatter,t)}))};/*! medium-zoom 1.1.0 | MIT License | https://github.com/francoischalifour/medium-zoom */var se=Object.assign||function(n){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:{},o=window.Promise||function(P){function C(){}P(C,C)},a=function(P){var C=P.target;if(C===ge){V();return}F.indexOf(C)!==-1&&I({target:C})},r=function(){if(!(Q||!h.original)){var P=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(tt-P)>O.scrollOffset&&setTimeout(V,150)}},c=function(P){var C=P.key||P.keyCode;(C==="Escape"||C==="Esc"||C===27)&&V()},d=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P;if(P.background&&(ge.style.background=P.background),P.container&&P.container instanceof Object&&(C.container=se({},O.container,P.container)),P.template){var D=Pe(P.template)?P.template:document.querySelector(P.template);C.template=D}return O=se({},O,C),F.forEach(function(x){x.dispatchEvent(me("medium-zoom:update",{detail:{zoom:U}}))}),U},m=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};return n(se({},O,P))},k=function(){for(var P=arguments.length,C=Array(P),D=0;D0?C.reduce(function(M,q){return[].concat(M,lt(q))},[]):F;return x.forEach(function(M){M.classList.remove("medium-zoom-image"),M.dispatchEvent(me("medium-zoom:detach",{detail:{zoom:U}}))}),F=F.filter(function(M){return x.indexOf(M)===-1}),U},w=function(P,C){var D=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return F.forEach(function(x){x.addEventListener("medium-zoom:"+P,C,D)}),oe.push({type:"medium-zoom:"+P,listener:C,options:D}),U},S=function(P,C){var D=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return F.forEach(function(x){x.removeEventListener("medium-zoom:"+P,C,D)}),oe=oe.filter(function(x){return!(x.type==="medium-zoom:"+P&&x.listener.toString()===C.toString())}),U},B=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P.target,D=function(){var M={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},q=void 0,W=void 0;if(O.container)if(O.container instanceof Object)M=se({},M,O.container),q=M.width-M.left-M.right-O.margin*2,W=M.height-M.top-M.bottom-O.margin*2;else{var de=Pe(O.container)?O.container:document.querySelector(O.container),ae=de.getBoundingClientRect(),Ne=ae.width,Mt=ae.height,It=ae.left,Et=ae.top;M=se({},M,{width:Ne,height:Mt,left:It,top:Et})}q=q||M.width-O.margin*2,W=W||M.height-O.margin*2;var he=h.zoomedHd||h.original,Nt=it(he)?q:he.naturalWidth||q,Ht=it(he)?W:he.naturalHeight||W,be=he.getBoundingClientRect(),At=be.top,Bt=be.left,He=be.width,Ae=be.height,Ot=Math.min(Math.max(He,Nt),q)/He,Dt=Math.min(Math.max(Ae,Ht),W)/Ae,Be=Math.min(Ot,Dt),Ft=(-Bt+(q-He)/2+O.margin+M.left)/Be,xt=(-At+(W-Ae)/2+O.margin+M.top)/Be,nt="scale("+Be+") translate3d("+Ft+"px, "+xt+"px, 0)";h.zoomed.style.transform=nt,h.zoomedHd&&(h.zoomedHd.style.transform=nt)};return new o(function(x){if(C&&F.indexOf(C)===-1){x(U);return}var M=function Ne(){Q=!1,h.zoomed.removeEventListener("transitionend",Ne),h.original.dispatchEvent(me("medium-zoom:opened",{detail:{zoom:U}})),x(U)};if(h.zoomed){x(U);return}if(C)h.original=C;else if(F.length>0){var q=F;h.original=q[0]}else{x(U);return}if(h.original.dispatchEvent(me("medium-zoom:open",{detail:{zoom:U}})),tt=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,Q=!0,h.zoomed=Al(h.original),document.body.appendChild(ge),O.template){var W=Pe(O.template)?O.template:document.querySelector(O.template);h.template=document.createElement("div"),h.template.appendChild(W.content.cloneNode(!0)),document.body.appendChild(h.template)}if(h.original.parentElement&&h.original.parentElement.tagName==="PICTURE"&&h.original.currentSrc&&(h.zoomed.src=h.original.currentSrc),document.body.appendChild(h.zoomed),window.requestAnimationFrame(function(){document.body.classList.add("medium-zoom--opened")}),h.original.classList.add("medium-zoom-image--hidden"),h.zoomed.classList.add("medium-zoom-image--opened"),h.zoomed.addEventListener("click",V),h.zoomed.addEventListener("transitionend",M),h.original.getAttribute("data-zoom-src")){h.zoomedHd=h.zoomed.cloneNode(),h.zoomedHd.removeAttribute("srcset"),h.zoomedHd.removeAttribute("sizes"),h.zoomedHd.removeAttribute("loading"),h.zoomedHd.src=h.zoomed.getAttribute("data-zoom-src"),h.zoomedHd.onerror=function(){clearInterval(de),console.warn("Unable to reach the zoom image target "+h.zoomedHd.src),h.zoomedHd=null,D()};var de=setInterval(function(){h.zoomedHd.complete&&(clearInterval(de),h.zoomedHd.classList.add("medium-zoom-image--opened"),h.zoomedHd.addEventListener("click",V),document.body.appendChild(h.zoomedHd),D())},10)}else if(h.original.hasAttribute("srcset")){h.zoomedHd=h.zoomed.cloneNode(),h.zoomedHd.removeAttribute("sizes"),h.zoomedHd.removeAttribute("loading");var ae=h.zoomedHd.addEventListener("load",function(){h.zoomedHd.removeEventListener("load",ae),h.zoomedHd.classList.add("medium-zoom-image--opened"),h.zoomedHd.addEventListener("click",V),document.body.appendChild(h.zoomedHd),D()})}else D()})},V=function(){return new o(function(P){if(Q||!h.original){P(U);return}var C=function D(){h.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(h.zoomed),h.zoomedHd&&document.body.removeChild(h.zoomedHd),document.body.removeChild(ge),h.zoomed.classList.remove("medium-zoom-image--opened"),h.template&&document.body.removeChild(h.template),Q=!1,h.zoomed.removeEventListener("transitionend",D),h.original.dispatchEvent(me("medium-zoom:closed",{detail:{zoom:U}})),h.original=null,h.zoomed=null,h.zoomedHd=null,h.template=null,P(U)};Q=!0,document.body.classList.remove("medium-zoom--opened"),h.zoomed.style.transform="",h.zoomedHd&&(h.zoomedHd.style.transform=""),h.template&&(h.template.style.transition="opacity 150ms",h.template.style.opacity=0),h.original.dispatchEvent(me("medium-zoom:close",{detail:{zoom:U}})),h.zoomed.addEventListener("transitionend",C)})},I=function(){var P=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},C=P.target;return h.original?V():B({target:C})},N=function(){return O},ue=function(){return F},J=function(){return h.original},F=[],oe=[],Q=!1,tt=0,O=t,h={original:null,zoomed:null,zoomedHd:null,template:null};Object.prototype.toString.call(e)==="[object Object]"?O=e:(e||typeof e=="string")&&k(e),O=se({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},O);var ge=Hl(O.background);document.addEventListener("click",a),document.addEventListener("keyup",c),document.addEventListener("scroll",r),window.addEventListener("resize",V);var U={open:B,close:V,toggle:I,update:d,clone:m,attach:k,detach:$,on:w,off:S,getOptions:N,getImages:ue,getZoomedImage:J};return U};function Ol(n,e){e===void 0&&(e={});var t=e.insertAt;if(!(typeof document>"u")){var o=document.head||document.getElementsByTagName("head")[0],a=document.createElement("style");a.type="text/css",t==="top"&&o.firstChild?o.insertBefore(a,o.firstChild):o.appendChild(a),a.styleSheet?a.styleSheet.cssText=n:a.appendChild(document.createTextNode(n))}}var Dl=".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}";Ol(Dl);const Fl=n=>(Z("data-v-09295527"),n=n(),X(),n),xl=Fl(()=>u("svg",{class:"icon-top",viewBox:"0 0 48 48",fill:"none",xmlns:"http://www.w3.org/2000/svg",stroke:"currentColor","stroke-width":"4","stroke-linecap":"butt","stroke-linejoin":"miter"},[u("path",{d:"M39.6 30.557 24.043 15 8.487 30.557"})],-1)),jl=[xl],Ul=b({__name:"back-to-top",props:{threshold:{default:300}},setup(n){const e=n,t=E(0),o=L(()=>t.value>e.threshold);Y(()=>{t.value=a(),window.addEventListener("scroll",c(()=>{t.value=a()},100))});function a(){return window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0}function r(){window.scrollTo({top:0,behavior:"smooth"}),t.value=0}function c(d,m=100){let k;return(...$)=>{clearTimeout(k),k=setTimeout(()=>{d.apply(null,$)},m)}}return(d,m)=>(s(),y(ze,{name:"fade"},{default:p(()=>[i(o)?(s(),l("div",{key:0,class:"go-to-top",onClick:r},jl)):f("",!0)]),_:1}))}}),Gl=(n,e)=>{const t=n.__vccOpts||n;for(const[o,a]of e)t[o]=a;return t},Rl=Gl(Ul,[["__scopeId","data-v-09295527"]]),ql=n=>{typeof window>"u"||window.addEventListener("load",()=>{const e=document.createElement("div");document.body.appendChild(e),tn(Ve(Rl,{threshold:n==null?void 0:n.threshold}),e)})};function Kl(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var zt,pe,ee,Ct,De,ct,ve,$e=!1,ye=[];typeof document<"u"&&(Ct=function(n){return $e||document.readyState==="interactive"||document.readyState==="complete"?n.call(document):ye.push(function(){return n.call(this)}),this},ct=function(){for(var n=0,e=ye.length;n{pe&&pe.hides(),zt.fetch("//busuanzi.ibruce.info/busuanzi?jsonpCallback=BusuanziCallback",function(n){pe.texts(n),pe.shows()})};pe={bszs:["site_pv","page_pv","site_uv"],texts:function(n){this.bszs.map(function(e){var t=document.getElementById("busuanzi_value_"+e);t&&(t.innerHTML=n[e])})},hides:function(){this.bszs.map(function(n){var e=document.getElementById("busuanzi_container_"+n);e&&(e.style.display="none")})},shows:function(){this.bszs.map(function(n){var e=document.getElementById("busuanzi_container_"+n);e&&(e.style.display="inline")})}};typeof document<"u"&&Tt();var Wl={fetch:Tt},Yl=Wl;const Zl=Kl(Yl),Xl={class:"page_info"},Jl={key:0,class:"page_info_item"},Ql={key:1,class:"page_info_item"},ec=u("span",{class:"page_info_item"},[j(" 📔 "),u("span",{id:"busuanzi_container_page_pv"},[j(" 阅读量:"),u("span",{id:"busuanzi_value_page_pv"})])],-1),tc={__name:"PageInfo",setup(n){const{frontmatter:e}=Re();return(t,o)=>(s(),l("div",Xl,[i(e).Author?(s(),l("span",Jl,[j(" 🎨 "),u("span",null,"作者:"+T(i(e).Author),1)])):f("",!0),i(e).date?(s(),l("span",Ql,[j(" 🕐 "),u("span",null,"发表于:"+T(i(e).date?i(e).date.substring(0,10):""),1)])):f("",!0),ec]))}},rc={extends:st,Layout(){return Ve(st.Layout,null,{"doc-before":()=>Ve(tc)})},enhanceApp({app:n,router:e}){le&&(e.onAfterRouteChanged=()=>{Zl.fetch()}),ql({threshold:300})},setup(){const{frontmatter:n}=Re(),e=fe(),t=()=>{Bl(".main img",{background:"var(--vp-c-bg)"})};Y(()=>{t()}),te(()=>e.path,()=>We(()=>t())),El({repo:"funny-dream/youqu3",repoId:"R_kgDOMBemKg",category:"Announcements",categoryId:"DIC_kwDOMBemKs4CgATm",mapping:"pathname",inputPosition:"top",lang:"zh-CN"},{frontmatter:n,route:e},!0)}};export{rc as R,ac as V,sc as a,oc as b,Pr as c,z as u}; diff --git a/assets/index.md.DHQYfbhW.js b/assets/index.md.DqShbTWU.js similarity index 89% rename from assets/index.md.DHQYfbhW.js rename to assets/index.md.DqShbTWU.js index 53f5165..ed00592 100644 --- a/assets/index.md.DHQYfbhW.js +++ b/assets/index.md.DqShbTWU.js @@ -1 +1 @@ -import{V as n,a as s,b as r}from"./chunks/theme.D89Al4wk.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721408535000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; +import{V as n,a as s,b as r}from"./chunks/theme.F2IToOfj.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.DPHCW6-_.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721631998000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; diff --git a/assets/index.md.DHQYfbhW.lean.js b/assets/index.md.DqShbTWU.lean.js similarity index 89% rename from assets/index.md.DHQYfbhW.lean.js rename to assets/index.md.DqShbTWU.lean.js index 53f5165..ed00592 100644 --- a/assets/index.md.DHQYfbhW.lean.js +++ b/assets/index.md.DqShbTWU.lean.js @@ -1 +1 @@ -import{V as n,a as s,b as r}from"./chunks/theme.D89Al4wk.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721408535000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; +import{V as n,a as s,b as r}from"./chunks/theme.F2IToOfj.js";import{c as u,I as t,w as e,p as i,o as m,a}from"./chunks/framework.DPHCW6-_.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"YouQu3","text":"Next-Gen Linux Autotest Framework","tagline":"让 Linux 自动化测试变得更简单","actions":[{"theme":"brand","text":"GitHub","link":"https://github.com/funny-dream/youqu3"},{"theme":"alt","text":"Issues","link":"https://github.com/funny-dream/youqu3/issues"}],"image":{"src":"/logo.png","alt":"YouQu3"}},"features":[{"icon":"💪","title":"新架构","details":"全新的架构设计,插件化、模块化改造,底层全面重写,优化框架接口调用机制。"},{"icon":"💥","title":"新玩法","details":"继承YouQu2诸多亮点功能的同时解决其遇到的问题,各方面全面优化,更多玩法姿势等你来解锁。"},{"icon":"🛀","title":"新体验","details":"更加简单易用、更加纯粹、扩展性和兼容性更好,一发入魂。"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1721631998000}'),l={name:"index.md"},b=Object.assign(l,{setup(c){const o=[{avatar:"https://www.github.com/mikigo.png",name:"mikigo",title:"Creator",org:"YouQu3",orgLink:"https://github.com/funny-dream/youqu3",links:[{icon:"github",link:"https://github.com/mikigo"},{icon:"x",link:"https://twitter.com/mikigo_"}]},{avatar:"https://www.github.com/DarkLii.png",name:"DarkLii",title:"Developer",links:[{icon:"github",link:"https://github.com/DarkLii"}]}];return(h,g)=>(m(),u("div",null,[t(i(r),null,{default:e(()=>[t(i(n),null,{title:e(()=>[a(" Contributors ")]),lead:e(()=>[a(" 感谢以下所有人的贡献与参与 ")]),_:1}),t(i(s),{size:"small",members:o})]),_:1})]))}});export{k as __pageData,b as default}; diff --git "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.js" similarity index 67% rename from "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" rename to "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.js" index c9c54de..56ff1af 100644 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.js" +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721408535000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721631998000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.lean.js" similarity index 67% rename from "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" rename to "assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.lean.js" index c9c54de..56ff1af 100644 --- "a/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.D5w4ani5.lean.js" +++ "b/assets/\345\256\236\350\267\265_\346\226\271\346\263\225\345\274\200\345\217\221.md.DrKhzEj9.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721408535000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/方法开发.md","filePath":"实践/方法开发.md","lastUpdated":1721631998000}'),r={name:"实践/方法开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.js" similarity index 67% rename from "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" rename to "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.js" index 2fb82c5..5f849df 100644 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.js" +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721408535000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721631998000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.lean.js" similarity index 67% rename from "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" rename to "assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.lean.js" index 2fb82c5..5f849df 100644 --- "a/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.EtGquKvU.lean.js" +++ "b/assets/\345\256\236\350\267\265_\347\224\250\344\276\213\345\274\200\345\217\221.md.DNazKAqh.lean.js" @@ -1 +1 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721408535000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"实践/用例开发.md","filePath":"实践/用例开发.md","lastUpdated":1721631998000}'),r={name:"实践/用例开发.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.Co0iG6_7.js" similarity index 98% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.Co0iG6_7.js" index 77900a5..e7e6218 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.DRi-K-t9.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_JSON\346\212\245\345\221\212.md.Co0iG6_7.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"JSON 报告","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/JSON报告.md","filePath":"指南/与生俱来/JSON报告.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/JSON报告.md"},h=n(`

JSON 报告

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

报告内容

整体结构

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

JSON 报告

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

报告内容

整体结构

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

全自动日志

背景

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

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

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

全自动日志

背景

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

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

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

前后钩子

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

前置钩子

前置脚本钩子

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

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

前后钩子

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

前置钩子

前置脚本钩子

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

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

动态等待

架构动态等待

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

动态等待

架构动态等待

python
from youqu3 import sleep
 
 sleep(1)

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

python
from time import sleep

优化:

  • 增加了等待的日志

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

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

    命令行交互

    本机命令行交互

    普通权限执行

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

    命令行交互

    本机命令行交互

    普通权限执行

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

    sudo权限执行

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

    断言语句

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

    用例中使用方法

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

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

    断言语句

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

    用例中使用方法

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

    python
    # assert_method.py
     
     from youqu3.assertx import Assert
     
    @@ -62,8 +62,6 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
                 )
             except exceptions.TemplateElementNotFound as exc:
                 raise AssertionError(exc) from exceptions.TemplateElementNotFound
    -        except Exception as exc:
    -            raise exceptions.AssertOptionError(exc) from Exception
     
         @classmethod
         def assert_image_exist_during_time(
    @@ -87,8 +85,6 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
                 pylinuxauto.get_during(widget, screen_time, rate, pause)
             except exceptions.TemplateElementNotFound as exc:
                 raise AssertionError(exc) from exceptions.TemplateElementNotFound
    -        except Exception as exc:
    -            raise exceptions.AssertOptionError(exc) from Exception
     
         @staticmethod
         def assert_image_not_exist(
    @@ -126,8 +122,6 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
                 pass
             except exceptions.TemplateElementFound as exc:
                 raise AssertionError(exc) from exceptions.TemplateElementFound
    -        except Exception as exc:
    -            raise exceptions.AssertOptionError(exc) from Exception
     
         @staticmethod
         def assert_file_exist(file_path):
    @@ -137,7 +131,7 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
             """
             logger.info(f"断言文件存在 <{file_path}>")
             if not os.path.exists(os.path.expanduser(file_path)):
    -            raise AssertionError(f"文件不存在! 路径 {file_path}")
    +            raise AssertionError(f"文件不存在:{file_path}")
             return True
     
         @staticmethod
    @@ -150,7 +144,7 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
             """
             logger.info(f"断言文件不存在 <{file_path}>")
             if os.path.exists(os.path.expanduser(file_path)):
    -            raise AssertionError(f"文件存在! 路径 {file_path}")
    +            raise AssertionError(f"文件存在:{file_path}")
     
         @staticmethod
         def assert_element_exist(expr):
    @@ -161,7 +155,7 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
             logger.info(f"断言元素存在<{expr}>")
             from youqu3.gui import pylinuxauto
             if not pylinuxauto.find_element_by_attr_path(expr):
    -            raise AssertionError(f"元素不存在!!!expr= <{expr}>")
    +            raise AssertionError(f"元素不存在:{expr}")
     
         @staticmethod
         def assert_element_not_exist(expr):
    @@ -173,7 +167,7 @@ import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";
             from youqu3.gui import pylinuxauto
             try:
                 pylinuxauto.find_element_by_attr_path(expr)
    -            raise AssertionError(f"元素不应存在!!!expr= <{expr}>")
    +            raise AssertionError(f"元素不应该存在:{expr}")
             except exceptions.ElementNotFound:
                 pass
     
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.BMW7n5nx.lean.js"
    similarity index 73%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.BMW7n5nx.lean.js"
    index 0205b4b..2250ab3 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.DYZkvVDK.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\226\255\350\250\200\350\257\255\345\217\245.md.BMW7n5nx.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.CoRJFuj9.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721408535000}'),k={name:"指南/与生俱来/断言语句.md"},p=n("",12),l=[p];function t(e,E,r,F,d,g){return a(),i("div",null,l)}const o=s(k,[["render",t]]);export{C as __pageData,o as default};
    +import{_ as s,c as i,o as a,U as n,a6 as h}from"./chunks/framework.DPHCW6-_.js";const C=JSON.parse('{"title":"断言语句","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/断言语句.md","filePath":"指南/与生俱来/断言语句.md","lastUpdated":1721631998000}'),k={name:"指南/与生俱来/断言语句.md"},p=n("",12),l=[p];function t(e,E,r,F,d,g){return a(),i("div",null,l)}const o=s(k,[["render",t]]);export{C as __pageData,o as default};
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.js"
    similarity index 98%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.js"
    index 3acb556..7db8905 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.js"
    @@ -1 +1 @@
    -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721408535000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a('

    标签化管理

    使用说明

    在 CSV 文件中写入标签:

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

    CSV文件与脚本对应关系

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

    举例

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

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

    特殊标签

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

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

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

    跳过用例

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

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

    1. 固定跳过

    示例:

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

    2. 条件判断跳过

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

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

    示例:

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

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

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

    3.自定义跳过

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

    方法编写规范:

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

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

    重要

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

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

    确认修复

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

    示例:

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

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

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

    bash
    python3 manage.py run --ifixed yes

    废弃用例

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

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

    文件格式

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

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

    标签化管理

    使用说明

    在 CSV 文件中写入标签:

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

    CSV文件与脚本对应关系

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

    举例

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

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

    特殊标签

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

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

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

    跳过用例

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

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

    1. 固定跳过

    示例:

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

    2. 条件判断跳过

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

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

    示例:

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

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

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

    3.自定义跳过

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

    方法编写规范:

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

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

    重要

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

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

    确认修复

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

    示例:

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

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

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

    bash
    python3 manage.py run --ifixed yes

    废弃用例

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

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

    文件格式

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

    ',45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.lean.js" similarity index 60% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.lean.js" index ae791f2..7a18d8d 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.DOd8Dpk9.lean.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.md.ybzn751_.lean.js" @@ -1 +1 @@ -import{_ as t,c as e,o as d,U as a}from"./chunks/framework.CoRJFuj9.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721408535000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a("",45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; +import{_ as t,c as e,o as d,U as a}from"./chunks/framework.DPHCW6-_.js";const b=JSON.parse('{"title":"标签化管理","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/标签化管理.md","filePath":"指南/与生俱来/标签化管理.md","lastUpdated":1721631998000}'),c={name:"指南/与生俱来/标签化管理.md"},o=a("",45),l=[o];function i(s,r,n,h,p,x){return d(),e("div",null,l)}const k=t(c,[["render",i]]);export{b as __pageData,k as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.js" new file mode 100644 index 0000000..46bc403 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.js" @@ -0,0 +1,2 @@ +import{_ as s,c as a,o as t,U as i,a7 as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721631998000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=i(`

    脚手架工具

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

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

    ',7),p=[n];function o(h,c,d,r,_,k){return t(),a("div",null,p)}const m=s(l,[["render",o]]);export{g as __pageData,m as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.lean.js" new file mode 100644 index 0000000..51bd35b --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.COef0uN8.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as t,U as i,a7 as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"脚手架工具","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721631998000}'),l={name:"指南/与生俱来/脚手架工具.md"},n=i("",7),p=[n];function o(h,c,d,r,_,k){return t(),a("div",null,p)}const m=s(l,[["render",o]]);export{g as __pageData,m as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" deleted file mode 100644 index e2702ec..0000000 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721408535000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" deleted file mode 100644 index e2702ec..0000000 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.md.DRa5p1HS.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/脚手架工具.md","filePath":"指南/与生俱来/脚手架工具.md","lastUpdated":1721408535000}'),r={name:"指南/与生俱来/脚手架工具.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default}; diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.js" similarity index 97% rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.js" index ab99d5e..28179dd 100644 --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.js" +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.js" @@ -1,4 +1,4 @@ -import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n('

    远程交互式控制

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

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

    slaves对象提供远程机器信息

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

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

    命令行

    bash
    youqu3 run --slaves root@192.168.1.1:password1

    多个机器信息用 / 分割:

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

    UI操作远程对象

    RpcGui

    用于属性定位相关操作;

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

    远程交互式控制

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

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

    slaves对象提供远程机器信息

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

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

    命令行

    bash
    youqu3 run --slaves root@192.168.1.1:password1

    多个机器信息用 / 分割:

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

    UI操作远程对象

    RpcGui

    用于属性定位相关操作;

    python
    # remote_widget.py
     
     from youqu3.gui import RpcGui
     
    diff --git "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js" "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.lean.js"
    similarity index 62%
    rename from "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js"
    rename to "assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.lean.js"
    index 0d1b5e9..7f41dc9 100644
    --- "a/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.TCPCQR_v.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\344\270\216\347\224\237\344\277\261\346\235\245_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.DkPsG4Yc.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as n,a7 as p}from"./chunks/framework.CoRJFuj9.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721408535000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n("",15),l=[h];function e(k,r,d,o,E,g){return a(),i("div",null,l)}const F=s(t,[["render",e]]);export{y as __pageData,F as default};
    +import{_ as s,c as i,o as a,U as n,a8 as p}from"./chunks/framework.DPHCW6-_.js";const y=JSON.parse('{"title":"远程交互式控制","description":"","frontmatter":{},"headers":[],"relativePath":"指南/与生俱来/远程交互控制.md","filePath":"指南/与生俱来/远程交互控制.md","lastUpdated":1721631998000}'),t={name:"指南/与生俱来/远程交互控制.md"},h=n("",15),l=[h];function e(k,r,d,o,E,g){return a(),i("div",null,l)}const F=s(t,[["render",e]]);export{y as __pageData,F as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.js"
    index 12e2e35..9e436a0 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721408535000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721631998000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.lean.js"
    index 12e2e35..9e436a0 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.DAQ6P4eN.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_DBus\350\207\252\345\212\250\345\214\226.md.CyB0yQ5u.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721408535000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/DBus自动化.md","filePath":"指南/可选功能/DBus自动化.md","lastUpdated":1721631998000}'),s={name:"指南/可选功能/DBus自动化.md"};function r(o,c,n,_,d,p){return a(),t("div")}const f=e(s,[["render",r]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.js"
    index 8e7efe1..081fa94 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.lean.js"
    index 8e7efe1..081fa94 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.CEakJzU1.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_GUI\350\207\252\345\212\250\345\214\226.md.DL5_OxbD.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/GUI自动化.md","filePath":"指南/可选功能/GUI自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/GUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.js"
    index 745bfce..557f725 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.lean.js"
    index 745bfce..557f725 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.BD0C2PLp.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTML\346\212\245\345\221\212.md.CwKyfJ2P.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTML报告.md","filePath":"指南/可选功能/HTML报告.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/HTML报告.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.js"
    index 44f0258..b853e7d 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.lean.js"
    index 44f0258..b853e7d 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.ClcvJbXP.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_HTTP\350\207\252\345\212\250\345\214\226.md.BlmKJBRY.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/HTTP自动化.md","filePath":"指南/可选功能/HTTP自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/HTTP自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.js"
    index 504bd02..17be292 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.lean.js"
    index 504bd02..17be292 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.4tGdED5Q.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_WebUI\350\207\252\345\212\250\345\214\226.md.Df5fxio_.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/WebUI自动化.md","filePath":"指南/可选功能/WebUI自动化.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/WebUI自动化.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.js"
    index e5f04df..1608fb0 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.lean.js"
    index e5f04df..1608fb0 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.UhOPKbmA.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\345\205\266\344\273\226\346\217\222\344\273\266.md.DIHBrI0B.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/其他插件.md","filePath":"指南/可选功能/其他插件.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/其他插件.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.js"
    index eaa5cfc..3e3acea 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.lean.js"
    similarity index 70%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.lean.js"
    index eaa5cfc..3e3acea 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.DggQ5HdS.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\347\224\250\344\276\213\345\275\225\345\261\217.md.BTl-QwPF.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/用例录屏.md","filePath":"指南/可选功能/用例录屏.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/用例录屏.md"};function o(s,c,n,_,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.js"
    similarity index 71%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.js"
    index 15ffca4..9568757 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js" "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.lean.js"
    similarity index 71%
    rename from "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js"
    rename to "assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.lean.js"
    index 15ffca4..9568757 100644
    --- "a/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.BJD86lKm.lean.js"
    +++ "b/assets/\346\214\207\345\215\227_\345\217\257\351\200\211\345\212\237\350\203\275_\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.md.Di_mii3F.lean.js"
    @@ -1 +1 @@
    -import{_ as e,c as t,o as a}from"./chunks/framework.CoRJFuj9.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721408535000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    +import{_ as e,c as t,o as a}from"./chunks/framework.DPHCW6-_.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"指南/可选功能/远程交互控制.md","filePath":"指南/可选功能/远程交互控制.md","lastUpdated":1721631998000}'),r={name:"指南/可选功能/远程交互控制.md"};function o(s,_,c,n,d,p){return a(),t("div")}const f=e(r,[["render",o]]);export{m as __pageData,f as default};
    diff --git "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js" "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DTl0iVdm.js"
    similarity index 87%
    rename from "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js"
    rename to "assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DTl0iVdm.js"
    index 293a9d5..75bcc65 100644
    --- "a/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DxExLQbF.js"
    +++ "b/assets/\346\214\207\345\215\227_\347\216\257\345\242\203\347\256\241\347\220\206_\345\216\237\347\224\237\347\216\257\345\242\203.md.DTl0iVdm.js"
    @@ -1 +1 @@
    -import{_ as s,c as a,o as e,U as t}from"./chunks/framework.CoRJFuj9.js";const k=JSON.parse('{"title":"原生环境","description":"","frontmatter":{},"headers":[],"relativePath":"指南/环境管理/原生环境.md","filePath":"指南/环境管理/原生环境.md","lastUpdated":1721408535000}'),i={name:"指南/环境管理/原生环境.md"},n=t('

    原生环境

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

    bash
    youqu3 -h

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

    比如:

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

    原生环境

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

    bash
    youqu3 -h

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

    比如:

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

    虚拟环境

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

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

    bash
    youqu3 envx

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

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

    youqu3-cargo

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

    bash
    youqu3-cargo run

    youqu3-shell

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

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

    虚拟环境

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

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

    bash
    youqu3 envx

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

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

    youqu3-cargo

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

    bash
    youqu3-cargo run

    youqu3-shell

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

    bash
    $ youqu3-shell
     (my_virtualenv)$ youqu3 run

    youqu3-rm

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

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

    YouQu3

    YouQu3

    YouQu3, Next generation Linux automation testing framework.


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

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

    YouQu3 能做什么?

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

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

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

    YouQu3

    YouQu3

    YouQu3, Next generation Linux automation testing framework.


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

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

    YouQu3 能做什么?

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

    ☑ 🌏 Web UI 自动化测试

    ☑ 🚌 Linux DBus 接口自动化测试

    ☑ 🚀 Linux 命令行自动化测试

    ☑ 🕷️ HTTP 接口自动化测试

    ☑ 🤙️ 。。。无限可能

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

    快速开始

    安装

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

    注意

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

    创建用例工程

    创建一个目录

    bash
    mkdir my_autotest

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

    bash
    cd my_autotest/
    -youqu3 init

    ',11),h=[n];function o(d,c,r,k,u,g){return i(),a("div",null,h)}const y=s(p,[["render",o]]);export{F as __pageData,y as default}; +import{_ as s,c as a,o as i,U as t,aa as e,a7 as l}from"./chunks/framework.DPHCW6-_.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721631998000}'),p={name:"指南/简介/快速开始.md"},h=t('

    快速开始

    安装

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

    注意

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

    创建用例工程

    创建一个目录

    bash
    mkdir my_autotest

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

    bash
    cd my_autotest/
    +youqu3 init

    ',11),n=[h];function o(d,c,k,r,u,b){return i(),a("div",null,n)}const v=s(p,[["render",o]]);export{F as __pageData,v as default}; diff --git "a/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.cQWGMWMJ.lean.js" "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.cQWGMWMJ.lean.js" new file mode 100644 index 0000000..3dd0833 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\347\256\200\344\273\213_\345\277\253\351\200\237\345\274\200\345\247\213.md.cQWGMWMJ.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,U as t,aa as e,a7 as l}from"./chunks/framework.DPHCW6-_.js";const F=JSON.parse('{"title":"快速开始","description":"","frontmatter":{},"headers":[],"relativePath":"指南/简介/快速开始.md","filePath":"指南/简介/快速开始.md","lastUpdated":1721631998000}'),p={name:"指南/简介/快速开始.md"},h=t("",11),n=[h];function o(d,c,k,r,u,b){return i(),a("div",null,n)}const v=s(p,[["render",o]]);export{F as __pageData,v as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" deleted file mode 100644 index 5c4a16e..0000000 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721408535000}'),e={name:"指南/驱动执行/本地执行.md"},p=t("",40),l=[p];function h(n,d,k,o,c,r){return i(),a("div",null,l)}const u=s(e,[["render",h]]);export{g as __pageData,u as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.js" similarity index 87% rename from "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" rename to "assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.js" index ab9d5cf..ce106cb 100644 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.D7xXXuqS.js" +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.js" @@ -1,4 +1,4 @@ -import{_ as s,c as a,o as i,U as t}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721408535000}'),e={name:"指南/驱动执行/本地执行.md"},p=t(`

    本地执行

    子命令

    本地执行子命令为:run

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    用例驱动方式

    执行所有用例

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    指定执行某一个用例

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

    本地执行

    子命令

    本地执行子命令为:run

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    用例驱动方式

    执行所有用例

    bash
    $ youqu3 run
    bash
    $ youqu3-cargo run

    指定执行某一个用例

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

    仅驱动执行这一条用例:

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

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

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

    指定某个目录执行

    shell
    autotest-my-app
    +        ...

    仅驱动执行这一条用例:

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

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

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

    指定某个目录执行

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

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

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

    根据关键词执行

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

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

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

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

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

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

    注意:

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

    根据标签执行

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

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

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

    批量用例ID驱动执行

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

    注意:

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

    指定用例文件路径执行

    指定用例文件

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

    指定用例目录

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

    用例文件、目录组合

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

    注意:

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

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

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

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

    根据关键词执行

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

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

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

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

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

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

    注意:

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

    根据标签执行

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

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

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

    批量用例ID驱动执行

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

    注意:

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

    指定用例文件路径执行

    指定用例文件

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

    指定用例目录

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

    用例文件、目录组合

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

    注意:

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

    `,40),p=[l];function h(n,d,k,o,c,r){return i(),a("div",null,p)}const u=s(e,[["render",h]]);export{F as __pageData,u as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.lean.js" new file mode 100644 index 0000000..127e067 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\346\234\254\345\234\260\346\211\247\350\241\214.md.DxkWigr1.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,U as t}from"./chunks/framework.DPHCW6-_.js";const F=JSON.parse('{"title":"本地执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/本地执行.md","filePath":"指南/驱动执行/本地执行.md","lastUpdated":1721631998000}'),e={name:"指南/驱动执行/本地执行.md"},l=t("",40),p=[l];function h(n,d,k,o,c,r){return i(),a("div",null,p)}const u=s(e,[["render",h]]);export{F as __pageData,u as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" deleted file mode 100644 index b5d25d7..0000000 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721408535000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e('

    自定义执行

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

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

    youqu-tags.txt

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

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

    youqu-tags.txt

    id1 or id2 or id3

    youqu-keywords.txt

    ',8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" deleted file mode 100644 index 979b272..0000000 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.CJzKfzmA.lean.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as t,c as a,o,U as e}from"./chunks/framework.CoRJFuj9.js";const x=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721408535000}'),s={name:"指南/驱动执行/自定义执行.md"},u=e("",8),r=[u];function d(i,c,l,_,n,p){return o(),a("div",null,r)}const q=t(s,[["render",d]]);export{x as __pageData,q as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.js" new file mode 100644 index 0000000..af10c3d --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as t,U as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721631998000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e('

    自定义执行

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

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

    youqu-tags.txt

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

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

    txt
    id1 or id2 or id3

    youqu-keywords.txt

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

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

    txt
    id1 or id2 or id3

    案例

    PMS用例驱动

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

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

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

    执行命令:

    bash
    youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    bash
    youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
    ',18),d=[o];function p(r,n,l,u,h,c){return t(),a("div",null,d)}const y=s(i,[["render",p]]);export{g as __pageData,y as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.lean.js" new file mode 100644 index 0000000..c85b6e3 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\207\252\345\256\232\344\271\211\346\211\247\350\241\214.md.DLLTwyK0.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as t,U as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"自定义执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/自定义执行.md","filePath":"指南/驱动执行/自定义执行.md","lastUpdated":1721631998000}'),i={name:"指南/驱动执行/自定义执行.md"},o=e("",18),d=[o];function p(r,n,l,u,h,c){return t(),a("div",null,d)}const y=s(i,[["render",p]]);export{g as __pageData,y as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.js" new file mode 100644 index 0000000..9e30b6d --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721631998000}'),t={name:"指南/驱动执行/远程执行.md"},p=e('

    远程执行

    子命令

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

    远程执行使用子命令: remote

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

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

    bash
    $ sudo systemctl restart ssh

    远程测试机分组策略

    分组规则

    一对大括号表示一个组:

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

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

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

    执行策略

    规则概述

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

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

    假设总共 100 条用例:

    • group1group2同时执行 100 条
    • group1 包含 2 个测试机,2 个机器瓜分 100 条用例,每个机器执行 50 条
    ',17),l=[p];function o(d,h,n,c,r,u){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.lean.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.lean.js" new file mode 100644 index 0000000..1c14fd1 --- /dev/null +++ "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.sHtTnJxD.lean.js" @@ -0,0 +1 @@ +import{_ as s,c as a,o as i,U as e}from"./chunks/framework.DPHCW6-_.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721631998000}'),t={name:"指南/驱动执行/远程执行.md"},p=e("",17),l=[p];function o(d,h,n,c,r,u){return i(),a("div",null,l)}const b=s(t,[["render",o]]);export{g as __pageData,b as default}; diff --git "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" "b/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" deleted file mode 100644 index 0be82c3..0000000 --- "a/assets/\346\214\207\345\215\227_\351\251\261\345\212\250\346\211\247\350\241\214_\350\277\234\347\250\213\346\211\247\350\241\214.md.tigHGXwZ.js" +++ /dev/null @@ -1 +0,0 @@ -import{_ as s,c as a,o as i,U as e}from"./chunks/framework.CoRJFuj9.js";const g=JSON.parse('{"title":"远程执行","description":"","frontmatter":{},"headers":[],"relativePath":"指南/驱动执行/远程执行.md","filePath":"指南/驱动执行/远程执行.md","lastUpdated":1721408535000}'),t={name:"指南/驱动执行/远程执行.md"},p=e('

    远程执行

    子命令

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

    远程执行使用子命令: remote

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

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

    bash
    $ sudo systemctl restart ssh

    远程测试机分组策略

    分组规则

    一对大括号表示一个组:

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

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

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

    执行策略

    规则概述

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

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

    假设总共 100 条用例:

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

    pdocr-rpc

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

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

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

    1、服务端

    服务端安装

    console
    pip install pdocr-rpc[server]

    服务端启动服务

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

    写入以下内容:

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

    pdocr-rpc

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

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

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

    1、服务端

    服务端安装

    console
    pip install pdocr-rpc[server]

    服务端启动服务

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

    写入以下内容:

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

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

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

    FunnyLog

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

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

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

    安装

    console
    pip install funnylog

    使用方法

    1、自动输出日志

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

    FunnyLog

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

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

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

    安装

    console
    pip install funnylog

    使用方法

    1、自动输出日志

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

    YouQu3 插件汇总信息

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

    YouQu3 插件汇总信息

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

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

    1. 简介

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

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

    2. 工程设计

    2.1. 工程结构

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

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

    1. 简介

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

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

    2. 工程设计

    2.1. 工程结构

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

    UOS 自动化测试用例

    1. 简介

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

    2. 工程设计

    2.1. 工程结构

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

    UOS 自动化测试用例

    1. 简介

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

    2. 工程设计

    2.1. 工程结构

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

    YouQu3 架构设计规划

    1. 背景

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

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

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

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

    等等。

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

    2. 目标

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

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

    价值:

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

    3. 架构设计

    3.1. 总体方案

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

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

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

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

    3.2. 架构设计

    3.3. 整体数据流

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

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

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

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

    3.4. 详细设计

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

    3.4.1. 驱动执行管理

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

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

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

    3.4.2. 配置项管理

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

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

    3.4.3. 框架总线接口

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

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

    3.4.4. 按测试类型管理插件

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

    3.4.5. 环境依赖管理

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

    4. 用例工程设计

    用例工程支持一键创建:

    shell
    $ youqu3 init

    4.1. 用例工程结构

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

    YouQu3 架构设计规划

    1. 背景

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

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

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

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

    等等。

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

    2. 目标

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

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

    价值:

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

    3. 架构设计

    3.1. 总体方案

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

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

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

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

    3.2. 架构设计

    3.3. 整体数据流

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

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

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

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

    3.4. 详细设计

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

    3.4.1. 驱动执行管理

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

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

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

    3.4.2. 配置项管理

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

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

    3.4.3. 框架总线接口

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

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

    3.4.4. 按测试类型管理插件

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

    3.4.5. 环境依赖管理

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

    4. 用例工程设计

    用例工程支持一键创建:

    shell
    $ youqu3 init

    4.1. 用例工程结构

    shell
    autotest-my-case    # 用例工程名称
     ├── case    # 用例层目录
     │   ├── __init__.py
     │   ├── assert_res    # 断言资源
    diff --git "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js" "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.BjaGMZhM.lean.js"
    similarity index 75%
    rename from "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js"
    rename to "assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.BjaGMZhM.lean.js"
    index 8a0a75b..a8667a4 100644
    --- "a/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.B_QMqzr3.lean.js"
    +++ "b/assets/\350\247\204\345\210\222_YouQu3\346\236\266\346\236\204\350\256\276\350\256\241\350\247\204\345\210\222.md.BjaGMZhM.lean.js"
    @@ -1 +1 @@
    -import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.CoRJFuj9.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721408535000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const E=s(e,[["render",k]]);export{u as __pageData,E as default};
    +import{_ as s,c as i,o as a,U as l,ae as n,af as h}from"./chunks/framework.DPHCW6-_.js";const u=JSON.parse('{"title":"YouQu3 架构设计规划","description":"","frontmatter":{"Author":"mikigo"},"headers":[],"relativePath":"规划/YouQu3架构设计规划.md","filePath":"规划/YouQu3架构设计规划.md","lastUpdated":1721631998000}'),e={name:"规划/YouQu3架构设计规划.md"},t=l("",81),p=[t];function k(d,r,o,c,g,y){return a(),i("div",null,p)}const E=s(e,[["render",k]]);export{u as __pageData,E as default};
    diff --git a/hashmap.json b/hashmap.json
    index 5f3c3c2..007fd19 100644
    --- a/hashmap.json
    +++ b/hashmap.json
    @@ -1 +1 @@
    -{"插件_pms测试单驱动.md":"C3RnWS9a","指南_可选功能_html报告.md":"BD0C2PLp","插件_webui自动化.md":"DYY4Enyl","实践_方法开发.md":"D5w4ani5","插件_用例录屏.md":"00QQ8nUD","指南_可选功能_webui自动化.md":"4tGdED5Q","插件_图像识别.md":"CUSgLZyr","指南_可选功能_其他插件.md":"UhOPKbmA","指南_可选功能_远程交互控制.md":"BJD86lKm","插件_键鼠操作.md":"Cd0N2NjF","插件_相对位移定位.md":"BcEKWi6-","index.md":"DHQYfbhW","指南_可选功能_用例录屏.md":"DggQ5HdS","指南_与生俱来_json报告.md":"DRi-K-t9","插件_html测试报告.md":"BO3ILMEt","插件_标签化管理.md":"SKMSpBW6","指南_与生俱来_前后钩子.md":"9jPcVsFG","指南_与生俱来_标签化管理.md":"DOd8Dpk9","指南_与生俱来_远程交互控制.md":"TCPCQR_v","插件_属性识别.md":"BIoism-O","指南_可选功能_gui自动化.md":"CEakJzU1","实践_用例开发.md":"EtGquKvU","插件_插件列表.md":"uvT93bNC","指南_简介_快速开始.md":"DgOYFTsc","指南_可选功能_http自动化.md":"ClcvJbXP","指南_环境管理_虚拟环境.md":"CYH44Dje","规划_uos自动化测试方法套件.md":"1k7ez6Zn","插件_ocr识别.md":"BbvIdL2A","指南_环境管理_原生环境.md":"DxExLQbF","指南_驱动执行_自定义执行.md":"CJzKfzmA","指南_简介_youqu3是什么.md":"Bua1hpcO","指南_与生俱来_动态等待.md":"LG1pIdT8","指南_与生俱来_脚手架工具.md":"DRa5p1HS","插件_dbus操控.md":"B46p_EM-","指南_与生俱来_全自动日志.md":"DAHkI26O","指南_驱动执行_本地执行.md":"D7xXXuqS","指南_可选功能_dbus自动化.md":"DAQ6P4eN","插件_全自动日志.md":"BybnXbQR","规划_uos自动化测试用例.md":"CjduEaF0","指南_驱动执行_远程执行.md":"tigHGXwZ","指南_与生俱来_命令行交互.md":"7SDsZBAk","规划_youqu3架构设计规划.md":"B_QMqzr3","指南_与生俱来_断言语句.md":"DYZkvVDK"}
    +{"指南_可选功能_用例录屏.md":"BTl-QwPF","指南_可选功能_远程交互控制.md":"Di_mii3F","实践_用例开发.md":"DNazKAqh","指南_可选功能_其他插件.md":"DIHBrI0B","指南_可选功能_gui自动化.md":"DL5_OxbD","指南_与生俱来_命令行交互.md":"DGt53oPK","指南_环境管理_虚拟环境.md":"Cje0lGaT","指南_与生俱来_前后钩子.md":"gAnZB4uC","指南_与生俱来_动态等待.md":"Ddzd3DvB","指南_简介_快速开始.md":"cQWGMWMJ","指南_环境管理_原生环境.md":"DTl0iVdm","指南_可选功能_webui自动化.md":"Df5fxio_","指南_可选功能_html报告.md":"CwKyfJ2P","指南_可选功能_dbus自动化.md":"CyB0yQ5u","指南_与生俱来_远程交互控制.md":"DkPsG4Yc","插件_html测试报告.md":"Cll63v3M","指南_与生俱来_断言语句.md":"BMW7n5nx","指南_可选功能_http自动化.md":"BlmKJBRY","插件_pms测试单驱动.md":"DIfYqa2Y","插件_ocr识别.md":"BaITtS8Q","插件_webui自动化.md":"BcYJKkcd","指南_与生俱来_标签化管理.md":"ybzn751_","指南_与生俱来_脚手架工具.md":"COef0uN8","index.md":"DqShbTWU","规划_youqu3架构设计规划.md":"BjaGMZhM","插件_相对位移定位.md":"B2uoPN0f","插件_全自动日志.md":"CIURC7__","实践_方法开发.md":"DrKhzEj9","插件_dbus操控.md":"LyCalTTb","指南_与生俱来_全自动日志.md":"pf-_G9bM","插件_用例录屏.md":"CcZu9v2d","规划_uos自动化测试方法套件.md":"DKCRRhsG","指南_驱动执行_自定义执行.md":"DLLTwyK0","指南_驱动执行_远程执行.md":"sHtTnJxD","插件_键鼠操作.md":"jcIl2AmQ","指南_与生俱来_json报告.md":"Co0iG6_7","插件_图像识别.md":"VeoOW0r7","规划_uos自动化测试用例.md":"CQpRJ8KI","指南_驱动执行_本地执行.md":"DxkWigr1","插件_属性识别.md":"SazIGvfF","指南_简介_youqu3是什么.md":"BbdMxJHl","插件_标签化管理.md":"DaItR4Tn","插件_插件列表.md":"DDEyx3Tf"}
    diff --git a/index.html b/index.html
    index 7ece18c..22d9aab 100644
    --- a/index.html
    +++ b/index.html
    @@ -8,18 +8,18 @@
         
         
         
    -    
    +    
         
    -    
    -    
    -    
    +    
    +    
    +    
         
         
         
       
       
         
    Skip to content

    YouQu3

    Next-Gen Linux Autotest Framework

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

    YouQu3

    Contributors

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

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

调用方法时:

python
DfmWidget.find_app_image("dfm_001")

自动输出的日志:

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

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

日志模板语法

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

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

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

调用方法时:

python
DfmWidget.find_app_image("dfm_001")

自动输出的日志:

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

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

日志模板语法

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

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

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

后置命令行入参钩子

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

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

就像写 Shell 脚本一样即可:

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

- +...

后置命令行入参钩子

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

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

就像写 Shell 脚本一样即可:

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

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

元素识别动态等待

- +sw_64 = 2.5

元素识别动态等待

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

expect交互

python
from youqu3.cmd import RemoteCmd
 
 # TODO
-# RemoteCmd("user", "ip", "password").remote_expect_run("sudo apt install htop")
- +# RemoteCmd("user", "ip", "password").remote_expect_run("sudo apt install htop")
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" index 0c11ac1..5faf188 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\226\255\350\250\200\350\257\255\345\217\245.html" @@ -8,11 +8,11 @@ - + - - - + + + @@ -82,8 +82,6 @@ ) except exceptions.TemplateElementNotFound as exc: raise AssertionError(exc) from exceptions.TemplateElementNotFound - except Exception as exc: - raise exceptions.AssertOptionError(exc) from Exception @classmethod def assert_image_exist_during_time( @@ -107,8 +105,6 @@ pylinuxauto.get_during(widget, screen_time, rate, pause) except exceptions.TemplateElementNotFound as exc: raise AssertionError(exc) from exceptions.TemplateElementNotFound - except Exception as exc: - raise exceptions.AssertOptionError(exc) from Exception @staticmethod def assert_image_not_exist( @@ -146,8 +142,6 @@ pass except exceptions.TemplateElementFound as exc: raise AssertionError(exc) from exceptions.TemplateElementFound - except Exception as exc: - raise exceptions.AssertOptionError(exc) from Exception @staticmethod def assert_file_exist(file_path): @@ -157,7 +151,7 @@ """ logger.info(f"断言文件存在 <{file_path}>") if not os.path.exists(os.path.expanduser(file_path)): - raise AssertionError(f"文件不存在! 路径 {file_path}") + raise AssertionError(f"文件不存在:{file_path}") return True @staticmethod @@ -170,7 +164,7 @@ """ logger.info(f"断言文件不存在 <{file_path}>") if os.path.exists(os.path.expanduser(file_path)): - raise AssertionError(f"文件存在! 路径 {file_path}") + raise AssertionError(f"文件存在:{file_path}") @staticmethod def assert_element_exist(expr): @@ -181,7 +175,7 @@ logger.info(f"断言元素存在<{expr}>") from youqu3.gui import pylinuxauto if not pylinuxauto.find_element_by_attr_path(expr): - raise AssertionError(f"元素不存在!!!expr= <{expr}>") + raise AssertionError(f"元素不存在:{expr}") @staticmethod def assert_element_not_exist(expr): @@ -193,7 +187,7 @@ from youqu3.gui import pylinuxauto try: pylinuxauto.find_element_by_attr_path(expr) - raise AssertionError(f"元素不应存在!!!expr= <{expr}>") + raise AssertionError(f"元素不应该存在:{expr}") except exceptions.ElementNotFound: pass @@ -371,8 +365,8 @@ f"通过OCR识别到不应存在的文案:{dict(res)}", f"{pic if pic else setting.SCREEN_CACHE}", ) - )
- + )
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" index eaf6a74..ceaa20e 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\346\240\207\347\255\276\345\214\226\347\256\241\347\220\206.html" @@ -8,18 +8,18 @@ - + - - - + + + -
Skip to content
📔 阅读量:

标签化管理

使用说明

在 CSV 文件中写入标签:

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

CSV文件与脚本对应关系

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

举例

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

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

特殊标签

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

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

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

跳过用例

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

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

1. 固定跳过

示例:

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

2. 条件判断跳过

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

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

示例:

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

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

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

3.自定义跳过

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

方法编写规范:

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

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

重要

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

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

确认修复

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

示例:

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

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

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

bash
python3 manage.py run --ifixed yes

废弃用例

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

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

文件格式

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

- +
Skip to content
📔 阅读量:

标签化管理

使用说明

在 CSV 文件中写入标签:

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

CSV文件与脚本对应关系

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

举例

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

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

特殊标签

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

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

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

跳过用例

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

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

1. 固定跳过

示例:

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

2. 条件判断跳过

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

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

示例:

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

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

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

3.自定义跳过

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

方法编写规范:

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

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

重要

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

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

确认修复

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

示例:

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

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

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

bash
python3 manage.py run --ifixed yes

废弃用例

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

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

文件格式

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

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" index 3007e35..050ad31 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\204\232\346\211\213\346\236\266\345\267\245\345\205\267.html" @@ -3,23 +3,24 @@ - YouQu3 | Next-Gen Linux Autotest Framework + 脚手架工具 | YouQu3 | Next-Gen Linux Autotest Framework - + - - - + + + - - +
Skip to content
📔 阅读量:

脚手架工具

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

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

+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" index ef4b04e..5fb83af 100644 --- "a/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" +++ "b/\346\214\207\345\215\227/\344\270\216\347\224\237\344\277\261\346\235\245/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" @@ -8,11 +8,11 @@ - + - - - + + + @@ -45,8 +45,8 @@ user="uos", ip="10.8.7.55", password="1", - ).click_dde_file_manager_by_attr()
- + ).click_dde_file_manager_by_attr()
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" index be84595..1ed576d 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/DBus\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" index dca4c84..ee4f477 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/GUI\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" index ff039de..1555d67 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTML\346\212\245\345\221\212.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" index d834cd8..cb83ada 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/HTTP\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" index f5e57a4..8519436 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/WebUI\350\207\252\345\212\250\345\214\226.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" index 9c5f3a4..c34cbc1 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\345\205\266\344\273\226\346\217\222\344\273\266.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" index d1bc1e8..e445a68 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\347\224\250\344\276\213\345\275\225\345\261\217.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" index 7bc2ada..db596e5 100644 --- "a/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" +++ "b/\346\214\207\345\215\227/\345\217\257\351\200\211\345\212\237\350\203\275/\350\277\234\347\250\213\344\272\244\344\272\222\346\216\247\345\210\266.html" @@ -8,18 +8,18 @@ - + - - - + + + - - + + \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" index f97792f..6059191 100644 --- "a/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" +++ "b/\346\214\207\345\215\227/\347\216\257\345\242\203\347\256\241\347\220\206/\345\216\237\347\224\237\347\216\257\345\242\203.html" @@ -8,18 +8,18 @@ - + - - - + + + -
Skip to content
📔 阅读量:

原生环境

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

bash
youqu3 -h

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

比如:

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

原生环境

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

bash
youqu3 -h

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

比如:

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

虚拟环境

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

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

bash
youqu3 envx

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

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

youqu3-cargo

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

bash
youqu3-cargo run

youqu3-shell

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

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

youqu3-rm

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

- +(my_virtualenv)$ youqu3 run

youqu3-rm

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

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

YouQu3

YouQu3

YouQu3, Next generation Linux automation testing framework.


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

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

YouQu3 能做什么?

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

☑ 🌏 Web UI 自动化测试

☑ 🚌 Linux DBus 接口自动化测试

☑ 🚀 Linux 命令行自动化测试

☑ 🕷️ HTTP 接口自动化测试

☑ 🤙️ 。。。无限可能

- +
Skip to content
📔 阅读量:

YouQu3

YouQu3

YouQu3, Next generation Linux automation testing framework.


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

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

YouQu3 能做什么?

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

☑ 🌏 Web UI 自动化测试

☑ 🚌 Linux DBus 接口自动化测试

☑ 🚀 Linux 命令行自动化测试

☑ 🕷️ HTTP 接口自动化测试

☑ 🤙️ 。。。无限可能

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

快速开始

安装

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

注意

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

创建用例工程

创建一个目录

bash
mkdir my_autotest

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

bash
cd my_autotest/
-youqu3 init

- +
Skip to content
📔 阅读量:

快速开始

安装

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

注意

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

创建用例工程

创建一个目录

bash
mkdir my_autotest

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

bash
cd my_autotest/
+youqu3 init

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

本地执行

子命令

本地执行子命令为:run

bash
$ youqu3 run
bash
$ youqu3-cargo run

用例驱动方式

执行所有用例

bash
$ youqu3 run
bash
$ youqu3-cargo run

指定执行某一个用例

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

本地执行

子命令

本地执行子命令为:run

bash
$ youqu3 run
bash
$ youqu3-cargo run

用例驱动方式

执行所有用例

bash
$ youqu3 run
bash
$ youqu3-cargo run

指定执行某一个用例

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

仅驱动执行这一条用例:

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

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

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

指定某个目录执行

shell
autotest-my-app
+        ...

仅驱动执行这一条用例:

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

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

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

指定某个目录执行

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

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

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

根据关键词执行

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

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

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

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

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

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

注意:

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

根据标签执行

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

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

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

批量用例ID驱动执行

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

注意:

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

指定用例文件路径执行

指定用例文件

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

指定用例目录

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

用例文件、目录组合

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

注意:

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

- +│   └── test_mycase_002.py

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

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

根据关键词执行

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

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

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

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

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

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

注意:

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

根据标签执行

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

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

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

批量用例ID驱动执行

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

注意:

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

指定用例文件路径执行

指定用例文件

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

指定用例目录

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

用例文件、目录组合

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

注意:

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

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

自定义执行

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

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

youqu-tags.txt

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

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

youqu-tags.txt

id1 or id2 or id3

youqu-keywords.txt

- +
Skip to content
📔 阅读量:

自定义执行

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

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

youqu-tags.txt

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

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

txt
id1 or id2 or id3

youqu-keywords.txt

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

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

txt
id1 or id2 or id3

案例

PMS用例驱动

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

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

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

执行命令:

bash
youqu3 run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
bash
youqu3-cargo run --job-start "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx" --job-end "pms-driver --task-id 123456 --pms-user ut001234 --pms-password xxxx --send2pms"
+ \ No newline at end of file diff --git "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" index 204adad..130b32b 100644 --- "a/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" +++ "b/\346\214\207\345\215\227/\351\251\261\345\212\250\346\211\247\350\241\214/\350\277\234\347\250\213\346\211\247\350\241\214.html" @@ -8,18 +8,18 @@ - + - - - + + + -
Skip to content
📔 阅读量:

远程执行

子命令

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

远程执行使用子命令: remote

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

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

bash
$ sudo systemctl restart ssh

远程测试机分组策略

分组规则

一对大括号表示一个组:

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

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

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

执行策略

规则概述

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

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

假设总共 100 条用例:

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

远程执行

子命令

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

远程执行使用子命令: remote

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

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

bash
$ sudo systemctl restart ssh

远程测试机分组策略

分组规则

一对大括号表示一个组:

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

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

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

执行策略

规则概述

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

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

假设总共 100 条用例:

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

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

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

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

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

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

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

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

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

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

2.5、其他参数

  • 识别语言

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

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

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

    similarity: float

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

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

    return_default: bool

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

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

    return_first: bool

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

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

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

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

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

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

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

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

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

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

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

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

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

2.5、其他参数

  • 识别语言

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

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

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

    similarity: float

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

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

    return_default: bool

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

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

    return_first: bool

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

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

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

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

    • CLASS_NAME_STARTSWITH 类名以什么开头;

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

    • CLASS_NAME_CONTAIN 类名包含什么字符;

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

  • CLASS_NAME_CONTAIN 类名包含什么字符;

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

    YouQu3 插件汇总信息

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

    YouQu3 插件汇总信息

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

    2.2. 方案说明

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

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

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

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

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

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

    3. 套件发布

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

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

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

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

      安装:

      shell
      pip install umtk

      使用:

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

    4. 套件维护

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

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

    5. 对套件的测试

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

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

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

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

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

    亦各从其志也。

    使用的框架不同

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

    内容、范围、业务不同

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

    代码一致性

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

    2.2. 方案说明

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

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

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

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

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

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

    3. 套件发布

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

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

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

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

      安装:

      shell
      pip install umtk

      使用:

      python
      from umtk.dde_file_manager import DdeFileManagerMethod

    4. 套件维护

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

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

    5. 对套件的测试

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

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

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

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

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

    亦各从其志也。

    使用的框架不同

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

    内容、范围、业务不同

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

    代码一致性

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

    2.2. 方案说明

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

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

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

    4.2.4. 配置对象

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

    4.2.5. 用例标签管理文件

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

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

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

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

    4.2.7. 依赖管理文件

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

    4.2.8. 调试用例驱动

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

    5. 演进规划

    可视化配置

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

    非开发者下运行

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

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

    过程钩子

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

    - + self.assert_**

    4.2.4. 配置对象

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

    4.2.5. 用例标签管理文件

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

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

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

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

    4.2.7. 依赖管理文件

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

    4.2.8. 调试用例驱动

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

    5. 演进规划

    可视化配置

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

    非开发者下运行

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

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

    过程钩子

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

    + \ No newline at end of file