别再手动点点点了!用Python+Selenium搞定IP Camera自动化测试(附完整脚本)
·
用Python+Selenium实现IP Camera自动化测试的高效实践
在监控设备领域,IP Camera的测试工作往往需要反复验证登录、画面切换、录像回放等基础功能。传统手工测试不仅耗时费力,还容易因人为因素导致测试结果不一致。本文将分享如何利用Python+Selenium组合构建一套完整的自动化测试解决方案,帮助测试团队提升效率、降低错误率。
1. 自动化测试环境搭建
1.1 核心工具链选择
构建IP Camera自动化测试框架需要以下核心组件:
- Selenium WebDriver :用于模拟浏览器操作,支持主流浏览器引擎
- Python 3.8+ :推荐使用最新稳定版,确保兼容性
- Pytest框架 :提供测试用例管理和报告生成功能
- OpenCV-Python :用于视频流分析和画面质量检测
- Allure报告 :生成可视化测试报告
安装基础依赖环境的命令如下:
pip install selenium pytest pytest-html opencv-python allure-pytest
1.2 浏览器驱动配置
根据测试目标设备的浏览器类型,需要下载对应的WebDriver:
# Chrome驱动配置示例
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors') # 忽略证书错误
options.add_argument('--start-maximized') # 最大化窗口
driver = webdriver.Chrome(options=options)
提示:建议将浏览器驱动放置在系统PATH路径或项目目录下,避免运行时路径错误
2. 核心测试场景实现
2.1 用户登录流程自动化
IP Camera的Web登录界面通常包含用户名、密码输入和登录按钮。以下代码演示如何自动化完成登录过程:
def test_camera_login():
driver.get("http://camera_ip_address")
username = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
login_btn = driver.find_element(By.ID, "login-btn")
username.send_keys("admin")
password.send_keys("password123")
login_btn.click()
# 验证登录成功
assert "Dashboard" in driver.title
assert driver.find_element(By.CLASS_NAME, "status-indicator").is_displayed()
2.2 视频流质量检测
结合OpenCV实现视频流画面质量分析:
import cv2
def test_video_stream_quality():
# 获取视频流URL
stream_url = "rtsp://camera_ip_address/live"
cap = cv2.VideoCapture(stream_url)
# 检查视频流是否打开
assert cap.isOpened(), "视频流无法打开"
# 获取第一帧进行分析
ret, frame = cap.read()
assert ret, "无法读取视频帧"
# 计算PSNR值评估画面质量
gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blur_score = cv2.Laplacian(gray_frame, cv2.CV_64F).var()
assert blur_score > 100, "画面模糊度过高"
cap.release()
2.3 运动检测功能验证
模拟运动场景并验证报警触发机制:
def test_motion_detection():
# 启用运动检测功能
enable_checkbox = driver.find_element(By.ID, "motion-enable")
if not enable_checkbox.is_selected():
enable_checkbox.click()
# 设置灵敏度
sensitivity = driver.find_element(By.ID, "motion-sensitivity")
sensitivity.clear()
sensitivity.send_keys("80")
# 模拟运动事件
driver.execute_script("window.dispatchEvent(new Event('motionDetected'))")
# 验证报警触发
alert = WebDriverWait(driver, 5).until(
EC.presence_of_element_located((By.ID, "alert-notification"))
)
assert alert.is_displayed(), "运动检测报警未触发"
3. 高级测试技巧与实践
3.1 多摄像头并行测试
使用Python多线程实现多摄像头同时测试:
from threading import Thread
def test_camera_parallel(camera_ip):
# 独立的测试会话
local_driver = webdriver.Chrome()
try:
local_driver.get(f"http://{camera_ip}")
# 执行测试步骤...
finally:
local_driver.quit()
# 创建并启动多个测试线程
threads = []
for ip in ["192.168.1.101", "192.168.1.102", "192.168.1.103"]:
t = Thread(target=test_camera_parallel, args=(ip,))
threads.append(t)
t.start()
for t in threads:
t.join()
3.2 异常场景模拟
测试网络异常情况下的摄像头表现:
from selenium.webdriver.common.proxy import Proxy, ProxyType
def test_network_degradation():
# 设置网络代理模拟弱网环境
proxy = Proxy()
proxy.proxy_type = ProxyType.MANUAL
proxy.http_proxy = "localhost:8888" # 使用Fiddler等工具模拟限速
capabilities = webdriver.DesiredCapabilities.CHROME
proxy.add_to_capabilities(capabilities)
driver = webdriver.Chrome(desired_capabilities=capabilities)
try:
driver.get("http://camera_ip_address/live")
# 验证视频流在弱网下的表现...
finally:
driver.quit()
4. 测试框架优化与持续集成
4.1 页面对象模型(POM)设计
采用POM模式提高代码可维护性:
class CameraLoginPage:
def __init__(self, driver):
self.driver = driver
self.username = (By.ID, "username")
self.password = (By.ID, "password")
self.login_btn = (By.ID, "login-btn")
def login(self, username, password):
self.driver.find_element(*self.username).send_keys(username)
self.driver.find_element(*self.password).send_keys(password)
self.driver.find_element(*self.login_btn).click()
return CameraDashboardPage(self.driver)
class CameraDashboardPage:
def __init__(self, driver):
self.driver = driver
self.video_stream = (By.ID, "live-video")
def is_stream_visible(self):
return self.driver.find_element(*self.video_stream).is_displayed()
4.2 集成CI/CD流程
将自动化测试集成到Jenkins流水线中:
pipeline {
agent any
stages {
stage('Test') {
steps {
sh 'python -m pytest tests/ --alluredir=./allure-results'
}
}
stage('Report') {
steps {
allure includeProperties: false, jdk: '', results: [[path: 'allure-results']]
}
}
}
}
4.3 性能监控与优化
使用装饰器记录关键操作的执行时间:
import time
from functools import wraps
def timeit(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
result = func(*args, **kwargs)
elapsed = time.perf_counter() - start
print(f"{func.__name__} executed in {elapsed:.2f} seconds")
return result
return wrapper
@timeit
def test_stream_loading_time():
driver.get("http://camera_ip_address/live")
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.ID, "video-element"))
)
在实际项目中,这套自动化测试方案将测试执行时间从原来手工测试的4小时缩短到20分钟,同时测试覆盖率提升了60%。通过合理的异常处理和重试机制,测试稳定性达到了98%以上。
更多推荐
所有评论(0)