问卷考试系统自动化测试报告

目录

一、项目背景

二、项目简介

[2.1 系统概述](#2.1 系统概述)

[2.2 测试项目范围](#2.2 测试项目范围)

三、测试计划

[3.1 测试目标](#3.1 测试目标)

[3.2 测试策略](#3.2 测试策略)

[3.3 测试周期](#3.3 测试周期)

四、测试工具与环境

[4.1 测试工具配置](#4.1 测试工具配置)

[4.2 测试环境详情](#4.2 测试环境详情)

五、性能测试覆盖

[5.1 页面性能测试覆盖](#5.1 页面性能测试覆盖)

六、自动化测试用例

[6.1 测试用例设计原则](#6.1 测试用例设计原则)

[6.2 测试用例图](#6.2 测试用例图)

[6.3 测试用例统计总览](#6.3 测试用例统计总览)

七、自动化测试代码结构

[7.1 自动化测试代码结构图](#7.1 自动化测试代码结构图)

[7.2 自动化测试代码脚本](#7.2 自动化测试代码脚本)

1、common

Utils.py

[2. tests](#2. tests)

ExamLogin.py

ExamRegister.py

ExaProject.py

ExaExercise.py

ExaRepoIndex.py

ExaRepoTemplate.py

ExaRepoBook.py

ExaTemplate.py

ExaSystemUser.py

ExaSystemRole.py

ExaSystemDept.py

ExaSystemPosition.py

ExaSystemDict.py

ExaSystemSetting.py

runset.py

八、测试执行截图

[8.1 登录](#8.1 登录)

[8.2 注册](#8.2 注册)

[8.3 首页](#8.3 首页)

[8.3 项目页](#8.3 项目页)

[8.4 练习页​编辑](#8.4 练习页编辑)

[8.5 题库页](#8.5 题库页)

[8.6 模板页](#8.6 模板页)

[8.7 设置页​编辑](#8.7 设置页编辑)

九、缺陷报告

十、测试结论


一、项目背景

随着教育信息化和在线评估需求的快速增长,问卷考试系统已成为教育机构、企业培训、资格认证等领域的重要工具。本项目旨在对一款基于Web的问卷考试系统进行全面自动化测试,确保系统功能的完整性、稳定性和用户体验。该系统集成了用户管理、题库管理、考试练习、模板管理、系统设置等多个核心模块,支持多样化的在线评估需求。

系统链接:http://49.235.61.184:8080/

二、项目简介

2.1 系统概述

系统名称: 问卷考试系统

访问地址 : http://49.235.61.184:8080

系统架构: B/S架构,基于Web的在线应用

技术栈: 前端采用Ant Design组件库,后端采用Java/Spring框架

核心功能: 用户注册登录、题库管理、考试练习、问卷调查、模板管理、系统管理

2.2 测试项目范围

本次自动化测试全面覆盖了系统的11个主要功能模块:

|----------|----------|-------------------------------|
| 模块名称 | 测试页面 | 主要功能 |
| 用户管理 | 登录页、注册页 | 用户登录、注册、验证 |
| 系统首页 | 首页 | 导航、内容展示、状态切换 |
| 项目管理 | 我的项目页 | 项目创建、管理、搜索、操作 |
| 练习管理 | 我的练习页 | 练习查询、答题、查看答案 |
| 题库中心 | 题库管理页 | 题库查询、试题管理、文本导入 |
| 模板管理 | 模板广场页 | 模板筛选、添加、编辑 |
| 系统管理 | 多个管理页面 | 用户管理、角色管理、组织机构、岗位设置、字典管理、个人设置 |

三、测试计划

3.1 测试目标

  1. 功能验证: 确保各功能模块符合需求规格说明
  2. 流程测试: 验证核心业务流程的完整性和正确性
  3. 兼容性测试: 确保在不同浏览器环境下的正常运行
  4. 性能测试: 评估系统响应时间和页面加载性能
  5. 异常测试: 验证系统在异常情况下的处理能力

3.2 测试策略

|-------|---------|----------------|
| 测试类型 | 测试方法 | 覆盖范围 |
| 功能测试 | 自动化脚本执行 | 所有核心功能模块 |
| 界面测试 | 页面元素验证 | 页面布局、交互元素 |
| 流程测试 | 业务流程模拟 | 用户注册到系统使用的完整流程 |
| 异常测试 | 异常数据输入 | 边界值、无效数据、异常操作 |
| 兼容性测试 | 多环境验证 | Chrome浏览器兼容性 |

3.3 测试周期

准备阶段: 1天(环境搭建、数据准备)

设计阶段: 2天(测试用例设计、脚本编写)

执行阶段: 4天(自动化测试执行)

缺陷跟踪: 2天(缺陷验证、回归测试)

报告阶段: 1天(结果分析、报告编写)

四、测试工具与环境

4.1 测试工具配置

主要测试工具配置

  • Selenium WebDriver 4.0+:Web自动化测试框架

  • ChromeDriver:浏览器驱动管理

  • Python 3.14:测试脚本开发语言

  • webdriver-manager:自动管理ChromeDriver版本

  • Page Object模式:页面对象设计模式

4.2 测试环境详情

操作系统: Windows 10/11

浏览器: Chrome 最新稳定版

Python环境: Python 3.14

网络环境: 稳定的互联网连接

测试服务器 : 远程测试环境 (http://49.235.61.184:8080)

截图保存: ../images/YYYY-MM-DD/ 目录

五、性能测试覆盖

5.1 页面性能测试覆盖

本次测试覆盖了以下核心页面的性能:

|------|-------------|---------------|------|
| 页面名称 | URL | 性能指标 | 测试结果 |
| 登录页面 | /user/login | 页面加载时间、表单提交响应 | 正常 |
| 系统首页 | /home | 页面渲染时间、菜单响应速度 | 正常 |
| 项目管理 | /project | 列表加载时间、搜索响应 | 正常 |
| 练习管理 | /exercise | 练习查询速度、答题响应 | 正常 |
| 题库管理 | /repo/index | 列表加载、搜索性能 | 正常 |
| 模板管理 | /template | 模板筛选、添加响应 | 正常 |
| 系统管理 | 各管理页面 | 数据加载、操作响应 | 正常 |

六、自动化测试用例

6.1 测试用例设计原则

  1. 全面性: 覆盖所有主要功能模块
  2. 独立性: 每个测试用例可独立执行
  3. 可维护性: 使用Page Object模式设计
  4. 可重复性: 确保测试结果的一致性
  5. 异常覆盖: 包含正常和异常场景测试

6.2 测试用例图

6.3 测试用例统计总览

|--------|---------|----------|----------|
| 模块名称 | 测试用例数 | 自动化覆盖率 | 执行状态 |
| 用户登录 | 7个 | 100% | 全部通过 |
| 用户注册 | 9个 | 100% | 全部通过 |
| 系统首页 | 5个 | 100% | 全部通过 |
| 项目管理 | 1个(综合) | 100% | 全部通过 |
| 练习管理 | 1个(综合) | 100% | 全部通过 |
| 题库管理 | 1个(综合) | 100% | 全部通过 |
| 模板管理 | 1个(综合) | 100% | 全部通过 |
| 系统管理 | 6个(综合) | 100% | 全部通过 |
| 总计 | 31个 | 100% | 全部通过 |

七、自动化测试代码结构

7.1 自动化测试代码结构图

python 复制代码
project/
├── Common/
│   └── Utils.py          # 驱动管理和工具类
├── images/             #测试截图
├── tests/
│   ├── ExamLogin.py      # 登录测试
│   ├── ExamRegister.py   # 注册测试
│   ├── ExamIndex.py      # 首页测试
│   ├── ExaProject.py     # 我的项目测试
│   ├── ExaExercise.py    # 我的练习测试
│   ├── ExaRepoIndex.py   # 我的题库测试
│   ├── ExaRepoBook.py    # 我的笔记测试
│   ├── ExaRepoTemplate.py # 问题管理测试
│   ├── ExaTemplate.py    # 模板管理测试
│   ├── ExaSystemUser.py  # 用户管理测试
│   ├── ExaSystemRole.py  # 角色管理测试
│   ├── ExaSystemDept.py  # 组织机构测试
│   ├── ExaSystemPosition.py # 岗位设置测试
│   ├── ExaSystemDict.py  # 字典管理测试
│   └── ExaSystemSetting.py # 个人设置测试
└── runtest.py           # 测试执行主程序

7.2 自动化测试代码脚本

1、common

Utils.py
python 复制代码
import datetime
import os
import sys
from os.path import dirname

import requests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

#创建驱动对象
class Driver:
    driver=""

    def __init__(self):
        options=webdriver.ChromeOptions()
        self.driver=webdriver.Chrome(service=Service(ChromeDriverManager().install()),options=options)
        self.driver.implicitly_wait(2)
        requests.packages.urllib3.disable_warnings()
        self.driver.maximize_window()

    def getScreeShot(self):
        dirname=datetime.datetime.now().strftime("%Y-%m-%d")
        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")+".png"
        self.driver.save_screenshot("../images/"+dirname+"/"+filename)


ExamDriver=Driver()

2. tests

ExamLogin.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamLogin:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/user/login"
        self.driver=ExamDriver.driver
        self.driver.get(self.url)
    #正常登录
    def LogSucTest(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()
        self.driver.find_element(By.XPATH,"//span[text()='首页']")
        #self.driver.quit()
        # time.sleep(1)
        ExamDriver.getScreeShot()
        #切换为上一个页面
        # self.driver.back()
        # time.sleep(2)


    #使用不存在的用户登录失败
    def LoginFail(self):
        wait=WebDriverWait(self.driver,2)
        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("zhangsan")
        self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("1234567")
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        ret=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 ret=="错误的用户名和密码"
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #登录失败------密码错误
    def LoginFailByPassword(self):
        wait=WebDriverWait(self.driver,2)
        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("1234567")
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        ret=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 ret=="错误的用户名和密码"
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #登录失败------用户名和密码为空
    def LoginFailEmpty(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,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        # time.sleep(1)
        wait = WebDriverWait(self.driver, 2)
        username_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))
        nameremind = username_error.text
        assert nameremind == "用户名是必填项!"
        wait = WebDriverWait(self.driver, 2)
        password_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))
        passwordremind = password_error.text
        assert passwordremind=="密码是必填项!"
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #登录失败------用户名为空
    def LoginFailNameEmpty(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,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        # time.sleep(1)
        wait = WebDriverWait(self.driver, 2)
        password_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))
        passwordremind = password_error.text
        assert passwordremind=="密码是必填项!"
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #登录失败------密码为空
    def LoginFailPasswordEmpty(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, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        # time.sleep(1)
        wait = WebDriverWait(self.driver, 2)
        username_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))
        nameremind = username_error.text
        assert nameremind == "用户名是必填项!"
        ExamDriver.getScreeShot()

    #跳转到注册页面
    def ToRegister(self):
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div:nth-child(4) > a").click()
        ret=self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div:nth-child(2) > div > div.ant-col.ant-form-item-label").text
        assert ret=="姓名"
        ExamDriver.getScreeShot()
复制代码
ExamRegister.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamRegister:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/user/register"
        self.driver=ExamDriver.driver
        self.driver.get(self.url)
    #正常注册
    def RegisterSuctest(self):
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("test")
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhuohongze111")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,"#rePassword").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")
        self.driver.back()

    #账号已存在
    def RegisterFailReRG(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhuohongze")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ret=self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div").text
        assert ret=="账号已存在"
        ExamDriver.getScreeShot()
        self.driver.back()

    #输入的所有都为空
    def RegisterFailEmpty(self):
        self.driver.find_element(By.CSS_SELECTOR,"#name").clear()
        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,"#rePassword").clear()
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()
    #输入的姓名为空
    def RegisterFailEmptyName(self):
        self.driver.find_element(By.CSS_SELECTOR,"#name").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhuohongze1")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #输入的用户名为空
    def RegisterFailEmptyUser(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #输入密码为空
    def RegisterFailEmptyPassword(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhuohongze2")
        self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #输入的确认密码为空
    def RegisterFailEmptyRePassword(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhuohongze3")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").clear()
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()


        # 输入的密码长度小于6
    def RegisterFailPasswordUnder5(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhuohongze4")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345")
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
        ExamDriver.getScreeShot()
        self.driver.refresh()

    #返回登录页面
    def Returntologin(self):
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div:nth-child(6) > a").click()
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")
        ExamDriver.getScreeShot()
ExaProject.py
python 复制代码
import time

from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver


class ExamProject():
    url = ""
    driver = ""

    def __init__(self):
        self.url = "http://49.235.61.184:8080/project"
        self.driver = ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        # 创建显式等待对象
        self.wait = WebDriverWait(self.driver, 10)

    def ProjectTest(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-content > div > div > div > div > div > div > div > div > label:nth-child(2)").click()
        ExamDriver.getScreeShot()
        # 搜索框输入测试
        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("测试")


        # 点击搜索按钮
        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()
        ExamDriver.getScreeShot()
        # 将搜索框的内容清空
        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").clear()

        # 重新搜索
        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()

        # 对一个项目进行重命名
        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(1) > div > div > div > div > div > div > table > tbody > tr:nth-child(1) > td:nth-child(7) > a:nth-child(1)").click()
        #self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("")
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试001")
        ExamDriver.getScreeShot()

        # 点击确定按钮
        self.driver.find_element(By.CSS_SELECTOR,
                                 "body > div:nth-child(8) > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary > span").click()

        self.wait.until(EC.invisibility_of_element_located(
            (By.CSS_SELECTOR, "body > div:nth-child(8) > div > div.ant-modal-wrap")
        ))

        # 将项目进行删除
        self.driver.find_element(By.XPATH, "//a[text()='删除']").click()

        # 等待删除确认弹窗出现
        self.wait.until(EC.visibility_of_element_located(
            (By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous")
        ))
        ExamDriver.getScreeShot()
        self.driver.find_element(By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous").click()

        # 等待删除操作完成
        self.wait.until(EC.invisibility_of_element_located(
            (By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous")
        ))

        # 点击新建 - 1.新建AI对话
        self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()

        # 等待下拉菜单出现
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div[4]/div/div/ul/li[1]/span")
        ))
        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div/ul/li[1]/span").click()

        # 等待AI对话窗口出现 - 替换time.sleep(1)
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//div[contains(@class, 'ant-drawer-content-wrapper')]//textarea")
        ))

        self.driver.find_element(By.XPATH, "//div[contains(@class, 'ant-drawer-content-wrapper')]//textarea").send_keys(
            "对话测试")
        self.driver.find_element(By.XPATH, "//button[span='发送']").click()
        ExamDriver.getScreeShot()
        # 等待发送按钮可点击
        self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//button[span='清空对话']")
        ))

        self.driver.find_element(By.XPATH, "//button[span='清空对话']").click()
        self.driver.find_element(By.XPATH, "//div[contains(@class, 'ant-drawer-extra')]//button").click()

        # 2.新建问卷调查
        self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()

        # 等待下拉菜单出现 - 替换time.sleep(1)
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div[4]/div/div/ul/li[2]/span")
        ))


        self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div/ul/li[2]/span").click()

        # 等待问卷调查编辑器加载完成
        self.wait.until(EC.visibility_of_element_located(
            (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")
        ))

        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.find_element(By.CSS_SELECTOR,
                                 "#rc-tabs-0-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(1)").click()
        self.driver.find_element(By.CSS_SELECTOR,
                                 "#rc-tabs-0-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(2)").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").click()
        ExamDriver.getScreeShot()
        self.driver.back()
        self.driver.back()
        #新建考试
        self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div[5]/div/div/ul/li[3]/span")
        ))
        self.driver.find_element(By.XPATH, "/html/body/div[5]/div/div/ul/li[3]/span").click()

        self.wait.until(EC.visibility_of_element_located(
            (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")
        ))

        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.find_element(By.XPATH,"//*[starts-with(@id, 'rc-tabs-') and contains(@id, '-panel-1')]/div/div/dl[2]/div/div[1]").click()
        self.driver.find_element(By.XPATH,"//*[starts-with(@id, 'rc-tabs-') and contains(@id, '-panel-1')]/div/div/dl[2]/div/div[2]").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").click()
        ExamDriver.getScreeShot()
        self.driver.back()
        self.driver.back()
        #新建文件夹
        self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div/div/div/ul/li[7]/span")
        ))
        self.driver.find_element(By.XPATH, "/html/body/div/div/div/ul/li[7]/span").click()
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("自动化测试创建文件夹")
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"/html/body/div/div/div/div/div/div/button[2]").click()

        #从回收站当中恢复文件夹
        self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div/div/div/ul/li[8]/span")
        ))
        self.driver.find_element(By.XPATH,"/html/body/div/div/div/ul/li[8]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div/table/tbody/tr[1]/td[1]/label/span/input").click()

        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div[2]/div/div[2]")
        ))
        self.driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div[2]/div/div[2]").click()
        self.driver.find_element(By.XPATH,"/html/body/div/div/div/div/div[2]/div/div/div[2]/button[2]").click()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "/html/body/div/div/div[2]/div/div[2]/button")
        ))
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"/html/body/div/div/div[2]/div/div[2]/button").click()
ExaExercise.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamExercise:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/exercise"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    #遍历我的练习页功能
    def ExamExerciseList(self):
        #点击我的练习
        self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-tabs-tab') and contains(., '我的练习')]/span").click()
        #进行查询
        self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
        self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
        self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']//table//tr[6]//a[text()='继续答题']").click()
        ExamDriver.getScreeShot()
        # self.driver.find_element(By.XPATH,"//span[text()='查看答案']").click()
        self.driver.find_element(By.XPATH,"//button[normalize-space()='下一页']").click()
        self.driver.find_element(By.XPATH,"//button[normalize-space()='结束练习']").click()
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']//table//tr[1]//a[text()='二维码']").click()
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']//table//tr[1]//a[text()='删除']").click()
        ExamDriver.getScreeShot()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//button[normalize-space()='Cancel']")
        ))
        # self.driver.find_element(By.XPATH,"//button[normalize-space()='OK']").click()
        self.driver.find_element(By.XPATH,"//button[normalize-space()='Cancel']").click()
ExaRepoIndex.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamRepoIndex:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/repo/index"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def RepoIndexList(self):
        self.driver.find_element(By.XPATH,"//*[@id='name']").send_keys("自动化")
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']//form//div[2]/button").click()
        ExamDriver.getScreeShot()
        self.wait.until(EC.visibility_of_element_located((By.XPATH,"//a[contains(text(), '文本导入')]")))
        #文本导入
        self.driver.find_element(By.XPATH,"//a[contains(text(), '文本导入')]").click()
        self.driver.find_element(By.XPATH,"/html/body/div/div/div/div/div/div/div/div[1]/div/div/div[6]").send_keys("感谢您能抽出几分钟时间来参加本次答题,现在我们就马上开始吧!【欢迎语】")
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"/html/body//div[2]/div/div[2]/button").click()
        #试题管理
        self.driver.find_element(By.XPATH,"//a[contains(text(), '试题管理')]").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/div/div/button").click()
        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(2) > div > div:nth-child(2)").click()
        self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(1)")))
        self.driver.find_element(By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(1)").click()
        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(2) > div > div:nth-child(2)").click()
        self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(2)")))
        self.driver.find_element(By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(2)").click()
        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(2) > div > div:nth-child(2)").click()
        self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(3)")))
        self.driver.find_element(By.CSS_SELECTOR,"div.ant-dropdown ul > li:nth-child(3)").click()
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']//section/div[2]/main/div/div[2]//div[2]/div/div[3]").click()
        time.sleep(2)
        #self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-title > div > label > span.ant-checkbox.ant-checkbox-checked > input")))
        #列设置
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-title > div > label > span.ant-checkbox.ant-checkbox-checked > input").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(1) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(2) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(3) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(4) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(5) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(6) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(7) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(8) > span.ant-tree-checkbox").click()
        self.driver.find_element(By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(9) > span.ant-tree-checkbox").click()
        ExamDriver.getScreeShot()
        #新建题库
        self.driver.find_element(By.XPATH,"//*[text()='新建']").click()

        self.driver.find_element(By.XPATH,"/html/body/div//div[3]/div/div/div[1]/button").click()
ExaRepoTemplate.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver
from tests.ExaRepoIndex import ExamRepoIndex

#问题管理页
class ExamRepoTemplate:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/repo/template"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def RepoTemplateList(self):
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form//div[1]/div/div[2]/button").click()
        self.driver.find_element(By.XPATH,"//tr[2]//a[text()='编辑']").click()
        ExamDriver.getScreeShot()

        self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div").click()

        # self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div > div > div > div > div > div.q-content > div > div > div > div > div > div:nth-child(2) > input").send_keys("自动化测试")
        ExamDriver.getScreeShot()
        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()
ExaRepoBook.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver


#我的笔记页
class ExamRepoBook:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/repo/book"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def ExamRepoBookList(self):
        #根据错题的标题进行查询
        self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-tabs-nav')]//div[contains(@class, 'ant-tabs-tab') and contains(., '我的错题')]").click()
        # time.sleep(1)
        self.driver.find_element(By.XPATH,"//*[@id='name']").send_keys("驾驶")
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main/div//div[1]/form/div//div[1]/div/div[2]/button").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.XPATH,"//div[contains(@class, 'ant-tabs-nav')]//div[contains(@class, 'ant-tabs-tab') and contains(., '我的收藏')]").click()
        ExamDriver.getScreeShot()
ExaTemplate.py
python 复制代码
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains

from Common.Utils import ExamDriver

#模板广场页
class ExamTemplate:
    def __init__(self):
        self.url = "http://49.235.61.184:8080/template"
        self.driver = ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def ExaTemplateList(self):

        # 1. 模板筛选
        self._filter_templates()

        # 2. 添加模板
        self._add_template()

        # 3. 填写模板信息
        self._fill_template_info()


    def _filter_templates(self):
        """筛选模板"""
        # 第一类筛选
        filter1 = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*[@id='sk-layout']//section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[1]")
        ))
        filter1.click()
        ExamDriver.getScreeShot()


        # 选择"全部"
        all_option = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//form//div[contains(@class, 'content')]//span[text()='全部']")
        ))
        all_option.click()
        ExamDriver.getScreeShot()


        # 输入筛选关键词
        search_input1 = self.wait.until(EC.presence_of_element_located(
            (By.XPATH, "//*[@id='sk-layout']/div/div/section/div/main/div//div/div/div/span/span/input")
        ))
        search_input1.clear()
        search_input1.send_keys("自动化测试")
        ExamDriver.getScreeShot()


        # 等待筛选结果加载完成
        self.wait.until(
            lambda driver: "加载" not in driver.page_source or
                           EC.invisibility_of_element_located((By.CSS_SELECTOR, ".ant-spin, .loading"))(driver)
        )

        # 第二类筛选(重复类似操作)
        filter2 = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*[@id='sk-layout']//section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[2]")
        ))
        filter2.click()

        # 同样选择"全部"
        all_option2 = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//form//div[contains(@class, 'content')]//span[text()='全部']")
        ))
        all_option2.click()

        # 输入筛选关键词
        search_input2 = self.wait.until(EC.presence_of_element_located(
            (By.XPATH, "//*[@id='sk-layout']/div/div/section/div/main/div//div/div/div/span/span/input")
        ))
        search_input2.clear()
        search_input2.send_keys("自动化测试")

        # 等待筛选结果加载完成
        self.wait.until(
            lambda driver: "加载" not in driver.page_source or
                           EC.invisibility_of_element_located((By.CSS_SELECTOR, ".ant-spin, .loading"))(driver)
        )

    def _add_template(self):
        """添加模板操作"""
        # 点击添加模板按钮
        add_btn = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*[@id='sk-layout']/div/div/section/div[2]/main/div//span/div/div/button")
        ))
        add_btn.click()

        time.sleep(1)

        # 选择模板选项
        option1 = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*/div/div/dl[2]/div/div[1]/dd/div")
        ))
        option1.click()

        option2 = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*/div/div/dl[2]/div/div[2]/dd/div")
        ))
        option2.click()

        # 点击下一步按钮
        next_btn = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//*[@id='editor']//div[1]/div[2]/div/button[5]")
        ))
        next_btn.click()

        # 等待确认对话框出现
        self.wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".ant-modal-footer .ant-btn-primary"))
        )

        # 确认操作
        confirm_btn = self.wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, ".ant-modal-footer .ant-btn-primary")
        ))
        confirm_btn.click()

        # 等待模板信息表单加载完成
        self.wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#name"))
        )

    def _fill_template_info(self):
        """填写模板信息"""
        # 输入模板名称
        name_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#name")))
        name_input.clear()
        name_input.send_keys("自动化测试模板001")

        # 等待输入完成
        self.wait.until(
            lambda driver: name_input.get_attribute("value") == "自动化测试模板001"
        )

        # 处理分类输入框
        self._input_category()

        # 处理标签输入框
        self._input_tags()

        # 等待标签输入完成
        self.wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".ant-tag"))
        )

        # 选择复选框
        checkbox = self.wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, "#survey-modal-container .ant-checkbox-wrapper")
        ))
        checkbox.click()

        # 等待复选框被选中
        self.wait.until(
            lambda driver: driver.find_element(By.CSS_SELECTOR,
                                               "#survey-modal-container .ant-checkbox-wrapper input").is_selected()
        )
        ExamDriver.getScreeShot()


        # 保存模板
        save_btn = self.wait.until(EC.element_to_be_clickable(
            (By.CSS_SELECTOR, "#survey-modal-container .ant-modal-footer .ant-btn-primary")
        ))
        save_btn.click()

        # 等待保存成功,模态框关闭
        self.wait.until(
            EC.invisibility_of_element_located((By.CSS_SELECTOR, "#survey-modal-container .ant-modal"))
        )

        self.driver.back()

    def _input_category(self):
        """处理分类输入框"""
        # 尝试直接输入
        category_input = self.wait.until(EC.presence_of_element_located(
            (By.XPATH, "//div[@id='survey-modal-container']//form//div[2]//input")
        ))
        category_input.clear()
        category_input.send_keys("自动化测试")



    def _input_tags(self):
        """处理标签输入框 - 使用多种方式尝试"""
        tags = ["牛人", "二号", "考试", "测试001", "二哈", "测试", "自动化"]

        # 查找标签输入框
        tag_input = self.wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, ".ant-select-selection-search input, .ant-select-selector input, [role='combobox'] input")
        ))

        # 逐个输入标签
        for tag in tags:
            tag_input.clear()
            tag_input.send_keys(tag)
            tag_input.send_keys(Keys.RETURN)  # 按回车生成标签
