【测试报告】问卷考试系统

一、项目介绍

        问卷考试系统是一个集问卷创建、在线考试、题库管理、模板复用及系统管理于一体的综合性Web应用。为用户提供从题目设计、发布、数据收集到分析的完整闭环功能。本次测试主要针对其用户界面(UI)及核心交互功能进行了全面验证。

        核心功能模块:

  • 注册与登录: 支持新用户注册、账户密码登录。具备账户唯一性校验、密码一致性校验、密码长度限制(≥6位)及表单必填项验证。
  • 个人中心: 用户可查看和管理个人信息、考试/问卷记录。
  • 我的项目: 用户项目(问卷/考试)的管理中心。支持新建、查找、预览、重命名、发布/停止、删除等全生命周期操作。
  • 创建问卷/考试: 提供专业的编辑器,包含概述、编辑、设置、数据、预览等多种视图和功能按钮,支持复杂题型和逻辑设置。
  • 题库中心: 包含“我的题库”、“试题管理”、“我的笔记”等子模块,支持题库的创建、导入、导出、编辑以及试题的收藏与错题管理。
  • 模板广场: 支持用户搜索、复用模板以快速创建项目。
  • 个人设置: 可修改基本信息、头像。
  • 安全设置: (存在严重缺陷) 提供修改密码功能。
  • 系统设置: 管理员可配置系统名称、图标等。

二、测试环境

  • 操作系统:Windows 11 家庭版
  • 游览器:Microsoft Edge(版本:143.0.3650.96)

三、测试工具

  • 测试工具:Selenium、WebDriver

四、测试用例

        测试用例内容较多,码云链接:问卷考试系统测试用例.pdf

五、自动化测试

SurveyExamAutoTest/
├── RunTest.py                    # 测试运行主程序
├── common/                       # 公共模块
│   ├── Drive.py                 # WebDriver 驱动封装
│   └── __init__.py              # 包初始化文件
├── images/                       # 测试截图文件夹(重要)
│   └── 2026-01-04/              # 按日期组织的测试证据
│       ├── CheckButton-*.png    # 按钮检查截图
├── res/                          # 资源文件夹
│   ├── msedgedriver.exe         # Edge浏览器驱动(必需)
│   └── 问卷考试系统测试用例.pdf   # 测试文档
└── tests/                        # 测试用例模块
    ├── Exam.py                  # 考试功能测试
    ├── Login.py                 # 登录功能测试
    ├── MyPractice.py            # 练习功能测试
    ├── MyProject.py             # 项目管理测试
    ├── Question.py              # 题目管理测试
    ├── QuestionBankCenter.py    # 题库中心测试(主模块)
    ├── Regist.py                # 用户注册测试
    ├── SystemManagement.py      # 系统管理测试
    ├── Template.py              # 模板管理测试
    ├── UserHomePage.py          # 用户主页测试
    └── __init__.py              # 包初始化文件

1. 驱动类
import datetime
import os.path
import sys

from selenium import webdriver
from selenium.webdriver.edge.service import Service as EdgeService
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys

# 驱动管理,但因网络问题,用不上
# from webdriver_manager.microsoft import EdgeChromiumDriverManager

class Driver:
    def __init__(self):
        self.edge_driver_Path = "D:\\小梦涵敲代码\\taibaicang\\Python\\SurveyExamAutoTest\\res\\msedgedriver.exe"
        options = webdriver.EdgeOptions()
        options.add_argument("-headless")
        options.add_argument(f"--window-size=1100,800")
        self.driver = webdriver.Edge(service=EdgeService(self.edge_driver_Path),options=options)
        self.driver.implicitly_wait(5)

    def ScreenShot(self):
        # 目录名
        dirname = datetime.datetime.now().strftime("%Y-%m-%d")
        # 创建目录
        if not os.path.exists("./images/"+dirname):
            os.makedirs("./images/"+dirname)
        # 截屏格式:函数名+当前时间+'.png'
        filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime("%H%M%S")+".png"
        self.driver.save_screenshot("./images/"+dirname+"/"+filename)

    def Log(self,unit,errdesc):
        print(f"Bug-所在模块{unit}-函数名{sys._getframe().f_back.f_code.co_name}-错误描述{errdesc}: 期望结果与预期结果不符合!!!")

    def Clear(self,element):
        actions = ActionChains(self.driver)
        actions.click(element)
        actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL)  # 正确的 Ctrl+A
        actions.send_keys(Keys.DELETE)
        actions.perform()

    def CloseWindow(self):
        # 切换到新打开的窗口
        curwindow = self.driver.current_window_handle
        allwindow = self.driver.window_handles
        for window in allwindow:
            if window != curwindow:
                self.driver.switch_to.window(window)
        # 关闭当前窗口
        self.driver.close()
        self.driver.switch_to.window(curwindow)

    def UserName(self):
        return datetime.datetime.now().strftime("%Y%m%d%H%M%S")

