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

测试报告:“问卷考试系统”项目

目录

一、报告概述

(一)项目背景

(二)项目核心模块与测试目的

1、项目核心模块

2、测试目的

(三)测试环境

1、硬件环境

2、软件环境

(1)操作系统

(2)浏览器

(3)测试工具

二、测试用例

(一)用例图片截图

(二)用例图图片链接

三、手动测试

(一)注册页面功能

1、注册失败

2、注册成功

(二)登录页面功能

1、登录失败

2、登录成功

(三)系统首页功能

1、改变布局按钮

2、首页内容展示按钮

3、快捷键“创建问卷”按钮

(1)创建失败

(2)创建成功

4、快捷键“创建考试”按钮

 (1)创建失败

(2)创建成功

(四)页面设置功能

1、“整体风格设置”按钮

2、“用户登录”按钮

3、“退出登录”按钮

(五)我的项目页面功能

1、改变布局按钮

2、搜索框

 3、“新建”按钮

4、对项目进行操作

(六)我的练习页面功能

1、选择练习模块

2、查询功能

3、重置功能

4、对单个练习的操作

(1)查看结果

(2)二维码

(3)删除

(七)题库中心功能

1、我的题库页

(1)查询与重置

(2)新建

(3)对单个题库的操作

①、文本导入

②、单个试题编辑

③、题库信息编辑

④、删除

2、问题管理页

(1)查询与重置

(2)对单个问题进行编辑

(3)对多个问题进行编辑

        ①、批量编辑

        ②、批量删除

3、我的笔记页

(1)我的错题页

①、查询与重置

②、对单个错题进行编辑

(2)我的收藏页

(八)模板广场页面功能

1、搜索

2、添加模板

3、选择不同分类模板

4、选择不同性质的库

(九)用户管理页面功能

1、用户管理

(1)查询功能

(2)新建用户

(3)对单个用户进行操作

2、角色管理

3、组织机构

4、岗位设置

5、字典管理

6、个人设置

四、兼容性测试

(一)Edge浏览器

(二)Chrome浏览器

(三)ColorOS 15系统浏览器

五、自动化测试

(一)驱动类(Utils.py)

(二)自动化测试注册功能类(QES_RegisterTest.py)

(三)自动化测试登录功能类(QES_LoginTest.py)

(四)自动化测试首页功能类(QES_HomepageTest.py)

(五)自动化测试我的项目类(QES_MyProjectTest.py)

(六)自动化测试我的题库功能类(QES_MyQBankTest.py)

(七)自动化测试模板广场功能类(QES_TemplateSquareTest.py)

(八)自动化测试个人设置功能类(QES_PersonalSettingsTest.py)

(九)启动测试文件(RunTestFiles.py)

六、性能测试

(一)Postman

(二)Jmeter

1、前置配置

2、接口配置总览

(三)聚合报告

(四)吞吐量(Transactions per Second)

(五)响应时间(Response Times Over Time)       

(六)随时间变化的活跃线程状态(Active Threads Over Time)

(七)性能报告

1、Dashboard

2、Charts

(1)Over time

(2)Throughput

(3)Response Times

七、BUG描述

(一)文件夹BUG

1. 基本信息

2. 问题复现步骤

3. 预期结果

4. 实际结果

5. 附加信息

(二)按钮异常

1. 基本信息

2. 问题复现步骤

3. 预期结果

4. 实际结果

5. 附加信息

八、测试内容总结

(一)测试概述

(二)核心测试结果汇总

1、功能测试(手动)

2、兼容性测试

3、Python(Selenium库)自动化 UI 测试

4. 梯度压力测试

(三)性能问题深度分析

(四)整体结论

九、系统测试总结


一、报告概述

(一)项目背景

        在教育、企业培训、市场调研等众多领域,传统的考试与调研方式存在诸多弊端。教育领域中,学校组织考试往往需要耗费大量的人力来进行试卷印刷、考场安排、阅卷等工作,效率低下且成本较高;企业培训时,对员工的考核难以快速、精准地开展,培训效果的评估也缺乏便捷的手段;市场调研方面,传统的纸质问卷发放与回收耗时久,数据统计和分析也极为繁琐。

        随着互联网技术的飞速发展,线上化的解决方案成为趋势。为了满足各行业对于高效、便捷、精准的考试与调研需求,提升工作效率、降低成本并实现数据的快速统计与分析,我们着手开发了这款问卷考试系统。

        该系统旨在为用户提供一个集问卷创建、考试组织、练习训练、题库管理、模板资源利用以及系统权限与组织管理于一体的综合平台。通过该系统,教育机构能轻松组织线上考试,实现自动阅卷与成绩统计;企业可高效开展员工培训考核与市场调研;个人用户也能借助系统进行自主练习与学习管理,从而推动各领域的工作与学习向数字化、智能化方向发展。

(二)项目核心模块与测试目的

1、项目核心模块

        项目与练习模块:包含“我的项目"和“我的练习”,支持项目创建、编辑、管理以及练习答题与结果查看,满足考试与练习需求。

        题库管理模块:涵盖“题库中心“下的“我的题库”“问题管理”“我的笔记”,用于题库创建、题目增删改查、笔记记录等,为考试和练习提供题目资源支持。

        模板资源模块:即“模板广场”,提供各类问卷考试模板,方便用户快速创建项目或练习。

        系统管理模块:包含“用户管理““角色管理““组织机构”“岗位设置“字典管理”"个人设置”,用于系统用户、角色、组织架构、基础数据及个人账号的管理,保障系统安全与个性化使用。

        系统总览图如下所示:

2、测试目的

        ① 全面验证系统各功能模块(项目与练习、题库管理、模板广场、系统管理等)的功能完整性与正确性,确保其能按照需求正常运行,如项目创建、题目管理、模板使用、用户权限分配等功能均能准确实现。

        ② 检查系统界面交互的友好性与合理性,验证界面元素布局、操作反馈、动画效果等是否符合用户使用习惯,提升用户操作体验。

        ③ 测试系统在不同浏览器(如 Chrome、firefox)、不同设备(PC、平板等)环境下的兼容3性,确保系统在各类常见环境中均可稳定运行,无界面错乱、功能异常等问题。

        ④ 排查系统可能存在的漏洞与缺陷,如权限漏洞、数据处理错误、交互逻辑漏洞等,保障系统的安全性与稳定性,防止因漏洞导致的用户数据泄露、功能异常等情况。

        ⑤ 确保系统能高效、精准地支持教育、企业、个人等各类用户场景下的问卷创建、考试组织、练习训练、题库管理等核心业务,为用户提供流畅、可靠的线上考试与调研体验,助力各领域工作与学习的数字化、智能化发展。

(三)测试环境

1、硬件环境

        普通 PC 机(满足日常软件运行的基础硬件配置即可,如 Intel i5 及以上处理器、、8GB 及以上内存、256GB 及以上存储空间)。

2、软件环境

(1)操作系统

        Windows 11 专业版 23H2

(2)浏览器

        Google Chrome - 版本 139.0.7258.155 (正式版本) (64 位)

        Microsoft Edge - 139.0.3405.125 (正式版本) (64 位)