ExaSystemUser.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamSyatemUser:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/user"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemUser(self):
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("zhz")
        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-md-18 > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']")
        ))
        self.driver.find_element(By.XPATH,"//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']").click()


        ExamDriver.getScreeShot()

        self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(8) > div > div.ant-drawer-content-wrapper > div > div > div.ant-drawer-footer > div > div > div:nth-child(2) > button").click()


        self.driver.find_element(By.XPATH,"//button[span[text()='新建']]").click()

        self.driver.find_elements(By.CSS_SELECTOR,"#name")[1].send_keys("test002")
        self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("test002")
        self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR,"#rePassword").send_keys("123456")

        # 触发下拉框
        gender_input = self.driver.find_element(By.ID, "gender")
        # 尝试点击输入框
        gender_input.click()

        # 等待直到选项元素可见
        option1 = self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='男']")
        ))
        option1.click()

        # 触发下拉框
        gender_input = self.driver.find_element(By.ID, "status")
        # 尝试点击输入框
        gender_input.click()

        # 等待直到选项元素可见
        option2 = self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='激活']")
        ))
        option2.click()
        ExamDriver.getScreeShot()

        # time.sleep(5)

        self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(8) > div > div.ant-drawer-content-wrapper > div > div > div.ant-drawer-footer > div > div > div:nth-child(2) > button").click()
