import time from time import sleep from appium import webdriver from PIL import Image #图像处理库,用来截图的 import os from appium.webdriver.common.appiumby import AppiumBy from selenium.webdriver.ie.webdriver import WebDriver from selenium.webdriver.support.wait import WebDriverWait import cv2 import subprocess #用来启动和停止adb logcat #----------------------------------------------------- #----------------------------------------------------- #-----------------------------------------------------休眠拉流前板,如果前板超时未出图后,拉流后板直播画面------------------------ #----------------------------------------------------- #----------------------------------------------------- #启动adb logcat #logcat_process = subprocess.Popen(['adb', 'logcat', '-v', 'time'], stdout=open('./picture/logcat_output.txt', 'w')) # 配置 Desired Capabilities desired_caps = { 'platformName': 'Android', # 或者 'iOS' 'platformVersion': '10', # 安卓版本 #'deviceName': '10AD5C3BZA001FG', # 设备ID或名称 #'appPackage': 'com.example.hassecurity', #'appActivity': 'com.example.hassecurity.MainActivity', 'appPackage': 'cn.com.hichs.hassecurity', 'appActivity': 'com.example.hassecurity.MainActivity', 'automationName': 'UiAutomator2', # 'app': 'D:/123/app-release.apk', # Flutter APK 的路径 #'automationName': 'Flutter', # 指定使用 Flutter 驱动,appium2.x不在支持了 'noReset': True , # 避免每次打开APP都重置应用状态 #'adbLogCat': True,#启动logcat } # 启动 Appium 驱动 i=1 driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps) while True: #driver.press_keycode(3) driver = webdriver.Remote("http://localhost:4723/wd/hub", desired_caps) sleep(1) threshold = 80#设置图像验证阙值 try: for i in range(1,1000): sleep(1) xium_time = time.time() p = 0 while True: # 截取整个屏幕的截图并保存 sleep(12) screenshot_path = r"D:\hassecutrity\hassecutrityAuto\picture\quauping2.png" sleep(1) driver.get_screenshot_as_file(screenshot_path) # 加载截图 image = Image.open(screenshot_path) # 定义要截取的区域(left, top, right, bottom) left = 55 # 左上角 X 坐标 top = 789 # 左上角 Y 坐标 right = 393 # 右下角 X 坐标 bottom = 851 # 右下角 Y 坐标 # 裁剪出指定范围的区域 cropped_image = image.crop((left, top, right, bottom)) # 保存裁剪后的图片 cropped_image_path = r"D:\hassecutrity\hassecutrityAuto\picture\dormancy2.png" cropped_image.save(cropped_image_path) #将用来对比的图片进行赋值 reference_image1 = cv2.imread('./picture/dormancy.png') reference_image2 = cv2.imread('./picture/dormancy2.png') # 计算图像差异 mse = ((reference_image1 - reference_image2) ** 2).mean() print(mse) if 1= 34: print("卡死") driver.back() #driver.press_keycode(3) sleep(2) try: # WebDriverWait(driver, 2, 0.1).until( # lambda x: driver.find_element(AppiumBy.ID, "android:id/aerr_close")) # driver.find_element(AppiumBy.ID, "android:id/aerr_close").click() # sleep(2) driver.find_element(AppiumBy.ACCESSIBILITY_ID, "玲珑有智").click() except Exception as e: #需要加一个except防止代码执行内部try报错后再执行finally后会直接进入最外层try-except模块中的except中 print(f"错误: {e}") try: driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() except: driver.tap([(343, 525)]) sleep(1) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() finally: True finally: True #sleep(2) #driver.tap([(613,395)]) start_time = time.time() driver.tap([(343, 525)]) sleep(2) assert driver.find_element(AppiumBy.ACCESSIBILITY_ID,"录制") exit_flag = False #开始点击预览加载出图 while True: # 截取整个屏幕的截图并保存 wucha1_time = time.time() screenshot_path = r"D:\hassecutrity\hassecutrityAuto\picture\quauping3.png" driver.get_screenshot_as_file(screenshot_path) # 加载截图 image = Image.open(screenshot_path) # 裁剪出直播画面(left, top, right, bottom) left = 37 # 左上角 X 坐标 top = 258 # 左上角 Y 坐标 right = 666 # 右下角 X 坐标 bottom = 633 # 右下角 Y 坐标 # 裁剪出指定范围的区域 cropped_image = image.crop((left, top, right, bottom)) # 保存裁剪后的图片 cropped_image_path = r"D:\hassecutrity\hassecutrityAuto\picture\live2.png" sleep(1) cropped_image.save(cropped_image_path) reference_image1 = cv2.imread('./picture/live.png') reference_image2 = cv2.imread('./picture/live2.png') # 计算图像差异 mse = ((reference_image1 - reference_image2) ** 2).mean() print(mse) #------------------------------------判断前板出图--------------------------------------------------------- if int(mse) != 0: print("出图成功") consume_time = time.time() - start_time wucha2_time = time.time() - wucha1_time laliu_time = consume_time - wucha2_time PASS_time = time.strftime('%Y-%m-%d-%H-%M-%S') screenshot_path_fail = r"./picture/fail/" +"前板直播"+ str(PASS_time) + ".png" driver.get_screenshot_as_file(screenshot_path_fail) with open('./picture/loop_live.txt', 'a') as log_file: # for success in success_times: log_file.write( "第" + str(i) + "次成功,打开前板直播总时长为:" + str(consume_time) + ",时间点:" + str(PASS_time) +",拉流耗时:"+str(laliu_time)+ "\n") sleep(5) #driver.back() try: driver.find_element(AppiumBy.CLASS_NAME,"android.widget.Button").click() except: driver.tap([(343, 525)]) sleep(1) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() # finally: break if time.time()-start_time > 30: print("出图失败") Fail_time = time.strftime('%Y-%m-%d-%H-%M-%S') screenshot_path_fail = r"./picture/fail/" + "前板直播"+str(Fail_time) + ".png" driver.get_screenshot_as_file(screenshot_path_fail) with open('./picture/loop_live.txt', 'a') as log_file: # for success in success_times: log_file.write( "第" + str(i) + "次前板直播失败" ",时间点:" + str(Fail_time) + "\n") bank_time = time.time() #前板失败开始唤醒后板直播 # 点击切换后板按键 try: driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button") driver.tap([(598, 104)]) except: driver.tap([(343, 525)]) sleep(1) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button") driver.tap([(598, 104)]) finally: sleep(2) while True: # 截取整个屏幕的截图并保存 wucha1_time = time.time() screenshot_path = r"D:\hassecutrity\hassecutrityAuto\picture\quauping3.png" driver.get_screenshot_as_file(screenshot_path) # 加载截图 image = Image.open(screenshot_path) # 裁剪出直播画面(left, top, right, bottom) left = 37 # 左上角 X 坐标 top = 258 # 左上角 Y 坐标 right = 666 # 右下角 X 坐标 bottom = 633 # 右下角 Y 坐标 # 裁剪出指定范围的区域 cropped_image = image.crop((left, top, right, bottom)) # 保存裁剪后的图片 cropped_image_path = r"D:\hassecutrity\hassecutrityAuto\picture\live2.png" sleep(1) cropped_image.save(cropped_image_path) reference_image1 = cv2.imread('./picture/live.png') reference_image2 = cv2.imread('./picture/live2.png') # 计算图像差异 mse = ((reference_image1 - reference_image2) ** 2).mean() print(mse) #---------------------------------------开始判断后板出图时间------------------------------------------------ if int(mse) != 0: print("出图成功") consume_time = time.time() - bank_time bank_PASS_time = time.strftime('%Y-%m-%d-%H-%M-%S') screenshot_path_fail = r"./picture/fail/" + "后板"+str(bank_PASS_time) + ".png" driver.get_screenshot_as_file(screenshot_path_fail) with open('./picture/loop_live.txt', 'a') as log_file: # for success in success_times: log_file.write( "第" + str(i) + "次成功,打开后板直播总时长为:" + str(consume_time) + ",时间点:" + str( bank_PASS_time) + "\n") sleep(5) # driver.back() try: sleep(1) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() except: driver.tap([(343, 525)]) sleep(0.5) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() # driver.tap([(55, 104)]) finally: assert driver.find_element(AppiumBy.ACCESSIBILITY_ID, "所有设备") exit_flag = True break if time.time() - bank_time > 25: print("出图失败") Fail_time = time.strftime('%Y-%m-%d-%H-%M-%S') screenshot_path_fail = r"./picture/fail/" + "后板"+str(Fail_time) + ".png" driver.get_screenshot_as_file(screenshot_path_fail) with open('./picture/loop_live.txt', 'a') as log_file: # for success in success_times: log_file.write( "第" + str(i) + "次后板直播失败" ",时间点:" + str(Fail_time) + "\n") try: sleep(1) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() except: driver.tap([(343, 525)]) sleep(0.5) driver.find_element(AppiumBy.CLASS_NAME, "android.widget.Button").click() # driver.tap([(55, 104)]) finally: sleep(2) assert driver.find_element(AppiumBy.ACCESSIBILITY_ID, "所有设备") exit_flag = True break if exit_flag: break sleep(3) except: continue