UiTestDriver = Driver()
2. 注册
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class Register:
    def __init__(self):
        self.url = "http://49.235.61.184:8080/user/register"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    # 姓名、登录账号、密码、确认密码
    def UserRegister(self, name, username, password, rePassword):
        # 清理输入框
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#name"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#username"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#password"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#rePassword"))
        # 输入姓名、账号、密码、确认密码
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(name)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys(rePassword)
        # 点击确认
        self.driver.find_element(By.CSS_SELECTOR,
                                  "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()

    def RegisterFun(self):
        self.driver.get("http://49.235.61.184:8080/user/register")
        # 验证注册失败功能
        # 1. 登录账号已存在
        self.UserRegister(self.username, self.username, self.password, self.password)
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.XPATH, "//div[@class='ant-alert-message']").text != "账号已存在":
            UiTestDriver.Log("RegisterFun", "登录账号已存在")
            UiTestDriver.ScreenShot()
        # 2. 登录密码、确认密码不一致
        self.UserRegister(self.username, self.username, "123456", "888888")
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.CSS_SELECTOR,"#rePassword_help > div").text != "两次密码不一致!":
            UiTestDriver.Log("RegisterFun", "登录账号已存在")
            UiTestDriver.ScreenShot()
        # 验证注册成功功能
        username = UiTestDriver.UserName()
        self.UserRegister(username, username, username, username)
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.XPATH,"//*[text()='注册成功']").text != "注册成功":
            UiTestDriver.Log("RegisterFun","验证注册成功功能")
            UiTestDriver.ScreenShot()

    def CheckButton(self):
        self.driver.get("http://49.235.61.184:8080/user/register")
        # 验证”返回登录按钮“是否可用
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div:nth-child(6) > a").click()
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.current_url != "http://49.235.61.184:8080/user/login":
            UiTestDriver.Log("CheckButton","验证”返回登录按钮“是否可用")
            UiTestDriver.ScreenShot()

    def CheckPasswordLenRestrict(self):
        self.driver.get("http://49.235.61.184:8080/user/register")
        # 验证密码长度限制是否有效
        # 1.长度为1
        username = UiTestDriver.UserName()
        self.UserRegister(username, username, "1", "1")
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text != "密码至少6位":
            UiTestDriver.Log("CheckPasswordLenRestrict","密码长度为1")
            UiTestDriver.ScreenShot()
        # 1.长度为5
        username = UiTestDriver.UserName()
        self.UserRegister(username, username, "12345", "12345")
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text != "密码至少6位":
            UiTestDriver.Log("CheckPasswordLenRestrict","密码长度为5")
            UiTestDriver.ScreenShot()
        # 2. 长度为6
        username = UiTestDriver.UserName()
        self.UserRegister(username, username, "123456", "123456")
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        if self.driver.find_element(By.XPATH, "//*[text()='注册成功']").text != "注册成功":
            UiTestDriver.Log("RegisterFun", "验证注册成功功能")
            UiTestDriver.ScreenShot()

    def CheckRequireRestrict(self):
        self.driver.get("http://49.235.61.184:8080/user/register")
        # 验证必填选项
        test_cases = [
            # 姓名,登录用户,密码,确认密码,是否回显错误信息,是否回显错误信息,是否回显错误信息,是否回显错误信息
            ("", "", "", "", True, True, True, True),  # 不填写、不填写、不填写、不填写
            ("", "FSRMWK", "", "123456", True, False, True, False),  # 不填写、填写、不填写、填写
            ("", "", "123456", "", True, True, False, True),  # 不填写、不填写、填写、不填写
            ("FSRMWK", "", "", "", False, True, True, True),  # 填写、不填写、不填写、不填写
            ("", "FSRMWK", "", "", True, False, True, True),  # 不填写、填写、不填写、不填写
            ("FSRMWK", "", "123456", "123456", False, True, False, False),  # 填写、不填写、填写、填写
        ]
        for (name,username,password,rePassword,
             nameerr,usernameerr,passworderr,rePassworderr) in test_cases:
            self.UserRegister(name, username, password, rePassword)
            time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
            if nameerr:
                assert self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text == "用户名是必填项!"
            if usernameerr:
                assert self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").text == "登录账号不能为空"
            if passworderr:
                assert self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text == "密码是必填项!"
            if rePassworderr:
                assert self.driver.find_element(By.CSS_SELECTOR, "#rePassword_help > div").text == "请再次输入密码"
            UiTestDriver.ScreenShot()

if __name__ == "__main__":
    login = Register()
    login.RegisterFun()
3. 登录
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver


class Login:
    def __init__(self):
        self.url = "http://49.235.61.184:8080/user/login"
        self.home_url = "http://49.235.61.184:8080/home"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def UserLogin(self,username,password):
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()

    def LoginFunc(self):
        self.driver.get(self.url)
        # 验证登录功能(正常登录、异常登录)
        # 2. 输入正确的账号,错误的密码
        self.UserLogin(self.username,"666666")
        time.sleep(0.5)
        assert self.driver.find_element(By.XPATH,"//div[@class='ant-alert-message']").text == "错误的用户名和密码"
        UiTestDriver.ScreenShot()
        # 3. 输入错误的账号,正确的密码
        self.UserLogin(UiTestDriver.UserName(),self.password)
        time.sleep(0.5)
        assert self.driver.find_element(By.XPATH,"//div[@class='ant-alert-message']").text == "错误的用户名和密码"
        UiTestDriver.ScreenShot()
        # 1. 输入正确的账号与密码
        self.UserLogin(self.username,self.password)
        time.sleep(0.5)
        assert self.driver.find_element(By.XPATH,"//*[text()='登录成功!']").text == "登录成功!"
        UiTestDriver.ScreenShot()

    def CheckButton(self):
        self.driver.get(self.url)
        # ”注册账户“按钮是否可用
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div:nth-child(4) > a").click()
        assert self.driver.current_url == "http://49.235.61.184:8080/user/register"
        UiTestDriver.ScreenShot()

    def CheckRequireRestrict(self):
        self.driver.get(self.url)
        # 验证必填选项
        # 1. 账户不填写、密码不填写
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        assert self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").text == "用户名是必填项!"
        assert self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text == "密码是必填项!"
        UiTestDriver.ScreenShot()
        # 2. 账户填写、密码不填写
        self.driver.refresh()
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        assert self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text == "密码是必填项!"
        UiTestDriver.ScreenShot()
        # 3. 账户不填写、密码填写
        self.driver.refresh()
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
        time.sleep(0.5)  # BUG? --- 隐式等待不能解决,等待文字的渲染的问题!
        assert self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").text == "用户名是必填项!"
        UiTestDriver.ScreenShot()



4. 模板管理
import time