ExaSystemRole.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamSyatemRole:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/role"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemRole(self):
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("yonghu")
        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.ant-col.ant-col-8.ant-col-offset-8 > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
        ExamDriver.getScreeShot()

        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']")
        ))
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']").click()

        code=self.driver.find_element(By.CSS_SELECTOR,"#code")
        code.clear()
        code.send_keys("1")

        self.driver.find_element(By.XPATH,"/html/body//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[6]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[3]/div/div/div[2]/button").click()




        self.driver.find_element(By.XPATH,"//button[span[text()='新建']]").click()
        #
        self.driver.find_elements(By.CSS_SELECTOR,"#name")[1].send_keys("test")
        self.driver.find_element(By.CSS_SELECTOR,"#code").send_keys("666")
        # 触发下拉框
        gender_input = self.driver.find_element(By.ID, "status")
        # 尝试点击输入框
        gender_input.click()

        # 等待直到选项元素可见
        option2 = self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='正常']")
        ))
        option2.click()
        ExamDriver.getScreeShot()


        self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("这是进行自动化测试的角色")

        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[1]/span[2]/span").click()

        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[2]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[3]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[4]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[5]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[6]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[7]/span[2]/span").click()
        self.driver.find_element(By.XPATH,"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[8]/span[2]/span").click()

        self.driver.find_element(By.XPATH,"/html/body//div[3]/div/div/div[2]/button").click()

        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")
        ExamDriver.getScreeShot()

        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.ant-col.ant-col-8.ant-col-offset-8 > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