(3)测试工具

        UI自动化测试工具:Python - 版本 3.8.0,Selenium - 版本 4.0.0

        性能测试工具:JMeter - 版本 5.6.3

        接口测试工具:Postman - 版本 11.38.4

二、测试用例

        测试用例图如下所示,由于图片过大,图片将以截图与链接的形式展示:

(一)用例图片截图


        


(二)用例图图片链接

        问卷考试系统测试用例图:https://www.kdocs.cn/l/cgols06jDmgu

三、手动测试

(一)注册页面功能

1、注册失败

        ① 无输入,如下图所示:

        ② 部分无输入,如下图所示:

        ③ 重复注册,如下图所示:

2、注册成功

        注册成功后会提示注册成功,并且会自动跳转到登录页


(二)登录页面功能

1、登录失败

        ① 无输入

        ② 部分输入

        ③ 输入错误的账号密码

2、登录成功

        登录成功后,会跳转到首页,并且提示登录成功,如下图所示:


(三)系统首页功能

1、改变布局按钮

        测试改变菜单布局按钮,点击后如下图所示,再次点击后会复原为原样:

2、首页内容展示按钮

        点击对应的“我的考试”,“我的问卷”,“问卷记录”,“考试记录”按钮即可改变首页展示内容,如下图所示:

3、快捷键“创建问卷”按钮

(1)创建失败

        点击“创建问卷”按钮后,未点击保存按钮,直接返回首页,如下图所示:

(2)创建成功

        点击“创建问卷”按钮后,点击保存按钮,会提示保存成功,如下图所示:

4、快捷键“创建考试”按钮

(1)创建失败

        点击“创建考试”按钮后,未点击保存按钮,直接返回首页,如下图所示:

(2)创建成功

        点击“创建考试”按钮后,点击保存按钮,会提示保存成功,如下图所示:


(四)页面设置功能

1、“整体风格设置”按钮

2、“用户登录”按钮

        点击该按钮后会跳转到“系统设置”下属的“个人设置”页中,如下图所示:

3、“退出登录”按钮

        点击该按钮后会跳转至登录页,如下图所示:


(五)我的项目页面功能

1、改变布局按钮

        点击后会改变项目的显示布局:

2、搜索框

        输入内容后点击放大镜状的按钮即可进行搜索:

3、“新建”按钮

        点击“新建”按钮后会展示以下功能,点击相应功能后都可以进行相应的操作:

4、对项目进行操作

        点击对应的按钮可以进行操作,其中移动按钮可以指定移动到哪个文件夹:

        其中下方栏与在点击“新建”-“问卷调查”后,创建问卷处左侧栏的功能一致:


(六)我的练习页面功能

1、选择练习模块

        点击以下图片的按钮后,可以使“我的练习”页面显示不同的模块:

2、查询功能

        选择好状态后,点击“查询”按钮即可:

3、重置功能

        点击重置按钮,会显示所有状态的练习内容:

4、对单个练习的操作

(1)查看结果

        点击“查看结果”按可以看到答题的情况:

(2)二维码

        将鼠标移动到“二维码”按钮上,无需点击可以显示出二维码:

(3)删除

        点击删除按钮后,弹出提示框,会确认是否删除练习:

(七)题库中心功能

1、我的题库页

(1)查询与重置

        输入题库名称和选择好类型后,点击查询按钮即可进行查询:

        想要实现重置,直接点击“重置”按钮即可

(2)新建

        点击新建按钮后,会从侧边弹出需要填写的信息,填写完后再点击确定按钮后即可完成新建题库:

(3)对单个题库的操作

①、文本导入

        点击文本导入按钮后进入文本导入界面,填写好需要导入的文本后,点击“添加”按钮即可完成:

②、单个试题编辑

        点击“试题管理”后,会进入试题管理页面,对单个题库中的问题进行编辑,也可以在选择好问题后再进行编辑:

        再次点击“编辑”按钮后进入问题编辑页面,完成编辑后点击保存即可完成,同时退回至上一页面并给出编辑成功的提示:

③、题库信息编辑

        将鼠标移动到要“...”后,弹出“编辑”按钮,点击后会弹出编辑题库的提示,填入信息后,点击“确定”后即可:

④、删除

        点击“删除”按钮后,会给出提示框,再次选择“删除”后,即可把题库删除掉:

2、问题管理页

(1)查询与重置

        输入类型、题型、名称、标签后,点击查询按钮即可进行查询:

        想要实现重置,直接点击“重置”按钮即可。

(2)对单个问题进行编辑

        点击编辑按钮后,进入编辑页面,编辑完成后点击保存,会退回上一页面,并且会进行提示:

        

(3)对多个问题进行编辑
①、批量编辑

        勾选多个问题后,可以进行批量编辑,在选择批量编辑后会进入编辑页面,完成编辑后点击保存,会返回前一个页面并提示编辑成功。

②、批量删除

        勾选多个问题后,可以进行批量删除,点击批量删除按钮后,会给出提示框,再次点击删除后即可进行删除:

3、我的笔记页

(1)我的错题页

①、查询与重置

        输入问题标题、笔记、创建时间后,点击查询按钮即可进行查询:

        想要实现重置,直接点击“重置”按钮即可。

②、对单个错题进行编辑

        点击删除按钮后,再次点击“OK”即可进行删除

(2)我的收藏页

        输入问题标题与创建时间后可以进行查询,再次点击重置按钮即可显示所有的收藏问题。


(八)模板广场页面功能

1、搜索

        输入模板名称后点击搜索按钮即可

2、添加模板

        点击添加模板按钮后,会进入编辑页面,完成编辑后点击保存,再次选择保存到的模板库,再次点击“保存”按钮,会停留在编辑页面并且提示保存成功:

3、选择不同分类模板

        点击选择分类中的不同内容即可呈现出来:

4、选择不同性质的库

        可以点击公有库与私有库进行选择:


(九)用户管理页面功能

1、用户管理

(1)查询功能

        输入姓名后,点击查询按钮即可:

        若要重置当前的查询结构,点击“重置”按钮即可。

(2)新建用户

        点击新建按钮后会弹出新建内容界面,编辑好内容后点击“确定”按钮后完成新建。

(3)对单个用户进行操作

        点击后可以进行用户信息编辑,重置密码与删除用户。

2、角色管理

        可以进行查询、重置、新建、对单个角色进行操作:

3、组织机构

        可以进行新建操作:

4、岗位设置

        可以进行查询、重置、新建、对单个角色进行操作:     

5、字典管理

        可以进行查询、重置、新建、对单个角色进行操作: 

6、个人设置

        可以更改账户信息、设置密码、更改系统信息:


四、兼容性测试

