当前位置: 首页 > news >正文

问卷系统自动化测试报告

一、项目介绍

项目背景

在数字化与数据驱动的时代背景下,高效收集和分析信息对各类组织的决策至关重要。传统调研方式效率低、成本高且数据整合困难。本项目旨在开发一个集问卷设计、发布、回收与分析于一体的在线问卷系统,通过可视化编辑、逻辑控制和自动化分析等功能,大幅提升调研效率与数据价值,为用户决策提供实时、多维的数据支持,助力实现科学化、精准化的业务洞察与策略制定。

测试计划

  • 本次测试将全面验证问卷系统核心业务流程的完整性与正确性,重点保障从问卷创建到回答提交的全链路功能符合设计预期,确保用户能够顺畅完成调研任务。
  • 模拟真实用户并发场景,评估系统在预期负载下的性能表现,检验其响应速度与稳定性是否满足高效、可靠的使用体验要求。
  • 通过建立自动化测试体系,对高频核心场景实现持续覆盖,旨在为后续迭代提供快速反馈机制,有效保障版本演进中的功能稳定性,显著降低回归测试成本与潜在质量风险。

二、项目功能及用例设计

登录界面

用户登录功能

该项目提供便捷安全的登录方式,用户只需使用用户名和密码即可验证身份。为确保输入准确,特设有密码可视化功能。对于尚未拥有账户的新用户,页面设有明确的注册引导,可一键跳转,轻松完成一站式账户开通流程。

该模块设计测试用例如下:

注册功能

该系统提供了简洁明了的注册流程,只需依次设置姓名、登录账号、密码并进行二次确认即可成功开户,全程支持显示密码,帮助用户清晰确认、避免误输。成功注册后,将自动跳转到登录页,以便更顺畅地进入系统。

该模块设计测试用例如下:

系统首页

其核心功能包括:创建问卷、创建考试;

其他功能包括:我的项目、我的练习、题库中心、模版广场、用户设置等

该模块设计测试用例如下:

问卷创建页面

其核心功能包括:多题型的问卷设计
其他功能包括:预览问卷、JSON查看、保存问卷、题库功能、大纲功能等

该模块设计测试用例如下:

考试创建页面

核心功能:多题型的考试设计

其他功能包括:设计考试外观、预览考试、JSON查看、保存考试、题库功能等

该模块设计测试用例如下:

问题管理页面

该页面的主要功能包括:试题的检索与筛选、试题的集中查看与概览、试题的编辑与管理;次要功能包括:筛选条件重置、展开高级搜索、页面导航与定位 。

该模块设计测试用例如下:

三、自动化测试脚本编写

Utils.py

Driver类是一个基于 Selenium 的 Chrome 浏览器驱动封装类。

  • 使用单例模式:通过ShoppingDriver=Driver()创建了一个实例,供多个测试文件共享使用。
  • 自动管理驱动:使用webdriver_manager自动安装和管理 ChromeDriver。
  • 包含截图功能:提供了便捷的页面截图方法。
  • 简单的初始化配置:设置了 3 秒的隐式等待时间。
import datetime
import os
import sysfrom selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManagerclass Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()# options.add_argument("-headless") #无头模式无法运行,因为窗口太小会找不到我的项目元素以及保存考试的元素# options.page_load_strategy = 'eager' # 更改页面加载策略,加快访问速度,但是有可能会导致没有等待到元素加载出来就获取self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()),options = options)self.driver.implicitly_wait(3)def getScreeShot(self):#先创建文件dirname = datetime.datetime.now().strftime('%Y-%m-%d')#如果没有找到文件夹就生成一个,不是在common文件夹生成文件夹,而是在总目录下生成一个带日期的文件夹if not os.path.exists("../images/"+dirname):os.mkdir("../images/"+dirname)filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")self.driver.save_screenshot("../images/"+dirname+"/"+filename+".png")#为了更好定位到照片信息,获取调用的方法名加进名字里#sys._getframe().f_back.f_code.co_nameTestDriver=Driver()#四个测试文件都只用一个实例出来的对象

TestLogin

TestLogin类用于覆盖登录场景的正常与异常测试。