ExaSystemDept.py
python 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver
from tests.ExaRepoIndex import ExamRepoIndex


class ExamSystemDept:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/dept"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemDeptList(self):
        self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
        ExamDriver.getScreeShot()

        self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("111")
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
        self.driver.find_element(By.CSS_SELECTOR, "#shortName").send_keys("test")

        # 负责人选择框处理
        manager = self.driver.find_element(By.CSS_SELECTOR, "#managerId")
        manager.click()

        # 等待下拉选项出现
        self.wait.until(EC.visibility_of_element_located(
            (By.CSS_SELECTOR, "div.ant-select-dropdown:not([style*='display: none'])")
        ))

        # 输入搜索关键字
        manager.send_keys("测试")

        # 等待搜索结果出现
        self.wait.until(EC.visibility_of_element_located(
            (By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '测试账号')][1]")
        ))

        # 选择第一个匹配的负责人
        first_option = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '测试账号')][1]")
        ))
        first_option.click()


        self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("自动化测试")
        ExamDriver.getScreeShot()


        self.driver.find_element(By.XPATH,"/html/body//div/div/div[2]/button").click()


        self.driver.refresh()
ExaSystemPosition.py
cpp 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamSyatemPosition:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/position"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemPosition(self):
        self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
        ExamDriver.getScreeShot()

        self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("自动化测试")
        self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("999")

        Type = self.driver.find_element(By.CSS_SELECTOR, "#dataPermissionType")
        Type.click()


        # 选择第一个匹配的负责人
        first_option = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '本人')][1]")
        ))
        first_option.click()

        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH, "/html/body/div[4]//div/div/div[2]/button").click()

        self.driver.refresh()

        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main/div/div//form/div/div[2]/div/div//div/div[2]/button").click()

        ExamDriver.getScreeShot()
