问卷系统自动化测试报告

问卷系统自动化测试报告


一、项目介绍

项目背景

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

测试计划

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

项目功能及页面展示

登录页面

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

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

注册页面

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

问卷系统首页

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

其他功能:

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

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

其他功能:

  • 预览问卷
  • 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问卷交互类),实现 ------ 高内聚、低耦合。通过模块化设计和场景化用例,有效验证了用户从注册到验证考试结果的核心流程。


相关推荐
百锦再2 小时前
第8章 模块系统
android·java·开发语言·python·ai·rust·go
Ashlee_code2 小时前
经纪柜台系统解析:从今日国际金融动荡看证券交易核心引擎的变革
python·架构·系统架构·区块链·vim·柜台·香港券商
清空mega3 小时前
从零开始搭建 flask 博客实验(4)
后端·python·flask
咋吃都不胖lyh4 小时前
比较两个excel文件的指定列是否一致
爬虫·python·pandas
0小豆04 小时前
【系列开篇】从零构建智能字幕校准系统:一个AI+微服务的完整实战之旅
spring boot·python·nlp·微服务架构·实战项目·spacy·ai算法
周杰伦_Jay5 小时前
【主流开发语言深度对比】Python/Go/Java/JS/Rust/C++评测
开发语言·python·golang
盈电智控5 小时前
体力劳动反而更难被AI取代?物联网科技如何守护最后的劳动阵地
开发语言·人工智能·python
隔壁阿布都5 小时前
Spring Boot中的Optional如何使用
开发语言·spring boot·python
谢景行^顾5 小时前
深度学习--激活函数
人工智能·python·机器学习