uiautomator2常见定位报错问题

uiautomator2常见定位报错问题

  1. 报错“找不到某元素”,源代码

    	u(text="设置").click()
    

    问题:由于点击后没有给页面反应时间,立马判断了是否存在某元素
    解决方案1:

    	import time
    	time.sleep(10) # 等待10s后,再去执行接下来的操作
    	u(text="设置").click()
    

    解决方案2:

    		import time
    		u(text="设置").click(timeout=10) # 需要保证在10s的时间内去点击设置
    

    问题:由于没有没有该元素,才导致的错误;需要提前判断是否存在
    解决方案3:

            time.sleep(5) # 等待5s找到“设置”
            if u(text="设置").exists:
                u(text="设置").click()
    
  2. 报错连接多个设备时,无法识别操作的哪台设备
    问题:执行adb 命令时,需要识别操作的设备号
    解决方案:

    	# 获取多个设备序列号
    	def attachDeviceList():
    	    device_list = []
    	    cmd_output = os.popen("adb devices", "r").read().split()[4:]  # 用空格作为分隔符,从输出的列表中第5个开始为设备序列号,将后面所有内容全部输出,['List', 'of', 'devices', 'attached', '序列号', 'device']
    	    for i in range(len(cmd_output)):
    	        if i % 2 == 0:
    	            device_list.append(cmd_output[i])  # 将提取出来的序列号加入到device_list列表中
    	    if device_list:  
    	        print(device_list)
    	        return device_list
    	    else:
    	        return print("No device found.")
    
    
    if __name__ == '__main__':
            try:
                u = ut2.connect_usb()
                while True:
                    for series in attachDeviceList():
                        print("此设备是 :", series)
                        # 针对单个设备执行 summary_start()
                        summary_start(series, u)
            except Exception as e:
                print(e)
    
  3. 报错 不同机型所需要点击的位置不同,也无法找到相同的定位位置
    问题:找不到相同的定位位置,无法实现机型覆盖
    解决方案:利用手机系统的不同,针对性解决

    	system_version = os.popen("adb shell getprop ro.build.version.release", "r").read().rstrip()
    	if system_version in ['5.1']:
    		# 手机是5.1系统,则...
    		pass
    	elif system_version in ['6.0.1']:
    		# 手机是6.0.1系统,则...
    		pass
    	elif system_version in ['10']:
    		# 手机是10系统,则...
    		pass
    
  4. 报错 针对厂商自动化装包时(oppo/vivo),由于会有“取消”和“安装”按钮,无法通过命令‘adb install ’直接安装成功
    问题:无法执行‘adb install ’时,同时执行点击操作
    解决方案:引入线程,一边 执行‘adb install ’,一边 执行点击操作

    # encoding: utf-8
    import os
    import threading
    import time
    
    # 手机安装atx的apk
    def init_uiautomator2():
        os.system("python -m uiautomator2 init")
        time.sleep(5)
    
    # 安装执行‘adb install ’
    def install_apk(packagePath, series):
        os.system("adb -s " + series + " install  " + packagePath)
    
    # 安装执行点击操作
    def click_apk(series, u):
        u(text="安装").click(timeout=10)
        time.sleep(5)
        u(text="打开").click(timeout=10)
        time.sleep(5)
    
    # 引入线程,一边 执行‘adb install ’,一边 执行点击操作 
    def single_start(packagePath, series,u):
        threads = []  # 使用线程操作,添加线程队列
        t1 = threading.Thread(target=install_apk, args=[packagePath, series])  # 装载线程
        threads.append(t1)
        t2 = threading.Thread(target=click_apk, args=[series, u])
        threads.append(t2)
        for t in threads:  # 对线程列表进行操作
            t.setDaemon(True)
            t.start()
            time.sleep(30)
    
    if __name__ == '__main__':
        init_uiautomator2()
        u = ut2.connect_usb()
        try:
            while True:
                for series in attachDeviceList():
                    print("此设备是 :", series)
                    single_start(packagePath, series, u)
        except Exception as e:
            print(e)
    

你可能感兴趣的:(自动化工具)