from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class TemplateEdit:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/template"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(0.5)

    def CheckEmement(self):
        self.driver.get(self.url)
        # 验证模板广场、分类、标签等元素是否存在
        self.driver.find_element(By.XPATH,"//span[@class='ant-page-header-heading-title ']")
        self.driver.find_element(By.XPATH,"//form/div[1]/div/span")
        self.driver.find_element(By.XPATH,"//form/div[2]/div/span")

    def CheckButton(self):
        self.driver.get(self.url)
        # 验证验证搜模板、私有库、公有库、添加模板等按钮是否有效
        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()
        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)").click()
        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").click()
        # 添加模板、打开模板编辑框
        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()
        # 外观
        self.driver.find_element(By.XPATH, "//div[@class='survey-sidebar-panel-tabs']/div[2]").click()
        time.sleep(0.5)
        # 逻辑
        self.driver.find_element(By.XPATH, "//div[@class='survey-sidebar-panel-tabs']/div[3]").click()
        time.sleep(0.5)
        # 题目
        self.driver.find_element(By.XPATH, "//div[@class='survey-sidebar-panel-tabs']/div[1]").click()
        time.sleep(0.5)
        # 题库
        self.driver.find_element(By.XPATH, "//div[text()='题库']").click()
        time.sleep(0.5)
        # 大纲
        self.driver.find_element(By.XPATH, "//div[text()='大纲']").click()
        time.sleep(0.5)
        # 题型
        self.driver.find_element(By.XPATH,"//div[text()='题型']").click()
        time.sleep(0.5)
        # JSON
        self.driver.find_element(By.XPATH,"//*[@class='survey-main-panel-toolbar']/div[2]//button[3]").click()
        # 预览
        self.driver.find_element(By.XPATH,"//*[@class='survey-main-panel-toolbar']/div[2]//button[4]").click()
        # 编辑
        self.driver.find_element(By.XPATH,"//*[@class='survey-main-panel-toolbar']/div[2]//button[2]").click()
        # 保存 + 保存操作
        self.driver.find_element(By.XPATH,"//*[@class='survey-main-panel-toolbar']/div[2]//button[5]").click()
        time.sleep(0.5)
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys("测试模板创建功能")
        self.driver.find_element(By.CSS_SELECTOR,"#category").send_keys("自动化测试")
        self.driver.find_element(By.CSS_SELECTOR,"#survey-modal-container > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary").click()
        time.sleep(0.5)
        if self.driver.find_element(By.XPATH,"//*[text()='问卷模板保存成功']").text.strip() != "问卷模板保存成功":
            UiTestDriver.Log("CheckButton", "模板的保存功能")
            UiTestDriver.ScreenShot()

    def TemplateSearsh(self):
        self.driver.get(self.url)
        # 模板的搜索功能
        self.driver.find_element(By.XPATH,"//input").send_keys("自动化测试添加模板")
        # 指定模板名字搜索XXX公有库
        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 > span").click()
        # 期望结果,返回符合要求的。
        if len(self.driver.find_elements(By.XPATH,"//*[@class='ant-spin-container']/div/div[1]//a")) == 0:
            UiTestDriver.Log("TemplateSearsh","模板的搜索功能")
            UiTestDriver.ScreenShot()

    def UnLoginStatus(self):
        self.driver.get(self.url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

if __name__ == "__main__":
    template = TemplateEdit()
    template.UnLoginStatus()
    template.Login()
    template.CheckEmement()
    template.CheckButton()
    template.TemplateSearsh()
5. 用户首页
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class HomePage:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/home"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(0.5)

    def CheckElement(self):
        self.driver.get(self.url)
        # 头像、昵称、问卷数、考试数等元素是否存在
        self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span.ant-avatar.ant-avatar-circle.ant-avatar-image > img")
        self.driver.find_element(By.CSS_SELECTOR,"#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")
        self.driver.find_element(By.XPATH,"//div[text()='问卷数']")
        self.driver.find_element(By.XPATH,"//div[text()='考试数']")

    def CheckButton(self):
        self.driver.get(self.url)
        # 我的考试、我的问卷、问卷记录、考试记录、创建问卷、创建考试、齿轮⚙等按钮是否有效
        self.driver.find_element(By.XPATH, "//div[text()='我的考试']").click()
        self.driver.find_element(By.XPATH, "//div[text()='我的问卷']").click()
        self.driver.find_element(By.XPATH, "//div[text()='问卷记录']").click()
        self.driver.find_element(By.XPATH, "//div[text()='考试记录']").click()
        self.driver.find_element(By.XPATH, "//div/a[text()='创建问卷']").click()
        self.driver.back()
        self.driver.find_element(By.XPATH, "//div/a[text()='创建考试']").click()
        self.driver.back()
        self.driver.find_element(By.XPATH, "//*[@id='sk-layout']/div/div/section/div[2]/header[2]/div/div[3]/div/div/div/div[2]/span").click()

    def UnLoginStatus(self):
        self.driver.get(self.url)
        time.sleep(0.5)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()
6. 问卷编辑
import time

from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class Question:

    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.survey_url = "http://49.235.61.184:8080/survey/new?mode=survey"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(1)

    def CheckElement(self):
        # 进入到创建问卷界面
        self.driver.get(self.survey_url)
        # 验证概述、编辑、设置、数据、报表、项目等元素是否存在
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(1)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(2)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(3)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(4)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(5)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(6)")

    def CheckButton(self):
        # 进入到创建问卷界面
        self.driver.get(self.survey_url)
        # 验证外观、逻辑、题目、JSON、预览、编辑、题库、题型、大纲等按钮是否有效
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div:nth-child(2)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div:nth-child(3)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div: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: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:nth-child(3)").click()
        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(1)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-2-tab-2").click()
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-2-tab-1").click()
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-2-tab-3").click()

    def Preserve(self):
        # 进入到创建问卷界面
        self.driver.get(self.survey_url)
        # 问卷是否可保存
        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, "#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()
        time.sleep(1) # 代码不能执行太快
        assert self.driver.find_element(By.XPATH,"//span[text()='保存成功']").text == "保存成功"
        UiTestDriver.ScreenShot()

    def UnLoginStatus(self):
        # 未登录状态访问,重定向到登录界面
        self.driver.get(self.survey_url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()
7. 考试编辑
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class Exam:

    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.exam_url = "http://49.235.61.184:8080/survey/new?mode=exam"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(1)

    def CheckElement(self):
        # 进入到创建考试界面
        self.driver.get(self.exam_url)
        # # 验证概述、编辑、设置、数据、报表、项目等元素是否存在
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(1)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(2)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(3)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(4)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(5)")
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.survey-main-navigator > div.actions-container > div:nth-child(6)")

    def CheckButton(self):
        # 进入到创建考试界面
        self.driver.get(self.exam_url)
        # 验证外观、逻辑、题目、JSON、预览、编辑、题型、大纲等按钮是否有效
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div:nth-child(2)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div:nth-child(3)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-sidebar-panel > div.survey-sidebar-panel-tabs > div: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: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:nth-child(3)").click()
        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(1)").click()
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-2-tab-3").click()
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-2-tab-1").click()

    def Preserve(self):
        # 问卷是否可保存
        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, "#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()
        time.sleep(1) # 代码不能执行太快
        assert self.driver.find_element(By.XPATH,"//span[text()='保存成功']").text == "保存成功"
        UiTestDriver.ScreenShot()

    def UnLoginStatus(self):
        # 未登录状态访问,重定向到登录界面
        self.driver.get(self.exam_url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

8. 我的项目
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class MyProject:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.myproject_url = "http://49.235.61.184:8080/project"
        self.survey_url = "http://49.235.61.184:8080/survey/new?mode=survey"
        self.exam_url = "http://49.235.61.184:8080/survey/new?mode=exam"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(1)

    def Search(self,filename):
        element = self.driver.find_element(By.XPATH, "//input[@class='ant-input']")
        UiTestDriver.Clear(element)
        # 根据filename,在myproject_url进行关键字查询。
        element.send_keys(filename)
        self.driver.find_element(By.XPATH,"//*[@data-icon='search']").click()
        # 统一显示方式。
        self.driver.find_element(By.XPATH,"//*[@data-icon='unordered-list']").click()
        time.sleep(0.5)
        return filename in self.driver.find_element(By.XPATH,"//tbody/tr").text

    def QuestSurvey(self):
        self.driver.get(self.myproject_url)
        # 新建问卷调查 - 期望结果:跳转到创建问卷页面
        self.driver.find_element(By.XPATH, "//button[@class='ant-btn ant-btn-primary ant-btn-lg ant-dropdown-trigger']").click()
        time.sleep(0.5) # 元素尺寸为0无法点击是什么报错???
        self.driver.find_element(By.XPATH, "//span[text()='问卷调查']").click()
        assert self.driver.current_url == self.survey_url

    def OnlineExam(self):
        # 新建在线考试 - 期望结果:跳转到创建考试页面
        self.driver.get(self.myproject_url)
        self.driver.find_element(By.XPATH, "//button[@class='ant-btn ant-btn-primary ant-btn-lg ant-dropdown-trigger']").click()
        time.sleep(1) # 元素尺寸为0无法点击是什么报错???
        self.driver.find_element(By.XPATH, "//span[text()='在线考试']").click()
        assert self.driver.current_url == self.exam_url

    def Folder(self):
        # 新建文件夹 - 期望结果:完成文件夹的创建功能
        self.driver.get(self.myproject_url)
        self.driver.find_element(By.XPATH,"//button[@class='ant-btn ant-btn-primary ant-btn-lg ant-dropdown-trigger']").click()
        time.sleep(1)  # 元素尺寸为0无法点击是什么报错???
        self.driver.find_element(By.XPATH,"//span[text()='新建文件夹']").click()
        # 以时间戳的形式命名,方便验证创建功能。
        filename = UiTestDriver.UserName()
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys(filename)
        self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(9) > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary > span").click()
        # 搜索filename文件夹,以验证其功能,也顺手验证了搜索功能。
        self.Search(filename)

    def RecycleBin(self):
        # 回收站 - 期望结果:还原回收站的第一个项目
        self.driver.get(self.myproject_url)
        self.driver.find_element(By.XPATH, "//button[@class='ant-btn ant-btn-primary ant-btn-lg ant-dropdown-trigger']").click()
        time.sleep(1)  # 元素尺寸为0无法点击是什么报错???
        self.driver.find_element(By.XPATH,"//span[text()='回收站']").click()
        # 恢复第一个项目
        self.driver.find_element(By.XPATH,"//tbody/tr/td/label/span").click()
        self.driver.find_element(By.XPATH,"//a[text()='恢复']").click()
        # 二次确认
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//button[@class='ant-btn ant-btn-primary']/span").click()

    def SearchByName(self):
        self.driver.get(self.myproject_url)
        self.Search("无感")

    def OperatorForFolder(self):
        self.driver.get(self.myproject_url)
        # 统一显示方式。
        self.driver.find_element(By.XPATH,"//*[@data-icon='unordered-list']").click()
        # 重命名
        self.driver.find_element(By.XPATH,"//tbody/tr[1]/td[7]/a[1]").click()
        newfilename = "测试重命名功能" + UiTestDriver.UserName()
        UiTestDriver.Clear(self.driver.find_element(By.XPATH,"//div/input"))
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//div/input").send_keys(newfilename)
        self.driver.find_element(By.XPATH,"//div[@class='ant-modal-footer']/button[2]").click()
        # 删除
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//tbody/tr[1]/td[7]/a[2]").click()
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//div[@class='ant-modal-confirm-btns']/button[2]").click()
        time.sleep(1)
        # 验证删除效果。
        assert False == self.Search(newfilename)
        # 查看目录
        self.driver.refresh()
        for i in range(1,3):
            time.sleep(0.5)
            self.driver.find_element(By.XPATH, f"//tbody/tr[1]/td[{i}]").click()
            time.sleep(0.5)
            self.driver.find_element(By.XPATH, f"//ol/li[2]/span[@class='ant-breadcrumb-link']").click()

    def OperatorForFile(self):
        # 预备工作
        self.driver.get(self.myproject_url)
        assert self.Search("请输入标题") == True
        UiTestDriver.ScreenShot()
        # 获取第一个项目的所有文本描述。
        text = self.driver.find_element(By.XPATH,"//tbody/tr[1]").text
        assert ("问卷" in text) or ("考试" in text)
        # 预览
        self.driver.find_element(By.XPATH, "//tbody/tr[1]/td[7]/span").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//span[text()='预览']").click()
        UiTestDriver.CloseWindow()
        # 发布/停止发布
        for i in range (0,2):
            text = self.driver.find_element(By.XPATH,"//tbody/tr[1]").text
            if("未开始" in text) :
                self.driver.find_element(By.XPATH, "//tbody/tr[1]/td[7]/span").click()
                time.sleep(0.5)
                self.driver.find_element(By.XPATH, "//span[text()='发布']").click()
                time.sleep(0.5)
                self.driver.find_element(By.XPATH, "//span[text()='发 布']").click()
                time.sleep(0.5)
                assert self.driver.find_element(By.XPATH,"//tbody/tr[1]/td[2]").text == "收集中"
            elif "收集中" in text:
                self.driver.find_element(By.XPATH, "//tbody/tr[1]/td[7]/span").click()
                time.sleep(0.5)
                self.driver.find_element(By.XPATH, "//span[text()='停止']").click()
                time.sleep(0.5)
                self.driver.find_element(By.XPATH, "//span[text()='停 止']").click()
                time.sleep(0.5)
                assert self.driver.find_element(By.XPATH,"//tbody/tr[1]/td[2]").text == "未开始"
        # 删除
        self.driver.find_element(By.XPATH, "//tbody/tr[1]/td[7]/span").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//span[text()='删除']").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//span[text()='删 除']").click()
        time.sleep(0.5)
        # 重命名
        filename = UiTestDriver.UserName()
        self.driver.find_element(By.XPATH, "//tbody/tr/td[7]/span").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//span[text()='重命名']").click()
        element = self.driver.find_element(By.XPATH, "/html/body/div[5]/div/div[2]/div/div[2]/div/div/div[1]/div/div/input")
        UiTestDriver.Clear(element)
        element.send_keys(filename)
        self.driver.find_element(By.XPATH, "//span[text()='确 认']").click()
        assert self.Search(filename) == True

    def CheckElement(self):
        self.driver.get(self.myproject_url)
        # 我的项目、项目名称、项目状态、类型、答卷数、创建时间、更新时间、操作等元素是否存在
        element_checks = ["//div[@class='ant-page-header-heading-left ']/span[text()='我的项目']",
                          "//thead[@class='ant-table-thead']/tr/th[1]",
                          "//thead[@class='ant-table-thead']/tr/th[2]",
                          "//thead[@class='ant-table-thead']/tr/th[3]",
                          "//thead[@class='ant-table-thead']/tr/th[4]",
                          "//thead[@class='ant-table-thead']/tr/th[5]",
                          "//thead[@class='ant-table-thead']/tr/th[6]",
                          "//thead[@class='ant-table-thead']/tr/th[7]"]
        # 统一显示方式。
        self.driver.find_element(By.XPATH,"//*[@data-icon='unordered-list']").click()
        for i in range(len(element_checks)):
            self.driver.find_element(By.XPATH,element_checks[i])

    def UnLoginStatus(self):
        self.driver.get(self.myproject_url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

if __name__ == "__main__":
    myproject = MyProject()
    # myproject.UnLoginStatus()
    myproject.Login()
    # myproject.CheckElement()
    # myproject.QuestSurvey()
    # myproject.OnlineExam()
    # myproject.Folder()
    # myproject.RecycleBin()
    # myproject.SearchByName()
    # myproject.OperatorForFolder()
    myproject.OperatorForFile()
    # myproject.CheckElement()
9. 我的练习
import time
from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class MyPractice:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/exercise"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(0.5)

    def MyPractice(self):
        self.driver.get(self.url)
        # 验证查询、重置、继续答题、二维码、删除等按钮是否有效
        self.driver.find_element(By.XPATH,"//*[text()='查 询']").click()
        self.driver.find_element(By.XPATH,"//*[text()='重 置']").click()
        self.driver.find_element(By.XPATH,"//tbody/tr/td[6]/div/div[1]/a").click()
        self.driver.back()
        self.driver.find_element(By.XPATH,"//tbody/tr/td[6]/div/div[2]/a").click()
        self.driver.find_element(By.XPATH,"//tbody/tr/td[6]/div/div[3]/a").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//*[text()='取 消']").click()
        # 是否能通过点击题库目录完成跳转,进入某个题库目录界面
        self.driver.find_element(By.XPATH,"//div[@class='ant-tabs-nav-list']/div[2]").click()
        time.sleep(0.5)

    def QuestionBankDirectory(self):
        self.driver.get(self.url)
        # 是否能通过点击题库目录完成跳转,进入某个题库目录界面
        self.driver.find_element(By.XPATH,"//div[@class='ant-tabs-nav-wrap']/div/div[2]/div").click()
        time.sleep(0.5)
        # 根据题库名称的查询功能 "//*[@id="name"]"
        element = self.driver.find_element(By.XPATH,"//*[@id='name']")
        UiTestDriver.Clear(element)
        element.send_keys("语文")
        self.driver.find_element(By.XPATH,"//*[text()='查 询']").click()
        # 验证重置按钮是否有效
        self.driver.find_element(By.XPATH,"//*[text()='重 置']").click()
        # 验证开始练习按钮是否有效
        cururl = self.driver.current_url
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//*[text()='开始练习']").click()
        time.sleep(1)
        self.driver.find_element(By.XPATH,"//*[text()='顺序练习']").click()
        assert cururl != self.driver.current_url

    def UnLoginStatus(self):
        self.driver.get(self.url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()


if __name__ == "__main__":
    mypractice = MyPractice()
    mypractice.UnLoginStatus()
    mypractice.Login()
    mypractice.MyPractice()
    mypractice.QuestionBankDirectory()
10. 题库中心
import time

from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class MyQustionBank:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/repo/index"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(0.5)

    def CreateQuestionBankFunc(self):
        self.driver.get(self.url)
        # 新建题库
        self.driver.find_element(By.XPATH, "//span[text()='新建']").click()
        time.sleep(0.5)
        drawer = self.driver.find_element(By.CLASS_NAME, "ant-drawer-wrapper-body")
        # 验证共享题库、添加到练习题库的按钮是否有效
        drawer.find_element(By.XPATH, "//*[@id='shared']").click()
        drawer.find_element(By.XPATH, "//*[@id='isPractice']").click()
        # 验证必填选项
        # 1. 题库名称、题库类型:填写、不填写
        drawer.find_element(By.CSS_SELECTOR, "#name").send_keys("验证必填选项")
        drawer.find_element(By.XPATH, ".//*[@class='ant-btn ant-btn-primary']").click()
        time.sleep(0.5) # 等待渲染
        assert self.driver.find_element(By.CSS_SELECTOR,"#mode_help > div").text == "请选择题库类型"
        UiTestDriver.ScreenShot()
        # # 2. 题库名称、题库类型:不填写,填写
        UiTestDriver.Clear(drawer.find_element(By.CSS_SELECTOR, "#name"))
        drawer.find_element(By.CSS_SELECTOR, "#mode").click()
        drawer.find_element(By.XPATH, f".//*[@title='问卷']").click()
        drawer.find_element(By.XPATH, ".//*[@class='ant-btn ant-btn-primary']").click()
        time.sleep(0.5)
        assert self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text == "题库名称不能为空"
        UiTestDriver.ScreenShot()
        # 3. 题库名称、题库类型:不填写、不填写
        drawer.find_element(By.XPATH, "//span[@class='ant-select-clear']").click()
        drawer.find_element(By.XPATH, ".//*[@class='ant-btn ant-btn-primary']").click()
        time.sleep(0.5)
        assert self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text == "题库名称不能为空"
        assert self.driver.find_element(By.CSS_SELECTOR, "#mode_help > div").text == "请选择题库类型"
        UiTestDriver.ScreenShot()
        # 新增题库功能
        self.driver.refresh()
        types = ['问卷','考试']
        for i in range (len(types)):
            name = "新增题库功能" + UiTestDriver.UserName()
            self.driver.find_element(By.XPATH, "//span[text()='新建']").click()
            drawer = self.driver.find_element(By.CLASS_NAME, "ant-drawer-wrapper-body")
            drawer.find_element(By.CSS_SELECTOR, "#name").send_keys(name)
            # 这个下拉框会因为其它操作消失,咋定位。下拉框的元素本身位于抽屉内部。那就定位文字吧。
            drawer.find_element(By.CSS_SELECTOR, "#mode").click()
            drawer.find_element(By.XPATH, f".//*[@title='{types[i]}']").click()
            drawer.find_element(By.XPATH, ".//*[@class='ant-btn ant-btn-primary']").click()
            assert self.driver.current_url == self.url

    def SeachByQBName(self):
        self.driver.get(self.url)
        # 根据题库名查找
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("新增题库功能")
        self.driver.find_element(By.XPATH,"//div[@class='ant-space ant-space-horizontal ant-space-align-center']//span[text()='查 询']").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-table-wrapper > div > div > div > div > div > table > tbody > tr.ant-table-row.ant-table-row-level-0 > td:nth-child(1) > div")

    def OperateForQB(self):
        self.driver.get(self.url)
        # 针对某个题库的操作
        # 文本导入
        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").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"/html/body/div[4]/div/div[3]/div/div/div[1]/div[2]/div/div[2]").click()
        # 模板导入(题库类型为考试)
        time.sleep(0.5)
        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(2) > a").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"/html/body/div[5]/div/div[2]/div/div[2]/div[3]/button[1]/span").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-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(3) > a").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//div[@tabindex='-1']/div[3]/div/div/div[1]/div[2]/div/div/button/span").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-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(4) > a > span > svg").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//span[@class='ant-dropdown-menu-title-content'][text()='编辑']").click()
        self.driver.find_element(By.CSS_SELECTOR,"body > div:nth-child(10) > div > div.ant-drawer-content-wrapper > div > div > div.ant-drawer-footer > div > div > div:nth-child(2) > button > span").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-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(4) > a > span > svg").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//span[@class='ant-dropdown-menu-title-content'][text()='导出']").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-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(4) > a > span > svg").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//span[@class='ant-dropdown-menu-title-content'][text()='删除']").click()
        self.driver.find_element(By.XPATH,"//*[text()='删 除']").click()

    def UnLoginStatus(self):
        self.driver.get(self.url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

class QuestionManage:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/repo/template"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(0.5)

    def CheckElement(self):
        self.driver.get(self.url)
        # 检查重置、查询、展开、收起等按钮
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='重 置']").click()
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='查 询']").click()
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='展开']").click()
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='收起']").click()

    def CheckButton(self):
        self.driver.get(self.url)
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='展开']").click()
        # 检查类型、题型、名称、标签等元素
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='类型']")
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='题型']")
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='名称']")
        self.driver.find_element(By.XPATH,"//div[@class='ant-pro-card ant-pro-table-search ant-pro-table-search-query-filter']//*[text()='标签']")

    def UnLoginStatus(self):
        self.driver.get(self.url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

class MyNote:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.url = "http://49.235.61.184:8080/repo/book"
        self.username = "admin"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH, "//button[@type='submit']").click()
        time.sleep(0.5)

    def CheckElement(self):
        self.driver.get(self.url)
        # 检查我的收藏、我的错题、重置、查询、展开、收起等按钮
        self.driver.find_element(By.XPATH,"//div[@ class='ant-tabs-nav-list']/div[2]/div").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//div[@ class='ant-tabs-nav-list']/div[1]/div").click()
        time.sleep(0.5)
        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/div[4]/div/div/div[2]/div/div/div/div[1]/div/div[1]/button/span").click()
        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/div[4]/div/div/div[2]/div/div/div/div[1]/div/div[2]/button/span").click()
        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/div[4]/div/div/div[2]/div/div/div/div[2]/a").click()
        time.sleep(0.5)
        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/div[4]/div/div/div[2]/div/div/div/div[2]/a").click()

    def CheckButton(self):
        self.driver.get(self.url)
        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/div[4]/div/div/div[2]/div/div/div/div[2]/a").click()
        # 检查问题标题、笔记、创建时间等元素
        drawer = 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-card-border.ant-pro-card-bordered.ant-pro-table-search.ant-pro-table-search-query-filter > form")
        drawer.find_element(By.XPATH,"//*[text()='问题标题']")
        drawer.find_element(By.XPATH,"//*[text()='笔记']")
        drawer.find_element(By.XPATH,"//*[text()='创建时间']")

    def UnLoginStatus(self):
        self.driver.get(self.url)
        assert self.driver.current_url == self.login_url
        UiTestDriver.ScreenShot()

