提交 260a7950 authored 作者: 陈泽健's avatar 陈泽健

补充实现无纸化同屏巡检流程,但是还存在图片匹配失败问题。

上级 93050863
from appium.webdriver.common.appiumby import AppiumBy from appium.webdriver.common.appiumby import AppiumBy
from time import sleep from time import sleep
from appium.options.android import UiAutomator2Options from appium.options.android import UiAutomator2Options
from django.db.models.fields import return_None
from hytest import * from hytest import *
from selenium import webdriver from selenium import webdriver
...@@ -119,6 +120,10 @@ def compare_images_feature_matching(image1_path, image2_path): ...@@ -119,6 +120,10 @@ def compare_images_feature_matching(image1_path, image2_path):
image1 = cv2.imread(image1_path, cv2.IMREAD_GRAYSCALE) image1 = cv2.imread(image1_path, cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread(image2_path, cv2.IMREAD_GRAYSCALE) image2 = cv2.imread(image2_path, cv2.IMREAD_GRAYSCALE)
if image1 is None or image2 is None:
logging.error(f"无法读取图像: {image1_path} 或 {image2_path}")
return False
# 初始化ORB检测器 # 初始化ORB检测器
orb = cv2.ORB_create() orb = cv2.ORB_create()
...@@ -126,45 +131,66 @@ def compare_images_feature_matching(image1_path, image2_path): ...@@ -126,45 +131,66 @@ def compare_images_feature_matching(image1_path, image2_path):
kp1, des1 = orb.detectAndCompute(image1, None) kp1, des1 = orb.detectAndCompute(image1, None)
kp2, des2 = orb.detectAndCompute(image2, None) kp2, des2 = orb.detectAndCompute(image2, None)
# BFMatcher对象 logging.info(f"图像1的关键点数量: {len(kp1)}")
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) logging.info(f"图像2的关键点数量: {len(kp2)}")
if des1 is None or des2 is None:
logging.error("无法检测到描述符")
return False
# FLANN参数
FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH, table_number=6, key_size=12, multi_probe_level=1)
search_params = dict(checks=50)
# FLANN匹配器
flann = cv2.FlannBasedMatcher(index_params, search_params)
# 匹配描述符 # 匹配描述符
matches = bf.match(des1, des2) matches = flann.knnMatch(des1, des2, k=2)
# 按距离排序 # 使用比率测试过滤匹配
matches = sorted(matches, key=lambda x: x.distance) good_matches = []
for m, n in matches:
if m.distance < 0.7 * n.distance:
good_matches.append(m)
# 计算匹配点的数量 # 计算匹配点的数量
num_matches = len(matches) num_matches = len(good_matches)
logging.info(f"匹配点数量: {num_matches}") logging.info(f"匹配点数量: {num_matches}")
INFO(f"匹配点数量:{num_matches}")
if num_matches > 10:
INFO("图片相同")
return True
else:
INFO("图片不同")
return False
# 判断匹配点数量是否在可接受范围内
return num_matches > 10 # 可以根据需要调整阈值
except Exception as e: except Exception as e:
logging.error(f"对比图片时发生错误: {e}", exc_info=True) logging.error(f"对比图片时发生错误: {e}", exc_info=True)
return False return False
# if __name__ == '__main__': if __name__ == '__main__':
# logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# logging.info("开始对比图片") logging.info("开始对比图片")
#
# image1_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\Base\captured_frame2.jpg' image1_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备A界面截屏.png'
# image2_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\Base\captured_frame.jpg' image2_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备B界面截屏.png'
#
# if not os.path.exists(image1_path): if not os.path.exists(image1_path):
# logging.error(f"图片 {image1_path} 不存在") logging.error(f"图片 {image1_path} 不存在")
# exit(1) exit(1)
# if not os.path.exists(image2_path): if not os.path.exists(image2_path):
# logging.error(f"图片 {image2_path} 不存在") logging.error(f"图片 {image2_path} 不存在")
# exit(1) exit(1)
#
# # 对比两张截图的相似度 # 对比两张截图的相似度
# if compare_images_feature_matching(image1_path, image2_path): if compare_images_feature_matching(image1_path, image2_path):
# logging.info("图片相同") logging.info("图片相同")
# else: else:
# logging.error("图片不同") logging.error("图片不同")
import cv2 import cv2
import logging import logging
......
...@@ -210,4 +210,5 @@ ...@@ -210,4 +210,5 @@
53. 2025-02-13 53. 2025-02-13
- 增加get_test_result函数通过正则匹配获取通过率、失败率以及异常率,再调用钉钉消息通知输出通过率等值。优化处理。 - 增加get_test_result函数通过正则匹配获取通过率、失败率以及异常率,再调用钉钉消息通知输出通过率等值。优化处理。
54. 2025-02-14 54. 2025-02-14
- 补充讯飞语音转录功能流程,调试通过。 - 补充讯飞语音转录功能流程,调试通过。
\ No newline at end of file - 补充实现无纸化同屏巡检流程,但是还存在图片匹配失败问题。
\ No newline at end of file
from 预定系统.Base.app_base import *
import logging
# 配置日志记录
class same_screen_share_001:
"""
执行指令:
1.cd 预定系统
2.hytest --report_title 会议预约测试报告 --report_url_prefix http://nat.ubainsyun.com:31133 --tag 无纸化同屏
"""
tags = ['无纸化同屏']
def teststeps(self):
wd = GSTORE['wd']
app_drive1 = None
app_drive2 = None
try:
# 初始化第一个设备
app_drive1 = app_setup_driver("Android", "7.1.2", "展厅无纸化设备1.0", "com.ubains.system.develop.mqtt", "com.ubains.system.activity.RouterActivity","192.168.5.156:5555")
app_drive1.implicitly_wait(20) # 设置缺省等待时间
# 初始化第二个设备
app_drive2 = app_setup_driver("Android", "7.1.2", "展厅无纸化设备1.0", "com.ubains.system.develop.mqtt", "com.ubains.system.activity.RouterActivity","192.168.5.157:5555")
app_drive2.implicitly_wait(20) # 设置缺省等待时间
# 使用显式等待来等待元素出现
logging.info(f"等待登录页加载.")
sleep(10)
# 进入后台设置界面
logging.info(f"尝试进入后台设置")
back_setting_button = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout/android.widget.LinearLayout[1]/android.widget.RelativeLayout[3]/android.widget.TextView')
back_setting_button.click()
sleep(5)
setting_button = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.RelativeLayout[2]')
setting_button.click()
sleep(5)
# 输入管理员密码点击【确定】按钮
logging.info(f"尝试输入管理员密码点击【确定】")
admin_pwd_input = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.RelativeLayout/androidx.appcompat.widget.LinearLayoutCompat/android.widget.EditText')
admin_pwd_input.send_keys("000000")
sleep(3)
# 点击确定按钮
confirm_button = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.Button[2]')
confirm_button.click()
sleep(5)
# 先截取另一台设备的界面做参照物
INFO(f"这是设备B的界面")
SELENIUM_LOG_SCREEN(wd, "75%", "Exhibit_Inspect", "No_PaperLess", "同屏前-无纸化设备B界面截屏")
app_drive2.get_screenshot_as_file(
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏前-无纸化设备B界面截屏.png")
# 进入【同屏和视频服务】界面
logging.info(f"进入【同屏和视频服务】")
same_screen_module = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.LinearLayout/android.widget.RelativeLayout[5]/android.widget.TextView')
same_screen_module.click()
sleep(2)
# 点击右上角【开始】按钮
same_screen_button = app_drive1.find_element(AppiumBy.XPATH,
'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout[2]/android.view.ViewGroup/android.widget.FrameLayout/android.view.ViewGroup/android.widget.Button[1]')
same_screen_button.click()
sleep(3)
# 截取设备A和设备B的同屏画面截屏
INFO(f"这是设备A开启同屏共享的界面")
SELENIUM_LOG_SCREEN(wd, "75%", "Exhibit_Inspect", "No_PaperLess", "同屏后-无纸化设备A界面截屏")
app_drive1.get_screenshot_as_file(
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备A界面截屏.png")
INFO(f"这是设备B开启同屏共享的界面")
SELENIUM_LOG_SCREEN(wd, "75%", "Exhibit_Inspect", "No_PaperLess", "同屏后-无纸化设备B界面截屏")
app_drive2.get_screenshot_as_file(
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备B界面截屏.png")
# 调用图片对比函数判断相似度
match_text = compare_images_feature_matching(
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备A界面截屏.png",
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备B界面截屏.png")
INFO(f"图片相似度:{match_text}")
CHECK_POINT("校验同屏功能是否成功", match_text == True)
except Exception as e:
logging.error(f"发生错误: {e}", exc_info=True)
...@@ -21,7 +21,7 @@ class Exhibition_hall_NoPaperinspection_000x: ...@@ -21,7 +21,7 @@ class Exhibition_hall_NoPaperinspection_000x:
try: try:
# 腾讯:"com.tencent.wemeet.app" ".StartupActivity" # 腾讯:"com.tencent.wemeet.app" ".StartupActivity"
# 无纸化1.0:"com.ubains.system.develop.mqtt" "com.ubains.system.activity.RouterActivity" # 无纸化1.0:"com.ubains.system.develop.mqtt" "com.ubains.system.activity.RouterActivity"
app_drive = app_setup_driver("Android", "7.1.2", "展厅无纸化设备1.0", "com.ubains.system.develop.mqtt", "com.ubains.system.activity.RouterActivity","192.168.5.156:5555") app_drive = app_setup_driver("Android", "7.1.2", "展厅无纸化设备1.0", "com.ubains.system.develop.mqtt", "com.ubains.system.activity.RouterActivity","192.168.5.158:5555")
app_drive.implicitly_wait(20) # 设置缺省等待时间 app_drive.implicitly_wait(20) # 设置缺省等待时间
# 使用显式等待来等待元素出现 # 使用显式等待来等待元素出现
......
...@@ -19,14 +19,30 @@ except ModuleNotFoundError as e: ...@@ -19,14 +19,30 @@ except ModuleNotFoundError as e:
from 预定系统.Base.app_base import * from 预定系统.Base.app_base import *
def suite_setup(): def suite_setup():
STEP(1, "初始化设备adb连接") STEP(1, "初始化设备1的adb连接")
device_ip = '192.168.5.156' device_ip1 = '192.168.5.156'
app_init(device_ip) app_init(device_ip1)
# 传入系统类型,展厅预定巡检 == 192.168.5.200
STEP(2, "初始化设备2的adb连接")
device_ip2 = '192.168.5.157' # 假设第二个设备的IP地址是192.168.5.157
app_init(device_ip2)
STEP(3, "初始化设备3的adb连接")
device_ip3 = '192.168.5.158'
app_init(device_ip3)
browser_init("展厅预定巡检") browser_init("展厅预定巡检")
wd = GSTORE['wd'] wd = GSTORE['wd']
def suite_teardown(): def suite_teardown():
device_ip = '192.168.5.156' device_ip1 = '192.168.5.156'
app_quit(device_ip) app_quit(device_ip1)
device_ip2 = '192.168.5.157'
app_quit(device_ip2)
device_ip3 = '192.168.5.158'
app_quit(device_ip3)
browser_quit() browser_quit()
\ No newline at end of file
# from 预定系统.Base.app_base import *
# import logging
#
# # 配置日志记录
# logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
#
# class same_screen_share_001:
# """
# 执行指令:
# 1.cd 预定系统
# 2.hytest --report_title 会议预约测试报告 --report_url_prefix http://192.168.1.225 --tag 无纸化
# """
# tags = ['展厅巡检','无纸化']
#
# def app_nopaper_test(device_ip1, device_ip2):
# app_drive1 = None
# app_drive2 = None
# try:
# # 初始化第一个设备
# app_drive1 = app_setup_driver("Android", "7.1.2", "127.0.0.1:62001", "com.ubains.local.gviewer", "com.ubains.ub.gview.SplashActivity", device_ip1)
# app_drive1.implicitly_wait(20) # 设置缺省等待时间
#
# # 初始化第二个设备
# app_drive2 = app_setup_driver("Android", "7.1.2", "127.0.0.1:62002", "com.ubains.local.gviewer", "com.ubains.ub.gview.SplashActivity", device_ip2)
# app_drive2.implicitly_wait(20) # 设置缺省等待时间
#
# # 在两个设备上执行相同的测试步骤
# for app_drive, device_ip in [(app_drive1, device_ip1), (app_drive2, device_ip2)]:
# logging.info(f"在设备 {device_ip} 上执行测试步骤...")
#
# # 使用显式等待来等待元素出现
# logging.info(f"等待登录页加载... (设备 {device_ip})")
# sleep(10)
#
# # 进入后台设置界面
# logging.info(f"尝试进入后台设置界面 (设备 {device_ip})")
# back_setting_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.Button[1]')
# back_setting_button.click()
# sleep(3)
#
# # 输入管理员密码点击【确定】按钮
# logging.info(f"尝试输入管理员密码点击【确定】按钮 (设备 {device_ip})")
# admin_pwd_input = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.EditText')
# admin_pwd_input.send_keys("Ubains@123")
# sleep(2)
#
# # 点击确定按钮
# confirm_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.TextView[3]')
# confirm_button.click()
# sleep(5)
#
# # 进入【同屏和视频服务】界面
# logging.info(f"进入【同屏和视频服务】界面 (设备 {device_ip})")
# same_screen_module = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout[1]/androidx.recyclerview.widget.RecyclerView/android.widget.FrameLayout[4]/android.widget.FrameLayout/android.widget.TextView')
# same_screen_module.click()
# sleep(2)
#
# # 点击右上角【同屏配置】进入同屏运维界面
# same_screen_config_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout[2]/android.widget.FrameLayout[2]/androidx.viewpager.widget.ViewPager/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.Button[1]')
# same_screen_config_button.click()
# sleep(3)
#
# # 判断是否出现【关闭】按钮,如果有就点击【关闭】按钮
# quit_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.view.ViewGroup/android.widget.LinearLayout[2]/android.widget.TextView')
# if quit_button:
# logging.info(f"点击【关闭】按钮 (设备 {device_ip})")
# quit_button.click()
# sleep(2)
# else:
# logging.info(f"没有【关闭】按钮 (设备 {device_ip})")
#
# # 进入【同屏共享】界面
# logging.info(f"进入【同屏共享】界面 (设备 {device_ip})")
# same_screen_share_config_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.ScrollView/android.widget.LinearLayout/android.widget.FrameLayout[2]/android.widget.TextView')
# same_screen_share_config_button.click()
# sleep(4)
#
# # 使用同屏共享功能
# logging.info(f"使用同屏共享功能 (设备 {device_ip})")
# same_screen_share_button = app_drive.find_element(AppiumBy.XPATH,
# '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.widget.FrameLayout/android.widget.FrameLayout/android.view.ViewGroup/androidx.viewpager.widget.ViewPager/androidx.recyclerview.widget.RecyclerView/android.widget.FrameLayout/android.view.ViewGroup/androidx.appcompat.widget.LinearLayoutCompat/android.widget.Button[1]')
# same_screen_share_button.click()
#
# # 进行截屏操作
# logging.info(f"在设备 {device_ip} 上进行截屏操作")
# screenshot_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), f"screenshot_{device_ip}.png")
# app_drive.get_screenshot_as_file(screenshot_path)
# logging.info(f"截屏已保存到 {screenshot_path}")
#
# except Exception as e:
# logging.error(f"发生错误: {e}", exc_info=True)
#
# finally:
# if app_drive1:
# input('**** 按任意键退出..')
# app_drive1.quit()
# logging.info("驱动程序已退出 (设备 1)。")
#
# if app_drive2:
# input('**** 按任意键退出..')
# app_drive2.quit()
# logging.info("驱动程序已退出 (设备 2)。")
#
# if __name__ == "__main__":
# device_ip1 = '192.168.5.158:5555'
# device_ip2 = '192.168.5.159:5555' # 假设第二个设备的IP地址是192.168.5.159:5555
# app_nopaper_test(device_ip1, device_ip2)
import sys
import os
from time import sleep
# 获取当前脚本的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建预定系统的绝对路径
预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..'))
# 添加路径
sys.path.append(预定系统_path)
# 导入模块
try:
from 预定系统.Base.base import *
from 预定系统.Base.app_base import *
except ModuleNotFoundError as e:
print(f"ModuleNotFoundError: {e}")
print("尝试使用绝对路径导入")
from 预定系统.Base.base import *
from 预定系统.Base.app_base import *
def suite_setup():
STEP(1, "初始化设备1的adb连接")
device_ip1 = '192.168.5.156'
app_init(device_ip1)
STEP(2, "初始化设备2的adb连接")
device_ip2 = '192.168.5.157' # 假设第二个设备的IP地址是192.168.5.157
app_init(device_ip2)
browser_init("展厅预定巡检")
wd = GSTORE['wd']
def suite_teardown():
device_ip1 = '192.168.5.156'
app_quit(device_ip1)
device_ip2 = '192.168.5.157'
app_quit(device_ip2)
browser_quit()
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论