问卷系统自动化测试报告

问卷系统自动化测试报告


一、项目介绍

项目背景

问卷系统功能简介:问卷系统主要用于满足用户在线创建问卷和考试的需求,同时,系统提供注册和登录功能,作为用户使用核心功能的身份验证入口。

测试计划

  • 验证问卷系统核心功能(创建问卷,回答问卷)的完整性和正确性,确保符合需求规格;
  • 评估系统在预期用户量下的性能表现(响应时间、稳定性),满足基本使用体验;
  • 通过自动化测试覆盖高频场景,保障系统迭代过程中的功能稳定性,降低回归测试成本。

项目功能及页面展示

登录页面

通过用户名和密码登录完成用户的身份验证,同时密码可视化

当用户没有账户,可跳转至注册账户

注册页面

通过姓名、登录账号、密码、密码确认完成新用户的注册,同时支持密码可视化 当用户注册完成,可跳转登录界面

问卷系统首页

核心功能:创建问卷,创建考试

其他功能:

  • 我的项目,管理创建好的问卷或考试
  • 我的练习:我做过的练习
  • 题库中心:创建问卷或考试时可用的题库
  • 模版广场:创建问卷或考试时可用的模版
  • 用户设置:设置昵称,手机号,邮箱
问卷创建页面

核心功能:多题型设置的问卷设计

其他功能:

  • 预览问卷
  • JSON查看
  • 保存问卷
  • 题库功能
  • 大纲功能
问卷项目管理

核心功能:管理创建好的问卷或考试,进行预览,重命名,停止问卷,复制问卷,删除问卷操作

其他功能:

  • 通过新建直接跳转创建考试页面
  • 通过Excel导入
  • 通过文本导入
  • 通过模版导入
  • 新建文件夹
  • 回收站

问卷应答页面

核心功能:提交问卷答案后自动评分,给出分数,答题时长,提交时间



二、设计测试用例


三、自动化测试脚本编写

Utils.py

python 复制代码
import datetime
import os
import sys
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()
        # options.add_argument("-headless") #无头模式无法运行,因为窗口太小会找不到我的项目元素以及保存考试的元素
        # options.page_load_strategy = 'eager' # 更改页面加载策略,加快访问速度,但是有可能会导致没有等待到元素加载出来就获取
        self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()),options = options)
        self.driver.implicitly_wait(3)

    def getScreeShot(self):
        #先创建文件
        dirname = datetime.datetime.now().strftime('%Y-%m-%d')
        #如果没有找到文件夹就生成一个,不是在common文件夹生成文件夹,而是在总目录下生成一个带日期的文件夹
        if not os.path.exists("../images/"+dirname):
            os.mkdir("../images/"+dirname)

        filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
        self.driver.save_screenshot("../images/"+dirname+"/"+filename+".png")
        #为了更好定位到照片信息,获取调用的方法名加进名字里
        #sys._getframe().f_back.f_code.co_name

TestDriver=Driver()#四个测试文件都只用一个实例出来的对象

特点说明

  • 单例使用:通过 TestDriver=Driver() 创建一个实例,供多个测试文件共享使用
  • 自动管理驱动:使用 webdriver_manager 自动安装和管理 ChromeDriver
  • 包含截图功能:提供了便捷的页面截图方法
  • 简单的初始化配置:设置了 3 秒的隐式等待时间

TestRegister

python 复制代码
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from common.Utils import TestDriver