if __name__ == "__main__":
    mqb = MyQustionBank()
    qm = QuestionManage()
    mn = MyNote()
    mqb.UnLoginStatus()
    qm.UnLoginStatus()
    mn.UnLoginStatus()
    mqb.Login()
    mqb.CreateQuestionBankFunc()
    mqb.SeachByQBName()
    mqb.OperateForQB()
    qm.Login()
    qm.CheckElement()
    qm.CheckButton()
    mn.Login()
    mn.CheckElement()
    mn.CheckButton()
11. 系统管理
import time

from selenium.webdriver.common.by import By
from common.Drive import UiTestDriver

class PersonSet:
    def __init__(self):
        self.login_url = "http://49.235.61.184:8080/user/login"
        self.personset_url = "http://49.235.61.184:8080/system/setting"
        self.username = "FSRMWK"
        self.password = "123456"
        self.driver = UiTestDriver.driver

    def Login(self):
        # 获取登录权限
        self.driver.get(self.login_url)
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(self.username)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(self.password)
        self.driver.find_element(By.XPATH,"//button[@type='submit']").click()
        time.sleep(1)

    def PerInfoSubmit(self,name,phone,email,profile):
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#name"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#phone"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#email"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR,"#profile"))
        self.driver.find_element(By.CSS_SELECTOR,"#name").send_keys(name)
        self.driver.find_element(By.CSS_SELECTOR,"#phone").send_keys(phone)
        self.driver.find_element(By.CSS_SELECTOR,"#email").send_keys(email)
        self.driver.find_element(By.CSS_SELECTOR,"#profile").send_keys(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 > span").click()

    def PasswordModify(self,oldPassword,password,confirmPassword):
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR, "#oldPassword"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
        UiTestDriver.Clear(self.driver.find_element(By.CSS_SELECTOR, "#confirmPassword"))
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR, "#oldPassword").send_keys(oldPassword)
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(password)
        self.driver.find_element(By.CSS_SELECTOR, "#confirmPassword").send_keys(confirmPassword)
        self.driver.find_element(By.XPATH, "//span[text()='确认修改']").click()

    def CheckButton(self):
        self.driver.get(self.personset_url)
        # 基本设置、安全设置、AI设置、系统设置等按钮是否有效
        self.driver.find_element(By.XPATH,"//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[2]").click()
        self.driver.find_element(By.XPATH,"//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[3]").click()
        self.driver.find_element(By.XPATH,"//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[4]").click()
        self.driver.find_element(By.XPATH,"//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[1]").click()

    def BaseSet(self):
        # 基本设置
        self.driver.get(self.personset_url)
        info = UiTestDriver.UserName()
        # 验证必填选项
        # 简化的测试用例数组
        test_cases = [
            # 姓名、手机号、邮箱、个人介绍
            ("","","",""),       # 全部不填写
            ("",info,info,info), # 姓名不填写
            (info,"",info,info), # 手机号不填写
            (info,info,"",info), # 邮箱不填写
            (info,info,info,""), # 个人简历不填写
            (info,info,info,info) # 全部填写 + 个人信息修改功能
        ]
        for name,phone,email,profile in test_cases:
            self.PerInfoSubmit(name,phone,email,profile)
            time.sleep(0.5) # 等待时间渲染。
            if name == "":
                assert self.driver.find_element(By.CSS_SELECTOR,"#name_help > div").text == "请输入您的昵称!"
            if phone == "":
                assert self.driver.find_element(By.CSS_SELECTOR,"#phone_help > div").text == "请输入您的联系电话!"
            if email == "":
                assert self.driver.find_element(By.CSS_SELECTOR,"#email_help > div").text == "请输入您的邮箱!"
            if profile == "":
                assert self.driver.find_element(By.CSS_SELECTOR,"#profile_help > div").text == "请输入个人简介!"
            if name != "" and phone != "" and email != "" and profile != "" :
                assert self.driver.find_element(By.XPATH, "//span[text()='更新基本信息成功']").text == "更新基本信息成功"
        # 头像修改功能
        self.driver.find_element(By.XPATH,"//input[@type='file']").send_keys("D:\\小梦涵敲代码\\taibaicang\\Python\\SurveyExamAutoTest\\res\\头像.jpg")
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//span[text()='确 定']").click()

    def SafeSet(self):
        # 安全设置
        self.driver.get(self.personset_url)
        self.driver.find_element(By.XPATH, "//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[2]").click()
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//ul[@class='ant-list-item-action']/li/a").click()
        time.sleep(0.5)
        # 验证密码必填项
        self.PasswordModify("","","")
        self.driver.find_element(By.XPATH, "//span[text()='确认修改']").click()
        time.sleep(0.5)
        assert self.driver.find_element(By.CSS_SELECTOR, "#oldPassword_help > div").text == "请输入密码!"
        assert self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text == "请输入密码!"
        assert self.driver.find_element(By.CSS_SELECTOR, "#confirmPassword_help > div").text == "请再次输入密码"
        # 简化的测试用例数组
        test_cases = [
            # 测试说明, 旧密码(如果为空,则使用默认的密码), 新密码, 确认密码, 期望结果类型(True为要查找成功错误)
            ( "1.旧密码不正确", "888888", "040624", "040624", False), # 密码验证失败
            ( "2.新密码与确认密码不一致", "", "040624", "888888", False), # 两次密码输入不一致
            ( "3.旧密码与新密码一致", "", "", self.password, False), # 密码修改成功
            ( "4.修改密码成功","", "040624", "040624", True), # 密码修改成功
            ( "5.新密码长度为1", "", "1", "1", False), # 密码修改成功
            ( "6.新密码长度为5", "", "12345", "12345", False), # 密码修改成功
            ( "7.新密码长度为6", "", "123456", "123456", True) # 密码修改成功
        ]
        for description, old_pwd, new_pwd, confirm_pwd, expected_type in test_cases:
            print(f"--{description}--")
            # 输入密码、点击提交按钮
            if old_pwd == "":
                old_pwd = self.password
            self.PasswordModify(old_pwd, new_pwd, confirm_pwd)
            # 收集错误信息
            time.sleep(0.5)
            if new_pwd == confirm_pwd:
                element = self.driver.find_element(By.XPATH, "//*[text()='密码验证失败' or text()='密码修改成功']")
                print(element.text)
                # 实际结果
                if "密码修改成功" in element.text:
                    if not expected_type:
                        UiTestDriver.Log("SafeSet",description)
                    self.password = new_pwd
                    print(old_pwd,self.password)
                    self.driver.find_element(By.XPATH, "//ul[@class='ant-list-item-action']/li/a").click()
                    time.sleep(1)
                elif "密码验证失败" in element.text:
                    if expected_type:
                        UiTestDriver.Log("SafeSet",description)
                    time.sleep(1)
            else:
                assert self.driver.find_element(By.XPATH, "//*[text()='两次密码输入不一致']")
                UiTestDriver.ScreenShot()

    def AISet(self):
        # AI设置
        self.driver.get(self.personset_url)
        # 登录账号 - 跳转个人设置界面 - 安全设置界面
        self.driver.find_element(By.XPATH, "//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[3]").click()
        time.sleep(0.5)
        # 验证启动AI功能、提交、重置按钮是否有效
        self.driver.find_element(By.CSS_SELECTOR, "#aiSetting_enabled").click()
        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 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button > span").click()
        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 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(1) > button > span").click()
        self.driver.find_element(By.XPATH,"//*[text()='更新AI配置成功']")

    def SystemSet(self):
        # 系统设置
        self.driver.get(self.personset_url)
        # 登录账号 - 跳转个人设置界面 - 系统设置
        self.driver.find_element(By.XPATH, "//ul[@class='ant-menu ant-menu-root ant-menu-inline ant-menu-light']/li[4]").click()
        # 更换系统图标功能
        self.driver.find_element(By.XPATH,"//input[@type='file']").send_keys("D:\\小梦涵敲代码\\taibaicang\\Python\\SurveyExamAutoTest\\res\\头像.jpg")
        time.sleep(0.5)
        # 提交、重置按钮是否有效
        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(1) > button > span").click()
        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 > span").click()



    def UnLoginStatus(self):
        self.driver.get(self.personset_url)
        if self.driver.current_url != self.login_url:
            UiTestDriver.Log("UnLoginStatusUnLoginStatus","无登录凭证访问,重定向")
            UiTestDriver.ScreenShot()