ExaSystemDict.py
cpp 复制代码
import time

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamSyatemDict:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/dict"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemPosition(self):
        self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
        ExamDriver.getScreeShot()

        self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("自动化字典测试")


        Type = self.driver.find_element(By.CSS_SELECTOR, "#dictType")
        Type.click()

        first_option = self.wait.until(EC.element_to_be_clickable(
            (By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '问卷字典')][1]")
        ))
        first_option.click()
        self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("1234")
        self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("自动化测试新增字典")



        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button").click()

        self.driver.refresh()

        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化字典测试")
        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) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()


        ExamDriver.getScreeShot()
ExaSystemSetting.py
cpp 复制代码
import time

from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait

from Common.Utils import ExamDriver



class ExamSyatemSetting:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184:8080/system/setting"
        self.driver=ExamDriver.driver
        if self.driver.current_url != self.url:
            self.driver.get(self.url)
        self.wait = WebDriverWait(self.driver, 10)

    def SystemSetting(self):
        #基础设置
        self.driver.find_element(By.XPATH, "//span[text()='基本设置']").click()
        ExamDriver.getScreeShot()
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
        self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("1234567890")
        self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("123456@qq.com")
        self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试个人简介")
        # self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main/div//span/div/span/div/button").send_keys("C:\\Users\\zhuohongze\\Pictures\\linux.jpg")
        # self.driver.find_element(By.XPATH,"/html/body/div/div/div/div/div[2]/div[3]/button[2]").click()

        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div/main//div[2]/div[1]/form/div[5]/div[2]/button").click()

        #安全设置
        self.driver.find_element(By.XPATH, "//span[text()='安全设置']").click()
        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main//div/div/ul/li/ul/li").click()
        self.driver.find_element(By.CSS_SELECTOR, "#oldPassword").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
        self.driver.find_element(By.CSS_SELECTOR, "#confirmPassword").send_keys("123456")
        ExamDriver.getScreeShot()

        self.driver.find_element(By.XPATH,"/html/body/div//div/div/div[2]/button").click()


        self.driver.find_element(By.XPATH, "//span[text()='AI设置']").click()
        ExamDriver.getScreeShot()

        self.driver.find_element(By.CSS_SELECTOR,"#aiSetting_enabled").click()
        self.driver.find_element(By.CSS_SELECTOR,"#aiSetting_enabled").click()
        # self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main//div[2]/div[2]/div/form/div[2]/div[1]/button").click()
        self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main//div/form/div[5]/div[1]/button").click()

        self.driver.find_element(By.XPATH, "//span[text()='系统设置']").click()
        ExamDriver.getScreeShot()

        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)

        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试问卷考试系统")
        self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys("进行一次自动化测试")
        self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys("123456")

        self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys(Keys.CONTROL + 'a')
        self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys(Keys.DELETE)
        self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys("123456")

        self.driver.find_element(By.XPATH, "//*[@id='sk-layout']/div/div/section/div[2]/main/div/div/div/div[2]/div[2]/div[1]/form/div[8]/div[1]/button").click()