class TestRegister:
    url=""
    driver=""
    def __init__(self):
        self.driver=TestDriver.driver
        self.url="http://8.155.1.153:8081/user/register"
        self.driver.get(self.url)

    def RegisterSuccess(self):
        self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("name0")
        self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("username0")
        self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("password1")
        self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("password1")
        #点击注册
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()
        #注册成功返回登录界面时,验证是不是登录界面
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")
        #添加截图
        TestDriver.getScreeShot()

    def RegisterFail(self):
        test_dic = [
            {"desc": "密码不足6位", "name": "test_user", "username": "test_username", "password": "123",
             "rePassword": "123"},
            {"desc": "不写用户名注册", "name": "", "username": "test_username", "password": "123456",
             "rePassword": "123456"},
            {"desc": "不写登录账号注册", "name": "test_user", "username": "", "password": "123456",
             "rePassword": "123456"},
            {"desc": "不写密码注册", "name": "test_user", "username": "test_username", "password": "",
             "rePassword": ""},
            {"desc": "不写密码确认注册", "name": "test_user", "username": "test_username", "password": "123456",
             "rePassword": ""}
        ]
        for dic in test_dic:
            # 清空输入框
            element=self.driver.find_element(By.CSS_SELECTOR, "#name")
            element.send_keys(Keys.CONTROL + 'a') #输入框看着有内容,实际是隐藏字符或浏览器自动填充,clear 方法对这类情况处理不好。
            element.send_keys(Keys.DELETE) #先全选,再删除的方式清空输入栏
            element=self.driver.find_element(By.CSS_SELECTOR, "#username")
            element.send_keys(Keys.CONTROL + 'a')
            element.send_keys(Keys.DELETE)
            element=self.driver.find_element(By.CSS_SELECTOR, "#password")
            element.send_keys(Keys.CONTROL + 'a')
            element.send_keys(Keys.DELETE)
            element=self.driver.find_element(By.CSS_SELECTOR, "#rePassword")
            element.send_keys(Keys.CONTROL + 'a')
            element.send_keys(Keys.DELETE)
            time.sleep(3)
            # 输入用户名
            if dic["name"]:
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#name").clear()
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(dic["name"])
            # 输入登录账号
            if dic["username"]:
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys(dic["username"])
            # 输入密码
            if dic["password"]:
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys(dic["password"])
            # 输入密码确认
            if dic["rePassword"]:
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#rePassword").clear()
                time.sleep(1)
                self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys(dic["rePassword"])
            # 点击注册
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button").click()
            # 验证注册账号的按钮是否存在
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button")
            time.sleep(3)
            #添加截图
            TestDriver.getScreeShot()

TestLogin

python 复制代码
import time
from selenium.webdriver.common.by import By
from common.Utils import TestDriver

class TestLogin:
    url=""
    driver=""
    def __init__(self):
        self.driver=TestDriver.driver
        self.url="http://8.155.1.153:8081/user/login"
        self.driver.get(self.url)
        self.driver.fullscreen_window()

    def LoginSuccess(self):
            self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
            self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
            #输入框输入账号
            self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("dz000")
            #输入框输入密码
            self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("bit12344321..")
            #点击登录
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
            #进入问卷首页后,验证头像,是不是进入了首页
            self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span.ant-avatar.ant-avatar-circle.ant-avatar-image > img")
            #添加截图
            TestDriver.getScreeShot()

    def LoginFail(self):
        for i in range(0,2):
            # 验证失败账号登录之后还要错误的密码登录,要清空输入框
            self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
            self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
            if i == 0:
                # 输入框输入正确的账号,错误的密码
                self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("dz000")
                self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("bit12344321.")
            else:
                # 输入框输入错误的账号,正确的密码
                self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("dz00")
                self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("bit12344321..")
            # 点击登录
            self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
            # 验证是不是还在登录界面,显示错误的用户名和密码
            text=self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4 OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
            assert (text=="错误的用户名和密码")
            # 添加截图
            TestDriver.getScreeShot()

TestHome

python 复制代码
from selenium.webdriver.common.by import By
from common.Utils import TestDriver

class TestHome:
    url = ""
    driver = ""
    def __init__(self):
        self.driver = TestDriver.driver
        self.url = "http://8.155.1.153:8081/home"
        self.driver.get(self.url)

    def TestHomeNotLogin(self):
        #未登录状态下,跳转到登录界面,验证是不是在登录界面
        url=self.driver.current_url
        assert (url == "http://8.155.1.153:8081/user/login")
        # 添加截图
        TestDriver.getScreeShot()

    def TestHomeByLogin(self):
        #登录状态下,页面元素为:标题、头像、用户名、创建问卷、创建考试
        # 标题
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-logo.ant-pro-global-header-logo-mix > a > h1")
        # 头像
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span.ant-avatar.ant-avatar-circle.ant-avatar-image > img")
        # 用户名
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")
        # 创建问卷
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)")
        # 创建考试
        self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")
        # 添加截图
        TestDriver.getScreeShot()