if __name__ == "__main__":
    person = PersonSet()
    person.UnLoginStatus()
    person.Login()
    person.CheckButton()
    person.BaseSet()
    person.SafeSet()
    person.AISet()
    person.SystemSet()
12. 整体测试
from tests.Regist import Register
from tests.Login import Login
from tests.Template import TemplateEdit
from tests.UserHomePage import HomePage
from tests.Question import Question
from tests.Exam import Exam
from tests.MyProject import MyProject
from tests.MyPractice import MyPractice
from tests.QuestionBankCenter import MyQustionBank, QuestionManage, MyNote
from tests.SystemManagement import PersonSet

if __name__ == "__main__":
    # 所有模块对象实例化
    register = Register()
    login = Login()
    homepage = HomePage()
    question = Question()
    exam = Exam()
    myproject = MyProject()
    mypractice = MyPractice()
    mqb = MyQustionBank()
    qm = QuestionManage()
    mn = MyNote()
    template = TemplateEdit()
    person = PersonSet()
    # 验证未登录权限下,访问所有网页的重定向
    homepage.UnLoginStatus()
    question.UnLoginStatus()
    exam.UnLoginStatus()
    myproject.UnLoginStatus()
    mypractice.UnLoginStatus()
    mqb.UnLoginStatus()
    qm.UnLoginStatus()
    mn.UnLoginStatus()
    template.UnLoginStatus()
    person.UnLoginStatus()
    # 逐模块验证各个模块的功能、与元素是否存在、按钮是否有效果且符合预期。
    register.RegisterFun()
    register.CheckButton()
    register.CheckPasswordLenRestrict()
    register.CheckRequireRestrict()
    login.LoginFunc()
    login.CheckButton()
    login.CheckRequireRestrict()
    homepage.Login()
    homepage.CheckElement()
    homepage.CheckButton()
    question.Login()
    question.CheckElement()
    question.CheckButton()
    question.Preserve()
    exam.Login()
    exam.CheckElement()
    exam.CheckButton()
    exam.Preserve()
    myproject.Login()
    myproject.CheckElement()
    myproject.QuestSurvey()
    myproject.OnlineExam()
    myproject.Folder()
    myproject.RecycleBin()
    myproject.SearchByName()
    myproject.OperatorForFolder()
    myproject.OperatorForFile()
    myproject.CheckElement()
    mypractice.Login()
    mypractice.MyPractice()
    mypractice.QuestionBankDirectory()
    mqb.Login()
    mqb.CreateQuestionBankFunc()
    mqb.SeachByQBName()
    mqb.OperateForQB()
    qm.Login()
    qm.CheckElement()
    qm.CheckButton()
    mn.Login()
    mn.CheckElement()
    mn.CheckButton()
    template.Login()
    template.CheckEmement()
    template.CheckButton()
    template.TemplateSearsh()
    person.Login()
    person.CheckButton()
    person.BaseSet()
    person.SafeSet()
    person.AISet()
    person.SystemSet()