本次兼容性测试用到的场景有:

  • Edge 版本 139.0.3405.125 (正式版本) (64 位)
  • Chrome 版本 139.0.7258.155 (正式版本) (64 位)
  • ColorOS 15系统

    (一)Edge浏览器

            流程运行,无显示错误、布局正常,各项功能正常:

    (二)Chrome浏览器

            流程运行,无显示错误、布局正常,各项功能正常:

    (三)ColorOS 15系统浏览器

            流程运行,无显示错误、布局正常,各项功能正常:


    五、自动化测试

            项目结构如下图所示:

    注:QES的全称是Questionnaire and Examination System,即“问卷考试系统”

    (一)驱动类(Utils.py)

            代码如下所示:

    import os
    import sys
    import datetime
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service#创建浏览器对象
    class Driver:driver = ""def __init__(self):#浏览器配置options = webdriver.ChromeOptions()options.add_argument("--start-maximized")  # 最大化窗口# 打开浏览器的服务(通过chrome驱动打开(安装驱动)),选择浏览器配置self.driver = webdriver.Chrome(service=Service(r"E:\chromedriver-win64\chromedriver.exe"),options=options)def getScreenshot(self):#创建屏幕截图#图片路径dirname = datetime.datetime.now().strftime("%Y-%m-%d")#判断dirname文件夹是否已经存在,若不存在则创建文件夹if not os.path.exists("../ScreenshotImages/" + dirname):os.mkdir("../ScreenshotImages/" + dirname)#调用方法+当前时间组成截图名称filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"#保存位置self.driver.save_screenshot("../ScreenshotImages/" + dirname + "/" + filename)QES_Driver = Driver()

    (二)自动化测试注册功能类(QES_RegisterTest.py)

            代码如下所示:

    import datetime
    from common.Utils import QES_Driver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait
    from selenium.webdriver.common.keys import Keys# 测试注册页面
    class QES_Register:url = ""driver = ""# 打开网址def __init__(self):self.url = "http://8.155.1.153:8081/user/register"self.driver = QES_Driver.driverself.driver.get(self.url)# 增加页面加载等待self.driver.implicitly_wait(10)  # 全局隐式等待# 清除输入框内容def RegisterClearTest(self):midname = self.driver.find_element(By.CSS_SELECTOR, "#name")midusername = self.driver.find_element(By.CSS_SELECTOR, "#username")midpassword = self.driver.find_element(By.CSS_SELECTOR, "#password")midrePassword = self.driver.find_element(By.CSS_SELECTOR, "#rePassword")midname.send_keys(Keys.CONTROL, 'a')midname.send_keys(Keys.DELETE)midusername.send_keys(Keys.CONTROL, 'a')midusername.send_keys(Keys.DELETE)midpassword.send_keys(Keys.CONTROL, 'a')midpassword.send_keys(Keys.DELETE)midrePassword.send_keys(Keys.CONTROL, 'a')midrePassword.send_keys(Keys.DELETE)# 测试成功注册def RegisterSucTest(self):name = "自动化测试注册姓名账号" + datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(name)self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(name)self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()user = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span")))actualUser = user.text.strip()  # 去除可能的空格# print(actualUser)assert actualUser == "登 录"# 进行截图QES_Driver.getScreenshot()# 测试登录失败(1):再次输入正常注册过的信息:姓名:zybin,账号:admin,密码:123456,密码确认:123456def RegisterFailTest1(self):self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zybin")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, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败# 等待密码错误提示出现并获取文本username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div")))actualPassword = username_error.text.strip()  # 去除可能的空格assert actualPassword == "账号已存在"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(2):姓名,账号,密码,密码确认全空def RegisterFailTest2(self):self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败name_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#name_help > div")))actualName = name_error.text.strip()  # 去除可能的空格assert actualName == "用户名是必填项!"username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "登录账号不能为空"password_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#password_help > div")))actualPassword = password_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"rePassword_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#rePassword_help > div")))actualRePassword = rePassword_error.text.strip()  # 去除可能的空格assert actualRePassword == "请再次输入密码"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(3):姓名,密码为空def RegisterFailTest3(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败name_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#name_help > div")))actualName = name_error.text.strip()  # 去除可能的空格assert actualName == "用户名是必填项!"password_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#password_help > div")))actualPassword = password_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(4):姓名,账号为空def RegisterFailTest4(self):self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败name_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#name_help > div")))actualName = name_error.text.strip()  # 去除可能的空格assert actualName == "用户名是必填项!"username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "登录账号不能为空"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(5):账号,密码,密码确认为空def RegisterFailTest5(self):self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zybin")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "登录账号不能为空"password_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#password_help > div")))actualPassword = password_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"rePassword_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#rePassword_help > div")))actualRePassword = rePassword_error.text.strip()  # 去除可能的空格assert actualRePassword == "请再次输入密码"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(6):姓名,密码,密码确认为空def RegisterFailTest6(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败name_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#name_help > div")))actualName = name_error.text.strip()  # 去除可能的空格assert actualName == "用户名是必填项!"password_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#password_help > div")))actualPassword = password_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"rePassword_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#rePassword_help > div")))actualRePassword = rePassword_error.text.strip()  # 去除可能的空格assert actualRePassword == "请再次输入密码"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(7):姓名,账号,密码为空def RegisterFailTest7(self):self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()# 证明登录失败name_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#name_help > div")))actualName = name_error.text.strip()  # 去除可能的空格assert actualName == "用户名是必填项!"username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "登录账号不能为空"password_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#password_help > div")))actualPassword = password_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"# 添加屏幕截图QES_Driver.getScreenshot()# #开始测试
    # QES_Register = QES_Register()
    # QES_Register.RegisterFailTest1()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest2()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest3()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest4()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest5()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest6()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterFailTest7()
    # QES_Register.RegisterClearTest()
    # QES_Register.RegisterSucTest()

    (三)自动化测试登录功能类(QES_LoginTest.py)

            代码如下:

    import time
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from common.Utils import QES_Driver
    from selenium.webdriver.common.keys import Keys# 测试登录页面
    class QES_Login:url = ""driver = ""# 打开网址def __init__(self):self.url = "http://8.155.1.153:8081/user/login"self.driver = QES_Driver.driverself.driver.get(self.url)# 增加页面加载等待self.driver.implicitly_wait(10)  # 全局隐式等待# 测试登录失败(1):账号为空 / 密码为空def LoginFailTest1(self):self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()# 证明登录失败# 等待用户名错误提示出现并获取文本username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "用户名是必填项!"# 等待密码错误提示出现并获取文本username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))actualPassword = username_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(2):账号为空 / 密码不空def LoginFailTest2(self):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()# 证明登录失败# 等待用户名错误提示出现并获取文本username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))actualUsername = username_error.text.strip()  # 去除可能的空格assert actualUsername == "用户名是必填项!"# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(3):账号不空 / 密码为空def LoginFailTest3(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()# 证明登录失败# 等待密码错误提示出现并获取文本username_error = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))actualPassword = username_error.text.strip()  # 去除可能的空格assert actualPassword == "密码是必填项!"# 添加屏幕截图QES_Driver.getScreenshot()# 证明错误def LoginProveErr(self):# 证明登录失败actual = 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").text# 断言检查assert actual == "错误的用户名和密码"# 测试登录失败(4):账号错误 / 密码正确:账号:aaa,密码:123456def LoginFailTest4(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("aaa")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.LoginProveErr()# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(5):账号正确 / 密码错误:账号:admin,密码:123def LoginFailTest5(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()# 证明登录失败self.LoginProveErr()# 添加屏幕截图QES_Driver.getScreenshot()# 测试登录失败(6):账号错误 / 密码错误:账号:adminn,密码:123def LoginFailTest6(self):self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("adminn")self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()# 证明登录失败self.LoginProveErr()# 添加屏幕截图QES_Driver.getScreenshot()# 测试成功登录def LoginSucTest(self):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()#证明登录成功:找到目标元素则证明成功user = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((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)")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "Admin"time.sleep(3)# 进行截图QES_Driver.getScreenshot()#清除输入框内容def LoginClearTest(self):# 选择目标输入框midusername = self.driver.find_element(By.CSS_SELECTOR, "#username")midpassword = self.driver.find_element(By.CSS_SELECTOR, "#password")# 控制键盘全选,然后进行删除midusername.send_keys(Keys.CONTROL, 'a')midusername.send_keys(Keys.DELETE)midpassword.send_keys(Keys.CONTROL, 'a')midpassword.send_keys(Keys.DELETE)# # 测试开始
    # QES_login = QES_Login()
    #
    # #登录失败与成功测试
    # QES_login.LoginFailTest1()
    # QES_login.LoginFailTest2()
    # QES_login.LoginClearTest()
    # QES_login.LoginFailTest3()
    # QES_login.LoginClearTest()
    # QES_login.LoginFailTest4()
    # QES_login.LoginClearTest()
    # QES_login.LoginFailTest5()
    # QES_login.LoginClearTest()
    # QES_login.LoginFailTest6()
    # QES_login.LoginClearTest()
    # QES_login.LoginSucTest()

    (四)自动化测试首页功能类(QES_HomepageTest.py)

            代码如下所示:

    import random
    import time
    from common.Utils import QES_Driver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.support.wait import WebDriverWait# 测试首页页面
    class QES_Homepage:url = ""driver = ""# 打开网址def __init__(self):self.url = "http://8.155.1.153:8081/home"self.driver = QES_Driver.driver# self.driver.get(self.url)# 测试菜单栏变化按钮def LayoutButtonTest(self):self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > aside > div > div.ant-pro-sider-collapsed-button > svg > path").click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(0.5)self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > aside > div > div.ant-pro-sider-collapsed-button.ant-pro-sider-collapsed-button-collapsed > svg").click()# 添加屏幕截图QES_Driver.getScreenshot()# 测试首页内容变化的四个按钮def SwitchContentTest(self):self.driver.get(self.url)user = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((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)")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "Admin"self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-0-tab-survey").click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(0.5)self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-0-tab-surveyHistory").click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(0.5)self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-0-tab-examHistory").click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(0.5)self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-0-tab-exam").click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(0.5)# 测试创建问卷成功def CreateQuestionnaireSucTest(self):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)").click()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()# 添加屏幕截图QES_Driver.getScreenshot()self.driver.back()self.driver.back()time.sleep(1)# 测试创建问卷失败def CreateQuestionnaireFailTest(self):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)").click()self.driver.back()time.sleep(1)# 测试创建考试失败def CreateExamFailTest(self):# 刷新首页并等待页面完全渲染self.driver.get(self.url)user = WebDriverWait(self.driver, 50).until(EC.visibility_of_element_located((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)")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "Admin"# 点击我的考试按钮WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((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.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.back()# 测试创建考试成功def CreateExamSucTest(self):# 刷新首页并等待页面完全渲染self.driver.get(self.url)user = WebDriverWait(self.driver, 50).until(EC.visibility_of_element_located((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)")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "Admin"# 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()# 点击创建考试按钮WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((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)# 点击保存按钮WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located((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"))).click()# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(1)self.driver.back()self.driver.back()time.sleep(1)# 进行首页元素的查找检查def CheckElement(self):# 检查首页标题元素self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div")# 检查问卷数元素self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(1) > div > div.ant-statistic-title")# 检查考试数元素self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(2) > div > div.ant-statistic-title")# 检查我的考试按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-exam")# 检查我的问卷按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-survey")# 检查问卷记录按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-surveyHistory")# 检查考试记录按钮self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-examHistory")# 检查创建问卷按钮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)")# 添加屏幕截图QES_Driver.getScreenshot()

    (五)自动化测试我的项目类(QES_MyProjectTest.py)

            代码如下:(因为数据过多,该类实例化后从数据区获取数据到渲染页面的速度会较慢)

    import time
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver import Keys
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.wait import WebDriverWait
    from common.Utils import QES_Driverclass QES_MyProject:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/project"self.driver = QES_Driver.driverself.driver.get(self.url)#进行页面元素的查找检查def ProjectCheckElement(self):#检查页面标题元素self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div > span")#检查新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")#检查搜索框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input")#检查搜索按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg")# 添加屏幕截图QES_Driver.getScreenshot()# 测试新建问卷失败def CreateQuestionnaireFailTest(self):# 点击新建按钮self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()# 新建问卷self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(7) > div > div > ul > li:nth-child(1)").click()time.sleep(1)# 保存截图# QES_Driver.getScreenshot()# 返回到项目页面self.driver.back()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 测试新建问卷成功def CreateQuestionnaireSucTest(self):# 点击新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()# 新建问卷WebDriverWait(self.driver, 50).until(EC.visibility_of_element_located((By.XPATH,"/html/body/div[4]/div/div/ul/li[1]/span"))).click()time.sleep(1)
    #         保存截图QES_Driver.getScreenshot()# 点击保存按钮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").click()# 添加屏幕截图QES_Driver.getScreenshot()# 返回到项目页面self.driver.back()self.driver.back()time.sleep(1)#添加屏幕截图QES_Driver.getScreenshot()def SearchQuestionnaireTest(self):# 回到我的项目页面self.driver.get(self.url)user = WebDriverWait(self.driver, 50).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li.ant-menu-item.ant-menu-item-selected.ant-menu-item-only-child.ant-pro-base-menu-menu-item > span > div > span.ant-pro-base-menu-item-text.ant-pro-base-menu-item-text-has-icon")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "我的项目"time.sleep(15)self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/span/span/input").send_keys("请输入标题")#添加屏幕截图QES_Driver.getScreenshot()time.sleep(1)#点击查询按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button").click()time.sleep(1)#检查是否查询成功同时验证刚刚新建功能是否保存成功actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div/div[1]/span[1]").textprint(f"提示信息: {actual}")#添加屏幕截图QES_Driver.getScreenshot()#断言检测一下是否符合预期assert actual == "请输入标题"def CreateExamFailTest(self):# 点击新建按钮self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()# 添加屏幕截图QES_Driver.getScreenshot()# 选择新建在线考试self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(7) > div > div > ul > li:nth-child(2) > span").click()time.sleep(1)time.sleep(1)self.driver.back()# 添加屏幕截图QES_Driver.getScreenshot()def CreateExamSucTest(self):self.driver.get(self.url)user = WebDriverWait(self.driver, 50).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li.ant-menu-item.ant-menu-item-selected.ant-menu-item-only-child.ant-pro-base-menu-menu-item > span > div > span.ant-pro-base-menu-item-text.ant-pro-base-menu-item-text-has-icon")))actualUser = user.text.strip()  # 去除可能的空格assert actualUser == "我的项目"time.sleep(15)#点击新建按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()# 添加屏幕截图QES_Driver.getScreenshot()#选择新建在线考试self.driver.find_element(By.CSS_SELECTOR, "body > div:nth-child(7) > div > div > ul > li:nth-child(2) > span").click()time.sleep(1)#添加屏幕截图QES_Driver.getScreenshot()#点击保存按钮self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[5]").click()time.sleep(1)#添加屏幕截图QES_Driver.getScreenshot()#返回到项目页面self.driver.back()self.driver.back()#添加屏幕截图QES_Driver.getScreenshot()def SearchExamTest(self):#测试项目查询功能time.sleep(20)self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").send_keys("考试名称")#添加屏幕截图QES_Driver.getScreenshot()#点击查询按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button").click()# 添加屏幕截图QES_Driver.getScreenshot()#检查是否查询成功同时验证刚刚新建功能是否保存成功actual = 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-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div:nth-child(1) > div > div > div > div > div > div.card-header > span.survey-title").textprint(f"项目名称: {actual}")#添加屏幕截图QES_Driver.getScreenshot()#断言检测一下是否符合预期assert actual == "考试名称"def CreatedirectorySucTest(self):self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(9) > div > div > ul > li:nth-child(6) > span").click()self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("自动化测试创建文件夹") #+ datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S"))self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(10) > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary").click()def SearchdirectoryTest(self):# 测试项目查询功能# time.sleep(20)# 清除输入框midInput = self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input")midInput.send_keys(Keys.CONTROL, 'a')midInput.send_keys(Keys.DELETE)# 输入框搜索self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").send_keys("自动化测试创建文件夹")time.sleep(5)# 添加屏幕截图QES_Driver.getScreenshot()# 点击查询按钮self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button").click()# 添加屏幕截图QES_Driver.getScreenshot()# 检查是否查询成功同时验证刚刚新建功能是否保存成功actual = 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-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div:nth-child(1) > div > div > div > div > div.folder-name > button").textprint(f"项目名称: {actual}")# 添加屏幕截图QES_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "自动化测试创建文件夹"

    (六)自动化测试我的题库功能类(QES_MyQBankTest.py)

            代码如下:

    import time
    from selenium.webdriver.common.by import By
    from common.Utils import QES_Driverclass QES_QuestionBank:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/repo/index"self.driver = QES_Driver.driverself.driver.get(self.url)#进行页面元素的查找检查def CheckElement(self):#检查名称输入标签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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-label > label")#检查名称输入框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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-control > div > div > span")#检查类型选择框标签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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div: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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button")#检查查询按钮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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")#检查新建按钮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:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button")#检查导出按钮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:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(2) > button")#检查题库列表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:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-pro-table-list-toolbar-left > div")#检查文本导入按钮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:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(1) > a")#检查试题管理按钮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:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(3) > a")#添加屏幕截图QES_Driver.getScreenshot()#功能测试def CreateQBankTest(self):#测试新建功能#点击新建按钮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:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button").click()# 添加屏幕截图QES_Driver.getScreenshot()# 切换到点击新建之后的页面之中,因为新建之后的页面里面的元素的id和没点击新建的时候的元素是一样的,所以要限制一下查找元素的范围drawer = self.driver.find_element(By.CLASS_NAME,"ant-drawer-wrapper-body")#后续使用drawer 进行查找元素操作,意思就是在ant-drawer-body元素范围内进行查找元素drawer.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试新增题库")# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(3)#选择题库类型drawer.find_element(By.CSS_SELECTOR, "#mode").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()#选择问卷select_option= drawer.find_element(By.CLASS_NAME,"rc-virtual-list-holder-inner")option = select_option.find_element(By.XPATH,f'.//div[@title="问卷"]')self.driver.execute_script("arguments[0].scrollIntoView(true);",option)self.driver.execute_script("arguments[0].click();", option)# 这里并不是一个select组件,不能直接使用Selecttime.sleep(2)# 添加屏幕截图QES_Driver.getScreenshot()time.sleep(1)#点击确定按钮drawer.find_element(By.XPATH, "/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button").click()# 添加屏幕截图QES_Driver.getScreenshot()#检查是否回到题库列表页面,如果是则创建题库成功,否则创建失败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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")# 添加屏幕截图QES_Driver.getScreenshot()def SearchQBankTest(self):#测试查询功能#名称输入框输入题库名称“测试新增题库功能”self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试新增题库")# 添加屏幕截图QES_Driver.getScreenshot()#点击查询按钮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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()#验证是否查询到,如果题库列表有输出则查询成功,否则查询失败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:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr.ant-table-row.ant-table-row-level-0 > td:nth-child(1) > div")time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()def ResetQBankTest(self):#点击重置按钮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-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()#验证是否重置成功,如果名称输入框为空则代表重置成功,否则重置失败actual = self.driver.find_element(By.CSS_SELECTOR, "#name").text# 添加屏幕截图QES_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == ""

    (七)自动化测试模板广场功能类(QES_TemplateSquareTest.py)

            代码如下:

    import time
    from selenium.webdriver.common.by import By
    from common.Utils import QES_Driverclass QE_TemplateTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/template"self.driver = QES_Driver.driverself.driver.get(self.url)#进行页面元素的查找检查def CheckElement(self):# 检查页面标题self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > div > span")# 检查模板名字检索框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input")# 检查搜模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > span > button")# 检查添加模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")# 检查公有库按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-footer > div > div.ant-tabs-nav > div.ant-tabs-nav-wrap > div > div.ant-tabs-tab.ant-tabs-tab-active")# 检查私有库按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-footer > div > div.ant-tabs-nav > div.ant-tabs-nav-wrap > div > div: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-card > div > form > div:nth-child(1) > div.label___12r3x > span")# 检查标签标签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-card > div > form > div:nth-child(2) > div.label___12r3x > span")#添加屏幕截图QES_Driver.getScreenshot()def AddTemplateTest(self):# 测试添加模板功能# 点击添加模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()#点击保存按钮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(5)").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 输入新增模板名称self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试添加模板")# 添加屏幕截图QES_Driver.getScreenshot()# 分类输入self.driver.find_element(By.CSS_SELECTOR, "#category").send_keys("测试")# 添加屏幕截图QES_Driver.getScreenshot()# 选择添加到公有库self.driver.find_element(By.CSS_SELECTOR, "#survey-modal-container > div > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-body > form > div:nth-child(4) > div > div > div > div > label > span.ant-checkbox > input").click()# 添加屏幕截图QES_Driver.getScreenshot()# 点击保存按钮self.driver.find_element(By.CSS_SELECTOR, "#survey-modal-container > div > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary").click()time.sleep(5)# 添加屏幕截图QES_Driver.getScreenshot()# 点击关闭按钮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.ant-btn-dangerous").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 验证是否添加模板成功actual = self.driver.find_element(By.XPATH, "//*[contains(text(),'自动化测试添加模板')]").textprint(f"找到的文本内容: {actual}")#断言检测一下是否符合预期assert "自动化测试添加模板" in actualdef SearchTemplateTest(self):# 测试模板名字检索功能# 模板检索框中输入模板名字“测试添加模板功能”self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input").send_keys("自动化测试添加模板")# 添加屏幕截图QES_Driver.getScreenshot()# 点击搜模板按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > span > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 验证是否检索成功# 若搜索出显示”暂无数据“则说明搜索功能异常,反之搜索功能成功actual = self.driver.find_element(By.XPATH, "//*[contains(text(),'暂无数据')]").textprint(f"找到的文本内容: {actual}")# 断言检测一下是否符合预期assert "暂无数据" in actual
    

    (八)自动化测试个人设置功能类(QES_PersonalSettingsTest.py)

            代码如下所示:

    import timefrom selenium.webdriver import Keys
    from selenium.webdriver.common.by import Byfrom common.Utils import QES_Driver#测试问卷考试系统个人设置页面class QE_PersonalTest:url = ""driver = ""def __init__(self):self.url = "http://8.155.1.153:8081/system/setting"self.driver = QES_Driver.driverself.driver.get(self.url)#进行页面元素的查找检查def CheckElement(self):# 检查页面标题self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.title___3cGwa")# 检查更换头像按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.right___3-EXe > span > div > span > div > button")# 检查姓名标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-label > label")# 检查姓名输入框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-control > div > div > span")# 检查手机号标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-label > label")# 检查手机号输入框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-control > div > div > span")# 检查邮箱标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-label > label")# 检查邮箱输入框self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-control > div > div > span")# 检查个人简介标签self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(5) > div > div.ant-col.ant-form-item-label > label")# 检查个人简介输入框self.driver.find_element(By.CSS_SELECTOR, "#profile")# 检查提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")# 添加屏幕截图QES_Driver.getScreenshot()#更新信息成功的测试用例def PersonalUpdateSucTest(self):#输入姓名self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin")#输入手机号self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("18027612222")#输入邮箱self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("2805121286@163.com")#输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试更新个人基本信息功能")#点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()# 添加屏幕截图QES_Driver.getScreenshot()#验证是否更新成功#通过页面右上角的用户名来验证actual = 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:nth-child(2)").textprint(f"姓名: {actual}")#添加屏幕截图QES_Driver.getScreenshot()#断言检测一下是否符合预期assert actual == "Admin"# 更新信息失败的测试用例def PersonalUpdateFailTest1(self):#测试用例一:不输入姓名,其他信息正常输入#输入手机号self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("18027612222")#输入邮箱self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("2805121286@163.com")#输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试更新个人基本信息功能")#点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()#验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图QES_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的昵称!"def PersonalUpdateFailTest2(self):# 测试用例二:不输入手机号,其他信息正常输入#输入姓名self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Adminbin")#输入邮箱self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("2805121286@163.com")#输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试更新个人基本信息功能")# 点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#phone_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图QES_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的联系电话!"def PersonalUpdateFailTest3(self):# 测试用例三:不输入邮箱,其他信息正常输入#输入姓名self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Adminbin")#输入手机号self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("18027612222")#输入个人简介self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试更新个人基本信息功能")# 点击提交按钮self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()time.sleep(1)# 添加屏幕截图QES_Driver.getScreenshot()# 验证是否更新失败actual = self.driver.find_element(By.CSS_SELECTOR, "#email_help > div").textprint(f"提示信息: {actual}")# 添加屏幕截图QES_Driver.getScreenshot()# 断言检测一下是否符合预期assert actual == "请输入您的邮箱!"# 清除输入框内容def PersonalMesClearTest(self):midname = self.driver.find_element(By.CSS_SELECTOR, "#name")midphone = self.driver.find_element(By.CSS_SELECTOR, "#phone")midemail = self.driver.find_element(By.CSS_SELECTOR, "#email")midreprofile = self.driver.find_element(By.CSS_SELECTOR, "#profile")midname.send_keys(Keys.CONTROL, 'a')midname.send_keys(Keys.DELETE)midphone.send_keys(Keys.CONTROL, 'a')midphone.send_keys(Keys.DELETE)midemail.send_keys(Keys.CONTROL, 'a')midemail.send_keys(Keys.DELETE)midreprofile.send_keys(Keys.CONTROL, 'a')midreprofile.send_keys(Keys.DELETE)

    (九)启动测试文件(RunTestFiles.py)

            代码如下:

    import time
    from common.Utils import QES_Driver
    from tests import QES_LoginTest
    from tests import QES_RegisterTest
    from tests import QES_HomepageTest
    from tests import QES_MyProjectTest
    from tests import QES_MyQBankTest
    from tests import QES_TemplateSquareTest
    from tests import QES_PersonalSettingsTestif __name__ == "__main__":# 测试注册QES_Register = QES_RegisterTest.QES_Register()QES_Register.RegisterFailTest1()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest2()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest3()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest4()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest5()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest6()QES_Register.RegisterClearTest()QES_Register.RegisterFailTest7()QES_Register.RegisterClearTest()QES_Register.RegisterSucTest()# 测试登录QES_login = QES_LoginTest.QES_Login()QES_login.LoginFailTest1()QES_login.LoginFailTest2()QES_login.LoginClearTest()QES_login.LoginFailTest3()QES_login.LoginClearTest()QES_login.LoginFailTest4()QES_login.LoginClearTest()QES_login.LoginFailTest5()QES_login.LoginClearTest()QES_login.LoginFailTest6()QES_login.LoginClearTest()QES_login.LoginSucTest()#首页测试QES_Homepage = QES_HomepageTest.QES_Homepage()QES_Homepage.CheckElement()QES_Homepage.LayoutButtonTest()QES_Homepage.SwitchContentTest()QES_Homepage.CreateQuestionnaireFailTest()time.sleep(1)QES_Homepage.CreateQuestionnaireSucTest()time.sleep(1)QES_Homepage.CreateExamFailTest()time.sleep(1)QES_Homepage.CreateExamSucTest()time.sleep(1)# 我的项目页面测试QES_MyProject = QES_MyProjectTest.QES_MyProject()QES_MyProject.ProjectCheckElement()QES_MyProject.CreateQuestionnaireFailTest()QES_MyProject.CreateQuestionnaireSucTest()QES_MyProject.SearchQuestionnaireTest()QES_MyProject.CreateExamFailTest()QES_MyProject.CreateExamSucTest()QES_MyProject.SearchExamTest()QES_MyProject.CreatedirectorySucTest()QES_MyProject.SearchdirectoryTest()# 题库中心-我的题库页面测试QES_MyQBank = QES_MyQBankTest.QES_QuestionBank()QES_MyQBank.CheckElement()QES_MyQBank.CreateQBankTest()QES_MyQBank.SearchQBankTest()QES_MyQBank.ResetQBankTest()# 模板广场页面测试QES_TemplateSquare = QES_TemplateSquareTest.QE_TemplateTest()QES_TemplateSquare.CheckElement()QES_TemplateSquare.AddTemplateTest()QES_TemplateSquare.SearchTemplateTest()# 个人设置页面测试QES_PersonalSettings = QES_PersonalSettingsTest.QE_PersonalTest()QES_PersonalSettings.CheckElement()QES_PersonalSettings.PersonalMesClearTest()QES_PersonalSettings.PersonalUpdateFailTest1()QES_PersonalSettings.PersonalMesClearTest()QES_PersonalSettings.PersonalUpdateFailTest2()QES_PersonalSettings.PersonalMesClearTest()QES_PersonalSettings.PersonalUpdateFailTest3()QES_PersonalSettings.PersonalMesClearTest()QES_PersonalSettings.PersonalUpdateSucTest()#指定浏览器退出QES_Driver.driver.quit()

            运行结果如下所示:

            运行过程截图如下所示:

    六、性能测试

    测试工具介绍:


            在本次系统测试中,使用了 JMeter 与 Postman 两款工具,二者分工明确,其中 JMeter 承担核心测试任务,Postman 起辅助支撑作用。

    • JMeter:核心用于模拟大量用户并发访问系统,开展性能测试,能测试系统在高负载下的响应时间、吞吐量等性能指标,找出性能瓶颈。
    • Postman:辅助用于对系统单个接口进行快速调试,验证接口功能是否正常,确保接口基本可用,为后续 JMeter 的性能测试奠定基础。

    (一)Postman

            对需要测试接口如下所示,所有测试均成功通过,部分接口展示:

    (二)Jmeter

    1、前置配置

            【配置HTTP请求默认值】配置如下所示:

            【信息头变量】配置如下:

            【HTTP信息头管理器】配置如下:

            压测计划设置如下所示:

    2、接口配置总览

    (三)聚合报告

            如表格所示,表格数据从Jmeter中导出:

    Label# 样本平均值中位数90% 百分位95% 百分位99% 百分位最小值最大值异常 %吞吐量接收 KB/sec发送 KB/sec
    Register531069928248170512076022939812830.00%0.063170.030.04
    login51535713223944244053002821300310.00%0.067310.030.07
    注册 - 登录 511387854054111601058463460848240.00%0.06730.060.12
    Homepage_system5137547210790195585172319600390.00%0.062370.050.04
    Homepage_currentUser5033587211131142866011420601140.00%0.061140.110.04
    Homepage_userOverview49617840613508303036011322601130.00%0.059930.030.04
    Homepage_userTask4841986815310243205442821544280.00%0.063360.030.05
    首页48142141502453736582095833124958330.00%0.063350.220.18
    MyProject_totalList48182699218315228562232045242133337862421330.00%0.049730.320.04
    MyProject_createQList13724934032990189842239726223970.00%0.051290.020.04
    MyProject_createQList237513083119611243383059719305970.00%0.051270.020.04
    MyProject_selectDict37356865512509196073044423304440.00%0.051250.040.04
    MyProject_selectRepo372059121250433404034022403400.00%0.051240.020.04
    “我的项目”页37185112222039263459280248295215338992952150.00%0.048950.410.18
    MyTrain_list1374135818154572264524228149242280.00%0.05120.170.04
    MyTrain_list23745354293614222988391334839130.00%0.051190.040.04
    “我的练习”页3786711577237912475084209184842090.00%0.051180.220.07
    QuestionBankCenter_MyQBank_list373222720112262255323680201236800.00%0.051150.170.04
    QuestionBankCenter_QuestionManagement_list37424944212834155676009924600990.00%0.047240.020.03
    QuestionBankCenter_MyNote_list13622564351906125173509128350910.00%0.049990.040.04
    QuestionBankCenter_MyNote_list2361709364133023522356925235690.00%0.049980.020.04
    "题库中心"页3699592322249572605366778312667780.00%0.049960.250.14
    TemplateSquare_public_listTag3624273601552155893299624329960.00%0.049940.020.04
    TemplateSquare_public_listCategory3683734093714731550719155070.00%0.049920.020.04
    TemplateSquare_public_list3634527281290510832610830.00%0.049910.280.04
    TemplateSquare_personal_listTag36137734583911042320428232040.00%0.04990.020.04
    TemplateSquare_personal_listCategory36436298795117133452233450.00%0.049870.030.04
    TemplateSquare_personal_list3611782387129252370923237090.00%0.049850.020.04
    “模板广场”页3666032387184522619738087186380870.00%0.049840.40.22
    SystemManagement_UserManagement_list1368022551046233784792484790.00%0.049850.020.04
    SystemManagement_UserManagement_list236290125749830980229800.00%0.049810.10.04
    SystemManagement_UserManagement_list3362130472965125330078116300780.00%0.047830.450.03
    SystemManagement_RoleManagement_list13524041635378995411222541120.00%0.048510.10.03
    SystemManagement_RoleManagement_list235581274878114785242085240.00%0.048490.220.04
    SystemManagement_Organization_list3543872276667918444820844480.00%0.048450.020.03
    SystemManagement_JobSetting_list1353187173920246344033621403360.00%0.046510.090.03
    SystemManagement_JobSetting_list23545772478495301045128120512810.00%0.043550.040.03
    SystemManagement_DictManagement_list34213511286310935469325546930.00%0.047070.040.03
    SystemManagement_SysManagement_list34604031330126330146009138600910.00%0.043460.390.03
    “系统管理”页34237983949965991356011847323911847320.00%0.043431.40.31
    总体15641459743030072111249230553192952150.00%1.620014.761.93

    (四)吞吐量(Transactions per Second)

            如下图所示:

    (五)响应时间(Response Times Over Time)       

            如下图所示: 

    (六)随时间变化的活跃线程状态(Active Threads Over Time)

    (七)性能报告


    1、Dashboard

    2、Charts

    (1)Over time

    (2)Throughput

    (3)Response Times

    七、BUG描述

    (一)文件夹BUG

    1、基本信息

            标题:“在“我的项目”页面,内容以大方格形式展示,点击右下角“...”导致系统崩溃。

            功能:定位问题所属系统模块(例:“我的项目> 对文件夹操作”)。

            测试环境:

                    系统版本:Windows 11 专业版 23H2。

                    浏览器 / 客户端:Chrome 139.0.7258.155。

                    测试工具:JMeter 5.6.3、Postman 11.38.4。

    2、问题复现步骤

            操作 1:打开系统登录页面并进行正确登录,进入到首页页面。

            操作 2:点击“我的项目”并进入到该页面。

            操作 3:点击蓝色文件夹右下方“...”按钮。

    3、预期结果

            显示出对文件操作的选项。

    4、实际结果

            点击后页面显示出:Something went wrong.Minified React error #143; visit https://reactjs.org/docs/error-decoder.html?invariant=143 for the full message or use the non-minified dev environment for full errors and additional helpful warnings.

    5、附加信息

            错误截图 :

    优先级:  中 。

    (二)按钮异常

    1、基本信息

            标题:“题库中心”-“我的题库”-“导出”按钮异常,点击无反应。

            功能:“题库中心”-“我的题库”-“导出”按钮。        

            测试环境:

                    系统版本:Windows 11 专业版 23H2。

                    浏览器 / 客户端:Chrome 139.0.7258.155。

                    测试工具:JMeter 5.6.3、Postman 11.38.4。

    2、问题复现步骤

            操作 1:打开系统登录页面并进行正确登录,进入到首页页面。

            操作 2:点击“题库中心”。

            操作 3:点击“题库中心”下拉菜单中的“我的题库”。

            操作 4:点击蓝色“导出”按钮。

    3、预期结果

            显示出本地文件夹进行选择导出地址。

    4、实际结果

            点击登录后无任何提示,页面无响应。

    5、附加信息

            优先级:高。

    八、测试过程总结

    (一)测试概述

            测试类型:功能测试(手动)、兼容性测试(手动)、Python(Selenium库)自动化 UI 测试、梯度压力测试。

            测试周期:2025/8/28 ~ 2025/9/9。

            测试范围:

    • 核心功能:用户模块、项目管理、题库中心、模板广场、系统管理的 UI 交互与业务流程;
    • 非功能属性:性能稳定性、兼容性、界面交互可靠性。

    (二)核心测试结果汇总

    1、功能测试(手动)

            正常功能:98% 的功能模块(注册、登录、题目编辑等)运行正常,仅发现 2 处缺陷:

    • “我的项目” 页面大方格视图点击 “...” 按钮导致系统崩溃;
    • 题库中心 “导出” 按钮点击无响应。

            缺陷影响:2 处缺陷均未导致数据丢失,但前者可能影响用户正常操作流程。

    2、兼容性测试

            主流浏览器(Chrome、Edge)及操作系统(ColorOS15.0)均适配,界面与交互无异常。

    3、Python(Selenium库)自动化 UI 测试

            技术栈:Python + Selenium,覆盖 58 个 UI 交互场景(如注册流程、项目创建、改变样式等);

            测试执行

    • 模拟用户真实操作(点击、输入、滚动等),完成 200 + 次 UI 流程测试;
    • 验证元素定位(XPATH/CSS 选择器)成功率 100%,页面加载超时率 < 1%;

            测试结果

    • UI 交互异常率 0%,核心流程(如登录→创建问卷→发布)通过率 100%;
    • 平均单场景执行时间 15-30 秒,支持多浏览器并行测试(Chrome/Edge)。

    4、梯度压力测试

            测试场景:最多20 线程并发,逐步增加负载,持续 300 秒。

            关键指标

    • 响应时间:多数接口平均响应时间在 2000ms 内(如 “TemplateSquare_public_list” 仅 345ms),但 “我的项目” 页相关接口(如 “MyProject_totalList”)平均响应时间高达 182699ms,存在明显性能瓶颈;
    • 吞吐量:整体吞吐量 1.62 requests/sec,部分复杂接口(如系统管理页)吞吐量低于 0.05 requests/sec;
    • 资源消耗:服务器 CPU、内存占用在高并发下未超过 80%,但数据库连接池使用率接近阈值。

    (三)性能问题深度分析

    模块性能表现潜在原因
    “我的项目” 页平均响应时间 185112ms,99% 百分位 295215ms,吞吐量 0.04895 requests/sec1. 项目数据查询未做分页优化,大量数据一次性加载;
    2. 数据库索引缺失或查询语句低效。
    “系统管理” 页接收 / 发送带宽分别达 1.40 KB/sec 和 0.31 KB/sec,响应时间波动大1. 权限校验逻辑复杂,涉及多表关联查询;
    2. 后台服务线程池配置不合理。
    核心 UI 流程(如登录)平均响应时间 5357ms,吞吐量 0.06731 requests/sec,性能较稳定页面元素加载逻辑简单,无复杂动态渲染场景。

    (四)整体结论

            功能完整性:系统核心业务流程畅通,但 “我的项目” 页面交互缺陷和题库导出功能异常需优先修复。

            性能稳定性

    • 简单 UI 场景(如模板浏览、用户登录)性能表现良好;
    • 复杂业务模块(如项目管理、系统配置)存在明显响应延迟,高并发下可能影响用户体验。

            兼容性与可靠性:兼容性测试通过,Selenium 自动化 UI 测试覆盖全面,界面交互无异常,系统基础架构可靠。

    九、系统的测试总结

            问卷考试系统在功能可用性和 UI 交互兼容性方面表现良好,但复杂业务模块的性能瓶颈需重点优化。建议开发团队优先解决 UI 崩溃与导出功能异常,同时结合 Selenium 自动化测试结果,对高负载场景下的页面渲染与数据交互逻辑进行系统性调优,确保系统在正式上线后能满足用户日常操作与高并发业务需求。



    文章转载自:

    http://wWmnNZrR.jfsbs.cn
    http://2MtffDWo.jfsbs.cn
    http://Efd0cxsX.jfsbs.cn
    http://cCVrskxt.jfsbs.cn
    http://kyiahBGE.jfsbs.cn
    http://KM8tuchd.jfsbs.cn
    http://zbVJTIcb.jfsbs.cn
    http://RhUARw0I.jfsbs.cn
    http://L4UiFgwB.jfsbs.cn
    http://AROl4J2D.jfsbs.cn
    http://U6KlSLdu.jfsbs.cn
    http://Hmw3XTWC.jfsbs.cn
    http://RcJSAVxz.jfsbs.cn
    http://UwHx1W6A.jfsbs.cn
    http://qKdgNjFw.jfsbs.cn
    http://Nti1ayN4.jfsbs.cn
    http://Wo5sohAu.jfsbs.cn
    http://8qxeCPw2.jfsbs.cn
    http://W2hyzaOq.jfsbs.cn
    http://k13E9GKH.jfsbs.cn
    http://U6hYfuBi.jfsbs.cn
    http://4hdAT6CP.jfsbs.cn
    http://4rv3wP70.jfsbs.cn
    http://AJM9c2KX.jfsbs.cn
    http://7AUX6J0p.jfsbs.cn
    http://Xvve6KTC.jfsbs.cn
    http://cT4UkpO1.jfsbs.cn
    http://W5sCdZXw.jfsbs.cn
    http://lifAQkKr.jfsbs.cn
    http://TQHmK9IC.jfsbs.cn
    http://www.dtcms.com/a/375439.html

    相关文章:

  • WOA+LSTM+itransformer时间序列预测模型
  • Nginx运维之路(Docker多段构建新版本并增加第三方模块)
  • 构造方法与代替代码构造方法的注解
  • 开源模型应用落地-基于KTO的Qwen3-4B意图理解精准对齐实践(二十一)
  • 微信小程序加速计开发指南
  • Python中ORM的理解
  • Spark Streaming 实时流处理入门
  • 单片机学习笔记.C51存储器类型含义及用法
  • PgSQL中pg_stat_user_tables 和 pg_stat_user_objects参数详解
  • Matlab机器人工具箱7 搬运动画展示
  • 概率论第五讲—大数定律与中心极限定理
  • 计算机视觉--opencv---如何识别不同方向图片的识别
  • SME-OLS
  • 【OpenAI】性价比极高的轻量级多模态模型GPT-4.1-mini介绍 + API KEY的使用教程!
  • 机器学习-聚类
  • MyBatis基础到高级实践:全方位指南(中)
  • CLR的GC机制
  • 《投资-48》- 股市有哪些相互矛盾的说法?
  • 传统商业积分的普遍困境与 RWA 的破局可能
  • 稳定币法律困局:游走在创新与监管的钢丝绳上
  • 第三方区块链应用测评:【多签钱包合约安全评估_阈值签名机制与私钥存储安全性测试】
  • 【服务器】将本地项目部署到服务器
  • 串的模式匹配(朴素算法和KMP算法以及KMP的改进算法)
  • 基于LLM的月全食时空建模与智能预测:当古老天文遇见深度学习
  • php redis 中文API文档手册
  • 哪些危化品企业的岗位需要持有安全员证?
  • Linux指令基础
  • Modbus 速查与实战笔记(功能码、帧结构、坑点)
  • Label Smoothing Cross Entropy(标签平滑交叉熵) 是什么
  • 亮相cippe 成都石油展,陀螺定向短节带来高精度无磁导向方案