各位在自动化通过 adb install 或者 pm install 的时候,有没有遇到过华为或者小米或者一加手机的各种安装弹窗呢,除了手动设置,该如何解决呢?
目前自动化主流框架,python uiautomator2 或者 appuim 等在执行测试的时候会自动给手机安装 atx 或者 appuim 引擎,但是如果不手动的点击允许,那么会导致测试失败,这种情况改如果处理呢?
下面提供一种多线程的解决方案,亲测可行
1 个线程执行安装命令,另一个线程通过 dump ui 的方式获取 xml 文件,在通过解析 xml 文件的节点,获取文本,然后遍历 xml,如果存在弹窗,通过 adb 点击坐标点处理掉弹窗上的文本即可
th1 = threading.Thread(target=install_app, args=(id, apk_path))
th2 = threading.Thread(target=click_pop_window_by_xml, args=(id, '继续安装'))
th1.start()
th2.start()
th1.join()
th2.join()
def click_pop_window_by_xml(id, expect_text):
# ------------------------
# 由于处理系统安装弹窗,由于ATX UI架构会安装两个apk
# 安装apk的时候会自动弹窗,所以提前通过adb处理掉
# ------------------------
print('开始处理弹窗',threading.current_thread().getName())
nodes = parse_page_xml(id)
if nodes is None:
return
raise XPathElementNotFoundError("get xml file error")
for node in nodes:
actual_text = node.getAttribute('text').encode('utf-8').decode('utf-8')
x, y = get_node_bounds(node)
if expect_text == actual_text:
print('处理弹窗', actual_text)
click_by_adb(id, x, y)
break