六、Bug描述

1. 安全设置模块密码修改功能,“新密码长度<6位”未拦截。

问题出现的环境:Windows11 家庭版、Microsoft Edge(版本:143.0.3650.96)

Bug等级:严重

问题出现的步骤:

  • 打开Microsoft Edge游览器,输入网址:"http://49.235.61.184:8080/user/login"
  • 输入用户名FSRMWK,密码123456完成登录
  • 通过首页访问系统管理/个人设置或通过链接:"http://49.235.61.184:8080/system/setting"
  • 依次点击安全设置、修改
  • 依次输入旧密码123456,新密码1,确认密码1
  • 点击确认修改。

预期结果:修改密码失败,也能够回显”密码长度限制“的错误信息

实际结果:修改密码成功,也能够使用新密码完成下次登录

2. 模板广场界面模板搜索功能异常

问题出现的环境:Windows11 家庭版、Microsoft Edge(版本:143.0.3650.96)

Bug等级:一般

问题出现的步骤:

  • 打开Microsoft Edge游览器,输入网址:"http://49.235.61.184:8080/user/login"
  • 输入用户名admin,密码123456完成登录
  • 通过首页访问模板广场或通过链接:"http://49.235.61.184:8080/template"
  • 在输入框中,输入“自动化测试”(确保存在包含该关键字的模板)
  • 点击搜模板。

