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

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

上级 93050863
from appium.webdriver.common.appiumby import AppiumBy
from time import sleep
from appium.options.android import UiAutomator2Options
from django.db.models.fields import return_None
from hytest import *
from selenium import webdriver
......@@ -119,6 +120,10 @@ def compare_images_feature_matching(image1_path, image2_path):
image1 = cv2.imread(image1_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 = cv2.ORB_create()
......@@ -126,45 +131,66 @@ def compare_images_feature_matching(image1_path, image2_path):
kp1, des1 = orb.detectAndCompute(image1, None)
kp2, des2 = orb.detectAndCompute(image2, None)
# BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
logging.info(f"图像1的关键点数量: {len(kp1)}")
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}")
INFO(f"匹配点数量:{num_matches}")
if num_matches > 10:
INFO("图片相同")
return True
else:
INFO("图片不同")
return False
# 判断匹配点数量是否在可接受范围内
return num_matches > 10 # 可以根据需要调整阈值
except Exception as e:
logging.error(f"对比图片时发生错误: {e}", exc_info=True)
return False
# if __name__ == '__main__':
# logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
# logging.info("开始对比图片")
#
# image1_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\Base\captured_frame2.jpg'
# image2_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\Base\captured_frame.jpg'
#
# if not os.path.exists(image1_path):
# logging.error(f"图片 {image1_path} 不存在")
# exit(1)
# if not os.path.exists(image2_path):
# logging.error(f"图片 {image2_path} 不存在")
# exit(1)
#
# # 对比两张截图的相似度
# if compare_images_feature_matching(image1_path, image2_path):
# logging.info("图片相同")
# else:
# logging.error("图片不同")
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info("开始对比图片")
image1_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备A界面截屏.png'
image2_path = r'D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Exhibit_Inspect\No_PaperLess\同屏后-无纸化设备B界面截屏.png'
if not os.path.exists(image1_path):
logging.error(f"图片 {image1_path} 不存在")
exit(1)
if not os.path.exists(image2_path):
logging.error(f"图片 {image2_path} 不存在")
exit(1)
# 对比两张截图的相似度
if compare_images_feature_matching(image1_path, image2_path):
logging.info("图片相同")
else:
logging.error("图片不同")
import cv2
import logging
......
......@@ -211,3 +211,4 @@
- 增加get_test_result函数通过正则匹配获取通过率、失败率以及异常率,再调用钉钉消息通知输出通过率等值。优化处理。
54. 2025-02-14
- 补充讯飞语音转录功能流程,调试通过。
- 补充实现无纸化同屏巡检流程,但是还存在图片匹配失败问题。
\ 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:
try:
# 腾讯:"com.tencent.wemeet.app" ".StartupActivity"
# 无纸化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) # 设置缺省等待时间
# 使用显式等待来等待元素出现
......
......@@ -19,14 +19,30 @@ except ModuleNotFoundError as e:
from 预定系统.Base.app_base import *
def suite_setup():
STEP(1, "初始化设备adb连接")
device_ip = '192.168.5.156'
app_init(device_ip)
# 传入系统类型,展厅预定巡检 == 192.168.5.200
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)
STEP(3, "初始化设备3的adb连接")
device_ip3 = '192.168.5.158'
app_init(device_ip3)
browser_init("展厅预定巡检")
wd = GSTORE['wd']
def suite_teardown():
device_ip = '192.168.5.156'
app_quit(device_ip)
device_ip1 = '192.168.5.156'
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()
\ 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 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论