import timefrom selenium.webdriver.common.by import By
from common.Utils import TestDriverclass TestLogin:url=""driver=""def __init__(self):self.driver=TestDriver.driverself.url="http://8.155.1.153:8081/user/login"self.driver.get(self.url)self.driver.fullscreen_window()def LoginSuccess(self):self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()#输入框输入账号self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")#输入框输入密码self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")#点击登录self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()#进入问卷首页后,验证头像,是不是进入了首页self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span.ant-avatar.ant-avatar-circle.ant-avatar-image > img")#添加截图TestDriver.getScreeShot()def LoginFail(self):for i in range(0,2):# 验证失败账号登录之后还要错误的密码登录,要清空输入框self.driver.find_element(By.CSS_SELECTOR, "#username").clear()self.driver.find_element(By.CSS_SELECTOR, "#password").clear()if i == 0:# 输入框输入正确的账号,错误的密码self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("bit12344321.")else:# 输入框输入错误的账号,正确的密码self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("dz00")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")# 点击登录self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()# 验证是不是还在登录界面,显示错误的用户名和密码text=self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").textassert (text=="错误的用户名和密码")# 添加截图TestDriver.getScreeShot()

TestHome

TestHome类用于验证系统首页在 “登录” 与 “未登录” 两种状态下的访问权限、页面跳转逻辑及元素完整性。

  • 与TestLogin类联动:TestLogin.LoginSuccess()执行成功后,可调用TestHome.TestHomeByLogin()验证“登录后跳转首页” 的完整流程。
  • 与后续业务测试(如 “创建问卷”“创建考试”)衔接:首页核心元素验证通过,才能确保后续功能测试的起点(首页)是正常可用的。
from selenium.webdriver.common.by import By
from common.Utils import TestDriverclass TestHome:url = ""driver = ""def __init__(self):self.driver = TestDriver.driverself.url = "http://8.155.1.153:8081/home"self.driver.get(self.url)def TestHomeNotLogin(self):#未登录状态下,跳转到登录界面,验证是不是在登录界面url=self.driver.current_urlassert (url == "http://8.155.1.153:8081/user/login")# 添加截图TestDriver.getScreeShot()def TestHomeByLogin(self):#登录状态下,页面元素为:标题、头像、用户名、创建问卷、创建考试# 标题self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-logo.ant-pro-global-header-logo-mix > a > h1")# 头像self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span.ant-avatar.ant-avatar-circle.ant-avatar-image > img")# 用户名self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")# 创建问卷self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)")# 创建考试self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")# 添加截图TestDriver.getScreeShot()

ExamEdit

ExamEdit类核心覆盖 “考试创建、保存、开启、参与” 的完整业务链路,兼顾 “登录 / 未登录权限控制”“页面元素完整性校验”“异常场景验证” 三个测试维度。

以ExamYesEditByLogin(正常考试流程)为例,完整模拟用户操作链路:
首页→创建考试→输入标题→添加选择题→保存考试→返回首页→进入“我的项目”→找到目标考试→开启考试→打开考试窗口→选择选项→提交→验证结果→关闭窗口