预期结果:返回模板名称符合要求的模板

实际结果:结果列表显示为空,功能不可用

3. 安全设置模块密码修改功能,“旧密码与新密码相同”依旧可修改成功

问题出现的环境:Windows11 家庭版、Microsoft Edge(版本:143.0.3650.96)

Bug等级:次要

问题出现的步骤:

  • 打开Microsoft Edge游览器,输入网址:"http://49.235.61.184:8080/user/login"
  • 输入用户名FSRMWK,密码123456完成登录
  • 通过首页访问系统管理/个人设置或通过链接:"http://49.235.61.184:8080/system/setting"
  • 依次点击安全设置、修改
  • 依次输入旧密码123456,新密码123456,确认密码123456
  • 点击确认修改。

预期结果:修改密码失败,也能够回显”新密码与旧密码相同“的错误信息

实际结果:修改密码成功,也能够使用新密码完成下次登录

4. 考试编辑界面,”对小窗口的兼容性差“

问题出现的环境:Windows11 家庭版、Microsoft Edge(版本:143.0.3650.96)

Bug等级:次要

问题出现的步骤:

  • 打开Microsoft Edge游览器,输入网址:"http://49.235.61.184:8080/user/login"
  • 输入用户名FSRMWK,密码123456完成登录
  • 通过首页点击创建考试或通过链接:”http://49.235.61.184:8080/survey/new?mode=exam“
  • 将窗口由全屏调小(在1000x900以下的尺寸)