runset.py
cpp 复制代码
from Common.Utils import ExamDriver
from tests.ExaExercise import ExamExercise
from tests.ExaProject import ExamProject
from tests.ExaRepoBook import ExamRepoBook
from tests.ExaRepoIndex import ExamRepoIndex
from tests.ExaRepoTemplate import ExamRepoTemplate
from tests.ExaSystemDept import ExamSystemDept
from tests.ExaSystemDict import ExamSyatemDict
from tests.ExaSystemPosition import ExamSyatemPosition
from tests.ExaSystemRole import ExamSyatemRole
from tests.ExaSystemSetting import ExamSyatemSetting
from tests.ExaSystemUser import ExamSyatemUser
from tests.ExaTemplate import ExamTemplate
from tests.ExamIndex import ExamIndex
from tests.ExamLogin import ExamLogin
from tests.ExamRegister import ExamRegister

if __name__=='__main__':
    #1.登录页
    ExamLogin().LogSucTest()


   # 3.首页
    # 创建单个实例
    exam_index = ExamIndex()
    #调用第一个方法
    exam_index.IndexStatusBarWithDocument()
    exam_index.IndexStatusBarWithSettings()
    exam_index.IndexList()
    exam_index.ExaIndexTraverse()
    #4.我的项目
    exam_project = ExamProject()
    exam_project.ProjectTest()
    #
    # #5.我的练习页
    ExamExercise().ExamExerciseList()

    #题库中心页
    ExamRepoIndex().RepoIndexList()

    #问题管理页
    ExamRepoTemplate().RepoTemplateList()

    #我的笔记页
    ExamRepoBook().ExamRepoBookList()


    #模板广场
    ExamTemplate().ExaTemplateList()


    #系统管理
    #用户管理
    ExamSyatemUser().SystemUser()

    #角色管理
    ExamSyatemRole().SystemRole()

    #组织机构
    ExamSystemDept().SystemDeptList()


    #岗位设置
    ExamSyatemPosition().SystemPosition()


    #字典管理
    ExamSyatemDict().SystemPosition()

    #个人设置
    ExamSyatemSetting().SystemSetting()


    ExamIndex().IndexExitLogin()

    ExamLogin().LoginFail()
    ExamLogin().LoginFailByPassword()
    ExamLogin().LoginFailEmpty()
    ExamLogin().LoginFailNameEmpty()
    ExamLogin().LoginFailPasswordEmpty()
    ExamLogin().ToRegister()
    # 2.注册页
    ExamRegister().RegisterSuctest()
    ExamRegister().RegisterFailReRG()
    ExamRegister().RegisterFailEmpty()
    ExamRegister().RegisterFailEmptyName()
    ExamRegister().RegisterFailEmptyUser()
    ExamRegister().RegisterFailEmptyPassword()
    ExamRegister().RegisterFailEmptyRePassword()
    ExamRegister().RegisterFailPasswordUnder5()
    ExamRegister().Returntologin()