测试方法测试场景分类核心测试目标
ExamEditNotLogin权限控制未登录用户无法访问 “考试编辑页”,自动跳转至登录页
ExamYesEditByLogin正常业务流程已登录用户完成 “创建考试→添加题目→保存→开启→参与考试→提交验证” 全流程
ExamNoEditByLogin异常业务流程验证 3 类异常场景:1. 不保存考试则项目列表无记录2. 保存但不开启考试则无法参与(提示 “问卷已暂停回收”)3. 开启无题目的考试则无提交按钮
ExamEditCheck页面元素校验验证 “考试创建页” 核心功能元素(题型、大纲、保存 / 预览按钮)完整性
import datetime
import timefrom selenium.webdriver.common.by import Byfrom common.Utils import TestDriverclass ExamEdit:url = ""driver = ""def __init__(self):self.driver = TestDriver.driverself.url = "http://8.155.1.153:8081/survey/new?mode=exam"self.driver.get(self.url)def ExamEditNotLogin(self):# 未登录状态下,返回到登录界面#time.sleep(2)# 验证是不是在登录界面time.sleep(1)url = self.driver.current_urlassert (url == "http://8.155.1.153:8081/user/login")self.driver.find_element(By.CSS_SELECTOR, "#username")self.driver.find_element(By.CSS_SELECTOR, "#password")# 添加截图TestDriver.getScreeShot()def ExamYesEditByLogin(self):# 进来的时候就是创建考试界面了,要回到主页examurl = "http://8.155.1.153:8081/home"self.driver.get(examurl)self.driver.fullscreen_window()# 保存考试后开启有题目的考试 —— 清空标题名,名字设置为有题目的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入,# 点击开启考试,点击网址跳转到新窗口,切换窗口,选择选项后点击提交考试(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)").click())  # 创建考试(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").clear())  # 清空考试名称(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys("有题目的考试"))  # 设置考试名字time.sleep(1)self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-1-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(1) > dd > div").click() # 添加选择题time.sleep(1)(self.driver.find_element(By.CSS_SELECTOR,"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span").click())  # 保存考试self.driver.back()  # 回退到主页self.driver.back()  # 回退到主页(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg").click())  # 点击我的项目examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title")  # 查找name_element = Nonefor name in examnums:if name.text == "有题目的考试":name_element = namebreakif name_element:name_element.click()else:print("有题目的考试——异常不存在")TestDriver.getScreeShot()  # 截图记录time.sleep(1)# 点击开启考试按钮self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()# 点击打开网址按钮self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()# 出现了新窗口,跳转到新窗口curwindow = self.driver.current_window_handle  # 获取当前窗口的句柄allwindow = self.driver.window_handles  # 获取所有窗口句柄for window in allwindow:if window != curwindow:self.driver.switch_to.window(window)  # 切换到新的窗口break# 对新窗口进行操作# 点击选项1self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-body > div > section > div.survey-antd-body-question-body > div > div > div > div:nth-child(1) > label > span:nth-child(2) > div").click()time.sleep(1)# 点击提交self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div").click()# root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > buttontime.sleep(1)text=self.driver.find_element(By.CSS_SELECTOR,"#result-message").textassert(text=="问卷到此结束,感谢您的参与!")# 关闭新窗口,获取所有窗口句柄,切换回老窗口self.driver.close()allwindow = self.driver.window_handles  # 获取所有窗口句柄for window in allwindow:if window:self.driver.switch_to.window(window)breakelse:print("异常,所有窗口已经关闭")TestDriver.getScreeShot()  # 截图记录def ExamNoEditByLogin(self):# 进来的时候就是创建考试界面了,要回到主页examurl = "http://8.155.1.153:8081/home"self.driver.get(examurl)self.driver.fullscreen_window()time.sleep(2)try:#登录状态下,异常发布考试:# 1.创建考试后不保存考试 —— 清空标题名,名字设置为不保存的考试,回退一次到主页,再点我的项目,再用find_elemengts判断元素不存在(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)").click())  # 创建考试(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").clear())  # 清空考试名称(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys("不保存的考试"))  # 设置考试名字self.driver.back() #回退到主页(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg").click())  # 点击我的项目examnums=self.driver.find_elements(By.CSS_SELECTOR,"span.survey-title")  # 查找res=any("不保存的考试"==name.text for name in examnums)if res:print("不保存的考试——异常存在")TestDriver.getScreeShot()self.driver.fullscreen_window()# 2.保存考试后不开启考试 —— 清空标题名,名字设置为保存但不开启的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入# 点击网址跳转到新窗口,切换窗口,显示问卷已暂停回收# 首页不能点击,只能backtime.sleep(1)self.driver.back()  # 从我的项目回退到首页栏(self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)").click())  # 创建考试time.sleep(1)self.driver.fullscreen_window()(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").clear())  # 清空考试名称(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys("保存但不开启的考试"))  # 设置考试名字time.sleep(2)(self.driver.find_element(By.CSS_SELECTOR,"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span").click())  # 保存考试 ———— 如果不是全屏就找不到保存元素self.driver.back()  # 回退到主页self.driver.back()  # 回退到主页time.sleep(2)(self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg").click())  # 点击我的项目time.sleep(1)examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title")  # 查找name_element=Nonefor name in examnums:if name.get_attribute("title")=="保存但不开启的考试":name_element=namebreakif name_element:name_element.click()else:print("保存但不开启的考试——异常不存在")TestDriver.getScreeShot() #截图记录#不开启考试直接点击打开网址按钮self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()#出现了新窗口,跳转到新窗口curwindow=self.driver.current_window_handle #获取当前窗口的句柄allwindow=self.driver.window_handles #获取所有窗口句柄for window in allwindow:if window!=curwindow:self.driver.switch_to.window(window) #切换到新的窗口break#对新窗口进行操作text=self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > div > h2").textif text=="问卷已暂停回收":assert (text=="问卷已暂停回收")TestDriver.getScreeShot()  # 截图记录#关闭新窗口,获取所有窗口句柄,切换回老窗口self.driver.close()allwindow = self.driver.window_handles  # 获取所有窗口句柄for window in allwindow:if window:self.driver.switch_to.window(window)breakelse:print("异常,所有窗口已经关闭")TestDriver.getScreeShot()  # 截图记录time.sleep(1)self.driver.fullscreen_window()time.sleep(1)# 3.保存考试后开启无题目的考试 —— 清空标题名,名字设置为开启但没题目的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入,# 点击开启考试,点击网址跳转到新窗口,切换窗口,find_elemengts判断提交按钮不存在# 回退两次——从考试设置回退到我的项目——再退到首页self.driver.back()  # 从考试开启回退到我的项目self.driver.back()  # 从我的项目回退到首页栏time.sleep(1)(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)").click())  # 创建考试time.sleep(2)self.driver.fullscreen_window()time.sleep(2)(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").clear())  # 清空考试名称(self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys("保存开启但无题目的考试"))  # 设置考试名字time.sleep(1)(self.driver.find_element(By.CSS_SELECTOR,"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span").click())  # 保存考试self.driver.back()  # 回退到主页self.driver.back()  # 回退到主页(self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg").click())  # 点击我的项目time.sleep(1)examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title")  # 查找name_element = Nonefor name in examnums:if name.get_attribute("title") == "保存开启但无题目的考试":name_element = namebreakif name_element:name_element.click()else:print("保存开启但无题目的考试——异常不存在")TestDriver.getScreeShot()  # 截图记录# 点击开启考试按钮self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()# 点击打开网址按钮self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()# 出现了新窗口,跳转到新窗口curwindow = self.driver.current_window_handle  # 获取当前窗口的句柄allwindow = self.driver.window_handles  # 获取所有窗口句柄for window in allwindow:if window != curwindow:self.driver.switch_to.window(window)  # 切换到新的窗口break# 对新窗口进行操作# 找提交按钮,目标:按钮不存在my_list=self.driver.find_elements(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div")# 找不到返回空列表if len(my_list)>0:assert (len(my_list)>0) #不是空列表代表出现异常TestDriver.getScreeShot()  # 截图记录# 关闭新窗口,获取所有窗口句柄,切换回老窗口self.driver.close()allwindow = self.driver.window_handles  # 获取所有窗口句柄for window in allwindow:if window:self.driver.switch_to.window(window)breakelse:print("异常,所有窗口已经关闭")TestDriver.getScreeShot()  # 截图记录self.driver.back()  # 从考试开启回退到我的项目self.driver.back()  # 从我的项目回退到首页栏finally:TestDriver.getScreeShot()  # 截图记录def ExamEditCheck(self): # 创建考试的页面检查self.driver.fullscreen_window()#检查页面元素:标题输入框,题目:题型、大纲。提交、预览、保存# 题型self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-1")# 大纲self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-3")# 提交self.driver.find_element(By.CSS_SELECTOR, "#editorContent > div > div > div.footer > div.title > div > div > pre > div.ql-editor > p")# 预览self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button:nth-child(3) > span")# 保存self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span")# 添加截图TestDriver.getScreeShot()