ExamEdit

python 复制代码
import datetime
import time
from selenium.webdriver.common.by import By
from common.Utils import TestDriver

class ExamEdit:
    url = ""
    driver = ""
    def __init__(self):
        self.driver = TestDriver.driver
        self.url = "http://8.155.1.153:8081/survey/new?mode=exam"
        self.driver.get(self.url)

    def ExamEditNotLogin(self):
        # 未登录状态下,返回到登录界面
        #time.sleep(2)
        # 验证是不是在登录界面
        time.sleep(1)
        url = self.driver.current_url
        assert (url == "http://8.155.1.153:8081/user/login")
        self.driver.find_element(By.CSS_SELECTOR, "#username")
        self.driver.find_element(By.CSS_SELECTOR, "#password")
        # 添加截图
        TestDriver.getScreeShot()

    def ExamYesEditByLogin(self):
        # 进来的时候就是创建考试界面了,要回到主页
        examurl = "http://8.155.1.153:8081/home"
        self.driver.get(examurl)
        self.driver.fullscreen_window()
        # 保存考试后开启有题目的考试 ------ 清空标题名,名字设置为有题目的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入,
        # 点击开启考试,点击网址跳转到新窗口,切换窗口,选择选项后点击提交考试
        (self.driver.find_element(By.CSS_SELECTOR,
        "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")
         .click()) # 创建考试
        (self.driver.find_element(By.CSS_SELECTOR,
        "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
         .clear()) # 清空考试名称
        (self.driver.find_element(By.CSS_SELECTOR,
        "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
         .send_keys("有题目的考试")) # 设置考试名字
        time.sleep(1)
        self.driver.find_element(By.CSS_SELECTOR,"#rc-tabs-1-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(1) > dd > div").click() # 添加选择题
        time.sleep(1)
        (self.driver.find_element(By.CSS_SELECTOR,
        "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span")
         .click()) # 保存考试
        self.driver.back() # 回退到主页
        self.driver.back() # 回退到主页
        (self.driver.find_element(By.CSS_SELECTOR,
        "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg")
         .click()) # 点击我的项目
        examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title") # 查找
        name_element = None
        for name in examnums:
            if name.text == "有题目的考试":
                name_element = name
                break
        if name_element:
            name_element.click()
        else:
            print("有题目的考试------异常不存在")
            TestDriver.getScreeShot() # 截图记录
        time.sleep(1)
        # 点击开启考试按钮
        self.driver.find_element(By.CSS_SELECTOR,
        "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
        # 点击打开网址按钮
        self.driver.find_element(By.CSS_SELECTOR,
        "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
        # 出现了新窗口,跳转到新窗口
        curwindow = self.driver.current_window_handle # 获取当前窗口的句柄
        allwindow = self.driver.window_handles # 获取所有窗口句柄
        for window in allwindow:
            if window != curwindow:
                self.driver.switch_to.window(window) # 切换到新的窗口
                break
        # 对新窗口进行操作
        # 点击选项1
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-body > div > section > div.survey-antd-body-question-body > div > div > div > div:nth-child(1) > label > span:nth-child(2) > div").click()
        time.sleep(1)
        # 点击提交
        self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div").click()
        # root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button
        time.sleep(1)
        text=self.driver.find_element(By.CSS_SELECTOR,"#result-message").text
        assert(text=="问卷到此结束,感谢您的参与!")
        # 关闭新窗口,获取所有窗口句柄,切换回老窗口
        self.driver.close()
        allwindow = |self.driver.window_handles # 获取所有窗口句柄
        for window in allwindow:
            if window:
                self.driver.switch_to.window(window)
                break
            else:
                print("异常,所有窗口已经关闭")
                TestDriver.getScreeShot() # 截图记录

    def ExamNoEditByLogin(self):
        # 进来的时候就是创建考试界面了,要回到主页
        examurl = "http://8.155.1.153:8081/home"
        self.driver.get(examurl)
        self.driver.fullscreen_window()
        time.sleep(2)
        try:
            #登录状态下,异常发布考试:
            # 1.创建考试后不保存考试 ------ 清空标题名,名字设置为不保存的考试,回退一次到主页,再点我的项目,再用find_elemengts判断元素不存在
            (self.driver.find_element(By.CSS_SELECTOR,
            "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")
             .click()) # 创建考试
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .clear()) # 清空考试名称
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .send_keys("不保存的考试")) # 设置考试名字
            self.driver.back() #回退到主页
            (self.driver.find_element(By.CSS_SELECTOR,
            "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg")
             .click()) # 点击我的项目
            examnums=self.driver.find_elements(By.CSS_SELECTOR,"span.survey-title") # 查找
            res=any("不保存的考试"==name.text for name in examnums)
            if res:
                print("不保存的考试------异常存在")
                TestDriver.getScreeShot()
           
            self.driver.fullscreen_window()
            # 2.保存考试后不开启考试 ------ 清空标题名,名字设置为保存但不开启的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入
            # 点击网址跳转到新窗口,切换窗口,显示问卷已暂停回收
            # 首页不能点击,只能back
            time.sleep(1)
            self.driver.back() # 从我的项目回退到首页栏
            (self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")
             .click()) # 创建考试
            time.sleep(1)
            self.driver.fullscreen_window()
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .clear()) # 清空考试名称
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .send_keys("保存但不开启的考试")) # 设置考试名字
            time.sleep(2)
            (self.driver.find_element(By.CSS_SELECTOR,"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span")
             .click()) # 保存考试 ------------ 如果不是全屏就找不到保存元素
            self.driver.back() # 回退到主页
            self.driver.back() # 回退到主页
            time.sleep(2)
            (self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg")
             .click()) # 点击我的项目
            time.sleep(1)
            examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title") # 查找
            name_element=None
            for name in examnums:
                if name.get_attribute("title")=="保存但不开启的考试":
                    name_element=name
                    break
            if name_element:
                name_element.click()
            else:
                print("保存但不开启的考试------异常不存在")
                TestDriver.getScreeShot() #截图记录
            #不开启考试直接点击打开网址按钮
            self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
            #出现了新窗口,跳转到新窗口
            curwindow=self.driver.current_window_handle #获取当前窗口的句柄
            allwindow=self.driver.window_handles #获取所有窗口句柄
            for window in allwindow:
                if window!=curwindow:
                    self.driver.switch_to.window(window) #切换到新的窗口
                    break
            #对新窗口进行操作
            text=self.driver.find_element(By.CSS_SELECTOR,"#root > div > div > h2").text
            if text=="问卷已暂停回收":
                assert (text=="问卷已暂停回收")
                TestDriver.getScreeShot() # 截图记录
            #关闭新窗口,获取所有窗口句柄,切换回老窗口
            self.driver.close()
            allwindow = self.driver.window_handles # 获取所有窗口句柄
            for window in allwindow:
                if window:
                    self.driver.switch_to.window(window)
                    break
                else:
                    print("异常,所有窗口已经关闭")
                    TestDriver.getScreeShot() # 截图记录
           
            time.sleep(1)
            self.driver.fullscreen_window()
            time.sleep(1)
            # 3.保存考试后开启无题目的考试 ------ 清空标题名,名字设置为开启但没题目的考试,保存,回退两次到主页,再点我的项目,再用find_elemengt选中名字进入,
            # 点击开启考试,点击网址跳转到新窗口,切换窗口,find_elemengts判断提交按钮不存在
            # 回退两次------从考试设置回退到我的项目------再退到首页
            self.driver.back() # 从考试开启回退到我的项目
            self.driver.back() # 从我的项目回退到首页栏
            time.sleep(1)
            (self.driver.find_element(By.CSS_SELECTOR,
            "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)")
             .click()) # 创建考试
            time.sleep(2)
            self.driver.fullscreen_window()
            time.sleep(2)
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .clear()) # 清空考试名称
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
             .send_keys("保存开启但无题目的考试")) # 设置考试名字
            time.sleep(1)
            (self.driver.find_element(By.CSS_SELECTOR,
            "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span")
             .click()) # 保存考试
            self.driver.back() # 回退到主页
            self.driver.back() # 回退到主页
            (self.driver.find_element(By.CSS_SELECTOR,
            "#sk-layout > div > div > section > aside > div > div:nth-child(1) > ul > li:nth-child(2) > span > a > div > span.anticon.ant-pro-base-menu-item-icon > span > svg")
             .click()) # 点击我的项目
            time.sleep(1)
            examnums = self.driver.find_elements(By.CSS_SELECTOR, "span.survey-title") # 查找
            name_element = None
            for name in examnums:
                if name.get_attribute("title") == "保存开启但无题目的考试":
                    name_element = name
                    break
            if name_element:
                name_element.click()
            else:
                print("保存开启但无题目的考试------异常不存在")
                TestDriver.getScreeShot() # 截图记录
            # 点击开启考试按钮
            self.driver.find_element(By.CSS_SELECTOR,"#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(2) > div:nth-child(2) > button").click()
            # 点击打开网址按钮
            self.driver.find_element(By.CSS_SELECTOR,
            "#root > div > div.survey-main-content > div > div > div:nth-child(2) > div:nth-child(2) > div.ant-row > div > div > div:nth-child(1) > span.ant-input-group-wrapper.ant-input-search.ant-input-search-with-button.open-target > span > span > button > span").click()
            # 出现了新窗口,跳转到新窗口
            curwindow = self.driver.current_window_handle # 获取当前窗口的句柄
            allwindow = self.driver.window_handles # 获取所有窗口句柄
            for window in allwindow:
                if window != curwindow:
                    self.driver.switch_to.window(window) # 切换到新的窗口
                    break
            # 对新窗口进行操作
            # 找提交按钮,目标:按钮不存在
            my_list=self.driver.find_elements(By.CSS_SELECTOR,"#root > div > div > div > div.survey-antd-footer > div.survey-antd-footer-pagination > div > button > div")
            # 找不到返回空列表
            if len(my_list)>0:
                assert (len(my_list)>0) #不是空列表代表出现异常
                TestDriver.getScreeShot() # 截图记录
            # 关闭新窗口,获取所有窗口句柄,切换回老窗口
            self.driver.close()
            allwindow = self.driver.window_handles # 获取所有窗口句柄
            for window in allwindow:
                if window:
                    self.driver.switch_to.window(window)
                    break
                else:
                    print("异常,所有窗口已经关闭")
                    TestDriver.getScreeShot() # 截图记录
       
            self.driver.back() # 从考试开启回退到我的项目
            self.driver.back() # 从我的项目回退到首页栏
        finally:
            TestDriver.getScreeShot() # 截图记录

    def ExamEditCheck(self): # 创建考试的页面检查
        self.driver.fullscreen_window()
        #检查页面元素:标题输入框,题目:题型、大纲。提交、预览、保存
        # 题型
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-1")
        # 大纲
        self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-0-tab-3")
        # 提交
        self.driver.find_element(By.CSS_SELECTOR, "#editorContent > div > div > div.footer > div.title > div > div > pre > div.ql-editor > p")
        # 预览
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button:nth-child(3) > span")
        # 保存
        self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm > span")
        # 添加截图
        TestDriver.getScreeShot()

RunTest

python 复制代码
from tests import TestLogin
from tests import TestRegister
from tests import TestHome
from tests import TestEdit
from tests import ExamEdit
from common.Utils import TestDriver

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

四、总结

拆分不同业务场景为独立类(Driver驱动类、TestRegister注册类、TestLogin登录类、TestHome首页类、ExamEdit问卷交互类),实现 ------ 高内聚、低耦合。通过模块化设计和场景化用例,有效验证了用户从注册到验证考试结果的核心流程。


相关推荐
炸炸鱼.21 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_1 天前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦1 天前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu1 天前
Python 语法之数据结构详细解析
python
AI问答工程师1 天前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5201 天前
python对Excel数据处理(1)
python·excel·pandas
小饕1 天前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙1 天前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话1 天前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习
悟空爬虫-彪哥1 天前
VRChat开发环境配置,零基础教程
python