安装uiautomator2时超时,终于解决拉

博主通过命令`pip install uiautomator2 -i SimpleIndex`成功解决了在安装过程中遇到的HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out错误。参考了相关博客文章找到了解决方案。
页面信息: 这是某一个按钮未展开情况下的信息: <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="2424"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="0" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.LinearLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/action_bar_root" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <androidx.appcompat.widget.LinearLayoutCompat index="0" package="com.brother.ptouch.iprintandlabel" class="androidx.appcompat.widget.LinearLayoutCompat" text="" resource-id="com.brother.ptouch.iprintandlabel:id/parentPanel" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/customPanel" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/custom" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.LinearLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,1075]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.view.ViewGroup index="0" package="com.brother.ptouch.iprintandlabel" class="android.view.ViewGroup" text="" resource-id="com.brother.ptouch.iprintandlabel:id/print_option_toolbar" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][1080,289]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.ImageButton index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.ImageButton" text="" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,142][147,289]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.TextView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Print Options" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[189,180][511,251]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.Button index="2" package="com.brother.ptouch.iprintandlabel" class="android.widget.Button" text="PRINT" resource-id="com.brother.ptouch.iprintandlabel:id/printer_option_printer" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[849,152][1080,278]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.view.ViewGroup> <android.widget.ScrollView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.ScrollView" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,289][1080,1075]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.LinearLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,289][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.RelativeLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.RelativeLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_print_lay" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,289][1080,484]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.TextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Printer" resource-id="com.brother.ptouch.iprintandlabel:id/option_printer_title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,331][152,382]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.TextView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="PT-P950NW(Not connected)" resource-id="com.brother.ptouch.iprintandlabel:id/option_printer_name" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="true" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,382][1038,439]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.view.View index="2" package="com.brother.ptouch.iprintandlabel" class="android.view.View" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,460][1038,463]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.RelativeLayout> <android.widget.RelativeLayout index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.RelativeLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_resolution_lay" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,484][1080,685]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.TextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Resolution" resource-id="com.brother.ptouch.iprintandlabel:id/option_resolution_title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,526][216,577]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.Spinner index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.Spinner" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_resolution_options" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="true" selected="false" bounds="[42,577][1038,640]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.TextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Normal" resource-id="com.brother.ptouch.iprintandlabel:id/resolution_spinner_txtV" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="true" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,580][912,637]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.Spinner> <android.view.View index="2" package="com.brother.ptouch.iprintandlabel" class="android.view.View" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,661][1038,664]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.RelativeLayout> <android.widget.RelativeLayout index="2" package="com.brother.ptouch.iprintandlabel" class="android.widget.RelativeLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_copies_lay" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,685][1080,880]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_copies" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,685][1038,880]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.RelativeLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.RelativeLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,685][1038,880]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.TextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Copies" resource-id="com.brother.ptouch.iprintandlabel:id/option_title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,727][156,778]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.TextView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="1" resource-id="com.brother.ptouch.iprintandlabel:id/option_number" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,778][786,835]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" multiline="true" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" max-text-length="2" content-invalid="false" /> <android.view.View index="2" package="com.brother.ptouch.iprintandlabel" class="android.view.View" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,856][786,859]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.ImageView index="3" package="com.brother.ptouch.iprintandlabel" class="android.widget.ImageView" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_down" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[786,754][912,880]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="4" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.ImageView index="4" package="com.brother.ptouch.iprintandlabel" class="android.widget.ImageView" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_up" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[912,754][1038,880]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="5" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.RelativeLayout> </android.widget.FrameLayout> </android.widget.RelativeLayout> <android.widget.RelativeLayout index="3" package="com.brother.ptouch.iprintandlabel" class="android.widget.RelativeLayout" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_cut_lay" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,880][1080,1075]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="9" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.TextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="Cut Options" resource-id="com.brother.ptouch.iprintandlabel:id/option_cut_title" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,922][912,973]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.TextView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.TextView" text="No setting" resource-id="com.brother.ptouch.iprintandlabel:id/option_cut_options" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="true" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,973][912,1030]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.view.View index="2" package="com.brother.ptouch.iprintandlabel" class="android.view.View" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,1051][912,1054]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="3" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.ImageView index="3" package="com.brother.ptouch.iprintandlabel" class="android.widget.ImageView" text="" resource-id="com.brother.ptouch.iprintandlabel:id/option_cut_expand" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[912,949][1038,1075]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="4" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.RelativeLayout> </android.widget.LinearLayout> </android.widget.ScrollView> </android.widget.LinearLayout> </android.widget.FrameLayout> </android.widget.FrameLayout> </androidx.appcompat.widget.LinearLayoutCompat> </android.widget.FrameLayout> </android.widget.FrameLayout> </android.widget.FrameLayout> </android.widget.LinearLayout> </android.widget.FrameLayout> </hierarchy> 这是展开组件后的信息: <?xml version='1.0' encoding='UTF-8' standalone='yes' ?> <hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="2424"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,577][912,829]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="0" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.FrameLayout index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,577][912,829]" displayed="true" a11y-important="false" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.ListView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.ListView" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,577][912,829]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false"> <android.widget.CheckedTextView index="0" package="com.brother.ptouch.iprintandlabel" class="android.widget.CheckedTextView" text="Normal" resource-id="android:id/text1" checkable="true" checked="true" clickable="true" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,577][912,703]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="1" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> <android.widget.CheckedTextView index="1" package="com.brother.ptouch.iprintandlabel" class="android.widget.CheckedTextView" text="High" resource-id="android:id/text1" checkable="true" checked="false" clickable="true" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[42,703][912,829]" displayed="true" a11y-important="true" screen-reader-focusable="false" drawing-order="2" showing-hint="false" text-entry-key="false" dismissable="false" a11y-focused="false" heading="false" live-region="0" context-clickable="false" content-invalid="false" /> </android.widget.ListView> </android.widget.FrameLayout> </android.widget.FrameLayout> </hierarchy> 展开后的内容可能动态浮层的形式,增加1.写一个函数判断当前是否有浮层存在 2.定位获取新加载的元素并用于点击 3.参考def safe_select_from_spinner(self, spinner_id, target_text): """ 安全选择 Spinner 中的某个选项 """ try: # 1. 点击 Spinner 展开 spinner = self.driver.find_element(AppiumBy.ID, spinner_id) spinner.click() print(f"👉 已点击下框: {spinner_id}") # 2. 等待浮层中的选项出现 option_xpath = f"//android.widget.CheckedTextView[@text='{target_text}']" target_option = WebDriverWait(self.driver, 5).until( EC.element_to_be_clickable((AppiumBy.XPATH, option_xpath)) ) # 3. 点击目标选项 target_option.click() print(f"✅ 成功选择: {target_text}") return True except TimeoutException: print(f"❌ 超时:未找到选项 '{target_text}'") return False except Exception as e: print(f"❌ 操作失败: {e}") return False 修改我的现有代码,要求不丢失现有功能 from appium import webdriver from appium.options.android import UiAutomator2Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException, NoSuchElementException, ElementNotInteractableException import time # ==================== 目标应用配置 ==================== TARGET_PACKAGE = "com.brother.ptouch.iprintandlabel" TARGET_ACTIVITY = ".module.home.home.HomeActivity" # 主页 Activity MAX_RESTORE_ATTEMPTS = 2 MAX_HISTORY_REPEAT = 3 # ==================== 配置 Appium Options ==================== def create_driver(): options = UiAutomator2Options() options.set_capability("platformName", "Android") options.set_capability("deviceName", "emulator-5554") options.set_capability("automationName", "UiAutomator2") options.set_capability("noReset", True) options.set_capability("fullReset", False) options.set_capability("autoGrantPermissions", True) options.set_capability("newCommandTimeout", 600) options.set_capability("appPackage", TARGET_PACKAGE) options.set_capability("appActivity", TARGET_ACTIVITY) driver = webdriver.Remote('http://localhost:4723', options=options) return driver class AndroidAppExplorer: def __init__(self, driver): self.driver = driver self.wait = WebDriverWait(driver, 10) self.clicked_identifiers = set() self.recovery_history = [] self.restore_attempt_count = 0 def get_current_state(self): try: current_package = self.driver.current_package current_activity = self.driver.current_activity return current_package, current_activity except: return None, None def is_in_target_app(self): pkg, _ = self.get_current_state() return pkg == TARGET_PACKAGE def wait_for_page_load(self, timeout=10): """等待页面加载完成""" try: WebDriverWait(self.driver, timeout).until( EC.presence_of_element_located(( 'xpath', '//android.view.ViewGroup[@displayed="true"] | ' '//android.widget.FrameLayout[@displayed="true"]' )) ) time.sleep(1) except Exception as e: print(f"⚠️ 页面等待超时或出错: {e}") def ensure_in_target_app(self): current_pkg, current_act = self.get_current_state() if not self.is_in_target_app(): print(f"⚠️ 当前不在目标应用 ({current_pkg}/{current_act}),正在尝试恢复...") current_key = (current_pkg, current_act) recent_entries = self.recovery_history[-10:] if recent_entries.count(current_key) >= MAX_HISTORY_REPEAT: print(f"🛑 已多次回到 {current_key},疑似陷入循环,停止恢复。") return False self.recovery_history.append(current_key) # 方法1:back 返回 if self.restore_attempt_count < MAX_RESTORE_ATTEMPTS: try: self.driver.back() time.sleep(1.5) if self.is_in_target_app(): print("✅ 通过 back 成功返回目标 App") self.restore_attempt_count = 0 self.wait_for_page_load(10) return True except: pass # 方法2:activate_app if self.restore_attempt_count < MAX_RESTORE_ATTEMPTS: try: self.driver.activate_app(TARGET_PACKAGE) print("🔁 正在通过 activate_app 恢复...") time.sleep(2) self.wait_for_page_load(10) if self.is_in_target_app(): print("✅ 成功激活目标 App") self.restore_attempt_count = 0 return True except Exception as e: print(f"❌ activate_app 失败: {e}") # 方法3:冷重启 if self.restore_attempt_count >= MAX_RESTORE_ATTEMPTS: try: print("💀 执行冷重启...") self.driver.terminate_app(TARGET_PACKAGE) time.sleep(2) self.driver.activate_app(TARGET_PACKAGE) time.sleep(5) self.wait_for_page_load(10) if self.is_in_target_app(): print("✅ 冷重启成功") self.restore_attempt_count = 0 return True except Exception as e: print(f"❌ 冷重启失败: {e}") self.restore_attempt_count += 1 if self.restore_attempt_count > 5: print("🛑 恢复尝试过多,终止运行") return False return True else: self.recovery_history.append((current_pkg, current_act)) self.wait_for_page_load(1) return True def get_element_identifier(self, element): try: attrs = [ element.get_attribute("resource-id") or "", element.get_attribute("text") or "", element.get_attribute("content-desc") or "", element.tag_name or "" ] return "/".join([a for a in attrs if a.strip()]) except: return "unknown_element" def find_clickable_elements(self): xpath = """ //*[(@clickable='true' or @focusable='true') and @displayed='true' and @enabled='true'] """ try: elements = self.driver.find_elements('xpath', xpath) return [e for e in elements if e.is_displayed()] except Exception as e: print(f"❌ 查找元素失败: {e}") return [] def classify_elements(self, elements): bottom_nav_container = "com.brother.ptouch.iprintandlabel:id/bottomNavigationView" nav_ids = [ "com.brother.ptouch.iprintandlabel:id/navigation_my_label", "com.brother.ptouch.iprintandlabel:id/navigation_setting", "com.brother.ptouch.iprintandlabel:id/navigation_buy" ] nav_elements = [] non_nav_elements = [] for elem in elements: try: res_id = elem.get_attribute("resource-id") or "" content_desc = elem.get_attribute("content-desc") or "" text = elem.get_attribute("text") or "" if (res_id == bottom_nav_container or res_id in nav_ids or content_desc in ["My Labels", "Settings", "Shop"]): nav_elements.append(elem) else: non_nav_elements.append(elem) except Exception as e: print(f"⚠️ 分类元素异常: {e}") continue return nav_elements, non_nav_elements def handle_alert_popup(self): alert_xpath = "//*[contains(@text, 'OK') or contains(@text, '允许') or contains(@text, 'Allow')]" try: button = self.driver.find_element('xpath', alert_xpath) if button.is_displayed(): button.click() print("✅ 自动处理了弹窗") time.sleep(1) except: pass def is_interactive_input(self, element): """判断是否为可视且可交互的输入框""" try: if not element.is_displayed(): return False focusable = element.get_attribute("focusable") == "true" enabled = element.get_attribute("enabled") == "true" clazz = element.get_attribute("className") or "" is_edit_type = any(kw in clazz for kw in ["EditText", "TextInput"]) return focusable and enabled and is_edit_type except: return False def handle_input_field(self, input_elem): """处理输入框:显示提示、当前值,并让用户手动输入后读取结果""" hint = input_elem.get_attribute("hint") or "null" current_text = input_elem.get_attribute("text") or "" print(f"\n🔍 发现输入框") if hint != "null": print(f" 提示: '{hint}'") if current_text: print(f" 当前文本: '{current_text}'") print("请在设备上手动输入内容(3秒内完成)...") time.sleep(3) try: entered_value = input_elem.get_attribute("text") or "" # ✅ 使用 text 而非 value except: entered_value = "" print(f"📝 用户在输入框中输入的内容为: '{entered_value}'") def click_element_safely(self, element): try: identifier = self.get_element_identifier(element) if identifier in self.clicked_identifiers: return False try: self.driver.execute_script("arguments[0].scrollIntoView(true);", element) except: pass time.sleep(0.5) element.click() print(f"🟢 点击成功: {identifier}") self.clicked_identifiers.add(identifier) time.sleep(1.5) return True except Exception as e: print(f"🔴 点击失败 {self.get_element_identifier(element)}: {str(e)}") return False def explore_page(self): print("\n🔄 开始探索当前页面...") while True: if not self.ensure_in_target_app(): print("❌ 无法恢复至目标应用,退出。") break self.handle_alert_popup() elements = self.find_clickable_elements() if not elements: print("📭 当前页面无可点击元素。") try: self.driver.back() print("🔙 返回上一页...") time.sleep(2) continue except: break nav_elements, non_nav_elements = self.classify_elements(elements) print(f"📌 导航栏元素数量: {len(nav_elements)}, 非导航栏元素数量: {len(non_nav_elements)}") # === 第一阶段:优先点击导航栏元素 === navigated = False for elem in nav_elements: if self.is_interactive_input(elem): self.handle_input_field(elem) continue if self.click_element_safely(elem): navigated = True break if navigated: continue # === 第二阶段:点击非导航栏元素 === any_clicked = False for elem in non_nav_elements: if self.is_interactive_input(elem): self.handle_input_field(elem) continue if self.click_element_safely(elem): any_clicked = True break if not any_clicked: print("✅ 当前页面所有可点击元素已处理完毕。") try: self.driver.back() print("🔙 返回上一页继续探索...") time.sleep(2) except: print("🔚 无法返回,探索结束。") break time.sleep(1) def run(self): print("🚀 启动 Android 应用探索器...") try: self.explore_page() except KeyboardInterrupt: print("\n👋 用户中断执行。") except Exception as e: print(f"💥 执行过程中发生错误: {type(e).__name__}: {e}") finally: print("🔚 自动化结束。") # =============== 主程序入口 =============== if __name__ == "__main__": driver = create_driver() explorer = AndroidAppExplorer(driver) try: explorer.run() finally: driver.quit()
最新发布
10-17
### uiautomator2 安装或使用过程中的读取超时解决方案 在使用 `uiautomator2` 进行 Android 自动化测试的过程中,如果遇到安装或使用阶段的读取超时问题,可以尝试以下方法来解决问题。 #### 调整超时设置 Appium 或其他框架在未接收到下一条指令会有默认的超时间(通常为 60 秒),这可能导致 session 断开并引发后续操作失败。通过修改 `capabilities` 中的 `newCommandTimeout` 参数,延长超时间能够有效缓解这一问题[^1]。例如: ```python capabilities = { 'automationName': 'UiAutomator2', 'newCommandTimeout': "3600", # 将超时间调整为更长的间,单位为秒 } host = "http://localhost:4723/wd/hub" driver = webdriver.Remote(host, capabilities) ``` #### 使用智能等待机制 为了进一步提升稳定性,在脚本设计中应避免使用固定的休眠间(如 `time.sleep()`)。推荐采用 Selenium 的显式等待策略——`WebDriverWait` 来动态监控页面加载状态或其他条件完成情况[^2]。以下是示例代码片段: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, timeout=30).until( EC.presence_of_element_located((By.ID, "example_id")) ) ``` 此方式不仅提高了效率还增强了程序健壮性。 #### 验证 Minicap 截图服务运行状况 当利用 UiAutomator2 执行某些特定功能比如屏幕捕获,可能依赖于后台 minicap service 正常运作。因此有必要确认其是否被成功部署以及能否正常响应请求[^3]。可以通过如下步骤排查潜在障碍: 1. **检查设备端口映射** 确认本地主机与目标 android 设备之间建立了正确的tcp连接。 ```bash adb forward tcp:1717 localabstract:minicap ``` 2. **手动启动Minicap进程** 如果发现minicap未能自行激活,则需借助ADB命令主动触发它,并指定恰当参数适配当前分辨率需求 ```bash adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P <source_width>x<source_height>@<dest_width>x<dest_height>/<rotation> ``` 以上措施综合运用有助于克服因网络延迟等原因造成的读写瓶颈现象。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值