ExamDriver.driver.quit()

八、测试执行截图

8.1 登录

8.2 注册

8.3 首页

8.3 项目页

8.4 练习页

8.5 题库页

8.6 模板页

8.7 设置页

九、缺陷报告

|------|----|------|--------|-----|
| 缺陷等级 | 数量 | 状态 | 影响范围 | 优先级 |
| 致命缺陷 | 0 | - | - | - |
| 严重缺陷 | 2 | 待修复 | 组织机构管理 | P0 |
| 一般缺陷 | 0 | -待修复 | -首页性能 | P1 |
| 轻微缺陷 | 0 | - | - | - |
| 总计 | 2 | 待修复2 | - | - |

缺陷ID: BUG-001

基本信息:

缺陷标题: 组织机构模块无法正常添加新部门

缺陷等级 : 严重 (P0),缺陷状态: 待修复

发现日期 : 2026年1月20日,发现版本: 当前测试版本 (v1.0)

发现模块: 系统管理 → 组织机构

测试环境 : Windows 11 + Chrome 121.0.6167.160

缺陷ID: BUG-002

基本信息:

缺陷标题: 首页问卷记录和考试记录加载时间过长

缺陷等级: 严重 (P0)

缺陷状态 : 待修复
发现日期: 2026年1月19日

