From a76e84be7775c24783367ef3f1cb0b4bc11d1157 Mon Sep 17 00:00:00 2001 From: lixu Date: Thu, 30 Oct 2025 15:32:01 +0800 Subject: [PATCH] =?UTF-8?q?APP=E4=BC=91=E7=9C=A0=E6=8B=89=E6=B5=81?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xing.py | 290 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 xing.py diff --git a/xing.py b/xing.py new file mode 100644 index 0000000..31ca3ca --- /dev/null +++ b/xing.py @@ -0,0 +1,290 @@ +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 + +