预期结果:该显示的元素,应该完成显示,如果被覆盖,则应该提供横向或纵向的滚轮

实际结果:刚开始保存按钮被覆盖,后来更多的元素被覆盖,也没有横向或纵向的滚轮支持

七、测试总结

1. 功能完整性验证
  • 核心业务流程通畅: 注册、登录、创建项目(问卷/考试)、项目管理等主要用户路径功能完整,在正常输入下可完成预期操作。
  • 未登录状态拦截有效: 所有需要权限的页面在未登录时均能正确重定向至登录界面,权限控制基本生效。
  • 表单基础验证有效: 注册、登录等环节的必填项验证、账户重复性检查、密码一致性检查等功能正常。
2. BUG优先级
  • 紧急修复:安全设置中的密码修改逻辑漏洞,修改新密码时,缺乏密码长度(≥6)检验。
  • 高优先级:模板广场搜索功能,其功能失效。
  • 中优先级:项目存在多界面在小窗口下的兼容性问题,如创建考试界面保存按钮被遮挡,且也不支持横向或纵向的滚动机制,导致创建考试界面在小窗口下,其保存功能丧失。
  • 低优先级:安全设置中的密码修改逻辑漏洞,修改新密码时,旧密码与新密码相同,也能修改成功。
3. 总结

        本项目是一个功能丰富的问卷考试平台,具备良好的市场潜力。该系统核心功能框架已搭建完成,业务流程主体通畅。然而,在安全性、功能稳定性和用户体验方面存在明显短板。因此,在上线前,必须优先解决已发现的安全性和功能性缺陷,并持续优化界面兼容性,才能保证产品的稳定、安全和良好的用户体验。

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值