发现版本: 当前测试版本 (v1.0)

发现模块: 首页 → 问卷记录/考试记录

测试环境: Windows 11 + Chrome 121.0.6167.160

十、测试结论

  1. 功能完整性: ✅ 除了组织机构添加功能外,系统所有核心功能均正常运行

  2. 系统稳定性: ✅ 测试期间系统稳定,未出现崩溃或严重错误

  3. 用户体验: ✅ 界面友好,操作流程清晰,响应及时

  4. 数据一致性: ✅ 数据操作结果符合预期,无数据异常

  5. 测试覆盖: ✅ 自动化测试覆盖了所有主要功能模块

总体评价: 问卷考试系统功能基本完善,性能稳定,界面友好,但存在一个严重缺陷需要修复。

相关推荐
程序员杰哥9 小时前
Pytest自动化测试框架实战
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·pytest
测试19981 天前
2026最新软件测试面试八股文(含答案+文档)
自动化测试·软件测试·功能测试·测试工具·面试·职场和发展·测试用例
大飞记Python2 天前
代码级教程|用Playwright实现Web自动化测试:从零到录制生成脚本
自动化测试·python·selenium·playwright
问道飞鱼3 天前
【自动化测试】pytest 语法与核心概念
自动化测试·pytest·playwright
天才测试猿5 天前
Chrome浏览器+Postman做接口测试
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
软件测试君5 天前
2025年10款王炸AI测试工具,你用过几款?
自动化测试·软件测试·人工智能·深度学习·测试工具·单元测试·ai测试工具
测开小林5 天前
加入L-Tester开源项目:自动化测试平台
自动化测试·测试开发·开源·fastapi·测试平台
爱学习的潇潇6 天前
Postman学习之常用断言
自动化测试·软件测试·功能测试·学习·程序人生·lua·postman