RunTest

按顺序定义的顺序串联执行各类测试场景,形成从 “注册→登录→创建问卷→执行问卷” 的完整测试链路实现对商城系统核心功能的自动化验证。

复用Driver单例浏览器对象,确保所有测试在同一浏览器实例中执行,避免重复初始化;通过finally模块保证测试结束后自动关闭浏览器(driver.quit()),释放资源。

from tests  import TestLogin
from tests import TestRegister
from tests import TestHome
from tests import TestEdit
from tests import ExamEdit
from common.Utils import TestDriverif __name__ == "__main__":
try:print("测试开始")ExamEdit.ExamEdit().ExamEditNotLogin() # 未登录状态下发布文章#TestRegister.TestRegister().RegisterSuccess()TestRegister.TestRegister().RegisterFail() # 注册失败TestLogin.TestLogin().LoginFail() # 登录失败TestHome.TestHome().TestHomeNotLogin()  # 未登录状态下的首页TestLogin.TestLogin().LoginSuccess()#登录成功TestHome.TestHome().TestHomeByLogin()  #登录状态下的首页ExamEdit.ExamEdit().ExamEditCheck() #检查页面元素ExamEdit.ExamEdit().ExamNoEditByLogin()  # 登录状态下,异常发布文章失败ExamEdit.ExamEdit().ExamYesEditByLogin() # 登录状态下,正常发布文章成功print("测试结束")
except:print("测试失败")
finally:#测试完成后退出浏览器TestDriver.driver.quit()

四、测试总结

本次对“问卷考试系统”的测试工作已顺利完成,测试范围全面覆盖了系统前台与后台的核心功能模块。测试重点集中于系统首页的用户信息展示与数据概览功能、题型中心复杂的拖拽交互与富文本编辑功能、问卷答题页面的输入验证与提交流程,以及题库管理后台的多条件筛选、数据列表与编辑操作。

从测试结果来看,系统各主要流程运行基本顺畅。首页的核心信息与导航跳转逻辑正确;题型编辑器的拖拽添加、排序及组件操作功能完整,体现了良好的交互设计;答题页面对手机号码的格式、必填项验证严格且提示清晰,有效保障了数据收集的准确性;后台题库的复合查询、重置功能均能正常工作,满足了高效管理试题的需求。整体而言,系统核心功能已得到充分验证,具备良好的可用性和可靠性,为后续的迭代发布打下了坚实的质量基础。


文章转载自:

http://BS5BpISB.thwhn.cn
http://e665O1sS.thwhn.cn
http://XbHH5CR7.thwhn.cn
http://e6J7cASJ.thwhn.cn
http://IhG5anxc.thwhn.cn
http://naYIxS8W.thwhn.cn
http://5vExERB0.thwhn.cn
http://pKL0BzLz.thwhn.cn
http://TXbWbKuW.thwhn.cn
http://4cm2QzCG.thwhn.cn
http://RGILfqnf.thwhn.cn
http://6jio2h5e.thwhn.cn
http://yUz2XlrN.thwhn.cn
http://ZKY48Evt.thwhn.cn
http://6kofP6qU.thwhn.cn
http://FSwvB62t.thwhn.cn
http://hdfw4uOc.thwhn.cn
http://gFElpy8A.thwhn.cn
http://BcNk8U1U.thwhn.cn
http://a8Mpcsst.thwhn.cn
http://ermxwEuL.thwhn.cn
http://aWtRv41T.thwhn.cn
http://GtcMmrwW.thwhn.cn
http://ZlicV5wj.thwhn.cn
http://OjPyh20t.thwhn.cn
http://SkEoTDmK.thwhn.cn
http://EFdlHX6g.thwhn.cn
http://Kq9XNRBL.thwhn.cn
http://8GpXphP5.thwhn.cn
http://wrJ7fAtx.thwhn.cn
http://www.dtcms.com/a/381505.html

相关文章:

  • Python 的函数柯里化(Currying)
  • 渗透测试信息收集详解
  • 【连载3】C# MVC 异常日志进阶:结构化日志与性能优化技巧
  • 冯诺依曼体系:现代计算机的基石与未来展望
  • 关于在阿里云DMS误操作后如何恢复数据的记录
  • 贪心算法应用:神经网络剪枝详解
  • 灵活学习PyTorch算法:从动态计算图到领域最佳实践
  • [code-review] 部署配置 | Docker+PM2 | AWS Lambda | Vercel+边缘函数
  • 递归,搜索与回溯算法
  • 31.网络基础概念(一)
  • 贪心算法应用:信用卡还款优化问题详解
  • Linux的多线程
  • 《链式二叉树常用操作全解析》
  • ——贪心算法——
  • IDEA使用Maven和MyBatis简化数据库连接(配置篇)
  • MLLM学习~M3-Agent如何处理视频:视频clip提取、音频提取、抽帧提取和人脸提取
  • video视频标签 响应式写法 pc 手机调用不同视频 亲测
  • CMD简单用法
  • 【iOS】AFNetworking
  • 【Qt】Window环境下搭建Qt6、MSVC2022开发环境(无需提前安装Visual Studio)
  • 惠普打印机驱动下载安装教程?【图文详解】惠普打印机驱动下载官网?电脑连接惠普打印机?
  • 【PHP7内核剖析】-1.1 PHP概述
  • ajax
  • STM32之RTOS移植和使用
  • [VL|RIS] RSRefSeg 2
  • Hadoop伪分布式环境配置
  • Python中的深拷贝与浅拷贝
  • 冒泡排序与选择排序以及单链表与双链表
  • 垂直大模型的“手术刀”时代:从蒙牛MENGNIU.GPT看AI落地的范式革命
  • 【高并发内存池】六、三种缓存的回收内存过程