一.项目背景
问卷系统调查是一款基于web的在线测评平台,主要用于创建问卷,编辑问卷题目,创建考试问卷,系统自动收集填写数据,支持基础数据查看和统计。
系统包含以下模块:
- 用户管理:注册,登录,权限控制
- 问卷/考试管理:创建,编辑,发布,
- 题库管理:试题管理,导入/导出
- 练习系统:错题管理
- 模块管理:问卷/考试模板的创建和添加
- 系统设置:界面风格,安全设置
二.测试环境
三.测试目的
1.功能验证
- 确保所有核心功能符合需求规格说明书要求
- 验证用户注册/登录流程的正确性
- 确认问卷/考试创建,编辑等核心流程是否符合需求
- 确认页面操作流畅,数据保存,展示准确无误
2.用户体验优化
- 页面布局:不同浏览器窗口下页面元素不乱码,不遮挡
- 操作引导:按钮文字,弹窗提示通俗易懂,新手不用看教程也能上手
- 交互反馈,输入错误时有清晰提示,填写问卷过程中不会无辜丢内容
- 页面加载:页面打开,切换速度正常,不会长时间空白
四.测试用例





五.手动测试
注册页面功能
**测试场景一:**输入用户名,登录账号,密码,确认密码后进行注册
预期结果:能够跳转到登录页面并成功进入到首页



测试场景二:不输入用户名进行注册
预期结果:提示用户名是必填项

测试场景三:输入已经存在的账号
预期结果:提示账号已存在

场景四:输入的密码和确认的密码不一致
预期结果:提示两次密码不一致

登录页面功能
测试场景一:输入正确的用户名和密码
预期结果:成功跳转到首页

测试场景二:输入错误的用户名和正确的密码
预期结果:提示错误的用户名和密码

测试场景三:输入错误的用户名和错误的密码
预期结果:提示错误的用户名和错误的密码

测试场景四:不输入用户名和密码
预期结果:提示用户名和密码是必填项

系统首页功能
测试场景一:点击创建问卷按钮,
预期结果:跳转到创建问卷的编辑页面


测试场景二:点击创建考试
预期结果:能够跳转到考试页面

测试场景三:编辑好问卷后,点击保存按钮
预期结果:提示保存成功,首页问卷数+1,可以在我的项目中查看到新创建的标题为v和哈的问卷


测试场景四:编辑好考试后,点击保存按钮
预期结果:提示保存成功,首页考试数+1,可以在我的项目中查看到名称为英语的考试 

页面设置功能
测试场景一:点击页面右上方的设置图标
预期结果:弹出选项栏

测试场景二: 点击整体风格设置按钮后更爱为暗黑风格
预期结果: 页面主题变为暗黑风格


测试场景三:点击退出登录按钮
预期结果:可以跳转到登录页面


我的项目页面功能
测试场景一:搜索已经存在的项目名称,点击搜索按钮
预期结果:显示搜索出的项目


测试场景二:点击新建按钮
预期结果:弹出选项栏

场景三:点击问卷调查选项
预期结果:跳转到编辑问卷调查页面

场景四:点击回收站按钮,
预期结果:弹出回收站页面

场景五:在弹出的回收站页面,选择一个项目,点击彻底删除按钮
预期结果:弹出提示弹窗


场景六:点击一个项目
预期结果:跳转到项目的设置页面 

场景七:开启问卷后,点击打开按钮
预期结果:可以跳转到正式问卷,可以作答并提交,提交后项目状态由未发布为收集中


我的练习页面功能
测试场景一:点击状态选择框,状态选择"正在进行",并且点击查询按钮
预期结果:查询显示出正在进行状态的练习

场景二:点击状态选择框,状态选择"已完成",并且点击查询按钮
预期结果:查询显示出已完成状态的练习


测试场景3:点击重置按钮
预期结果:状态框清空,下方显示全部我的练习

我的题库页面功能
测试场景1:名称输入框输入题库名称,选择题库的类型,点击查询按钮
预期结果:查询出符合条件的题库

测试场景2:点击重置按钮
预期结果:名称输入框和类型选择框清空,下方题库列表显示全部题库

测试场景3:点击新建按钮
预期结果:弹出新增题库编辑按钮


测试场景4:编辑好题库点击确定按钮
预期结果:我的题库列表会新增一个刚刚新建的题库

测试场景5:编辑新增题库的时候,未输入题库名称
预期结果:提示题库名称不能为空

测试场景6:编辑新增题库的时候,未选择题库类型
预期结果:提示请选择题库类型

测试场景7:点击导出按钮
预期结果:可以导出题库


问题管理页面功能
测试场景1:选择好类型和题型,点击查询按钮
预期结果:查询出符合条件的问题

测试场景2:只选择要查询的问题类型,题型不选择,名称也不输入,点击查询按钮
预期结果:查询出符合选择的问题类型条件的所有问题

测试场景3:输入不存在的问题名称,点击查询
预期结果:查询为空,什么也不显示

测试场景4:点击重置按钮
预期结果:类型,题型,名称输入框清空,试题列表显示全部问题

模板广场页面功能
测试场景一:点击添加模板
预期结果: 跳转到模板编辑页面

测试场景2:编辑好模板后点击保存按钮
预期结果:可以在模板广场共有库看到刚添加的名为test测试的模板



测试场景3:点击模板搜索框,输入已有的模板名字,点击搜模板按钮
预期结果:搜索出并显示名为test模板的模板

实际结果:点击模板搜索框后输入test测试,什么也没有搜索出来
Bug: 搜模板按钮异常,搜模板功能失效
个人设置页面功能
测试场景1:基本设置信息全部填写后点击提交按钮
预期结果:提示更新基本信息成功

测试场景2:基本信息不输入昵称
预期结果:提示请输入您的昵称

测试场景3:基本信息不输入个人简介
预期结果:提示请输入个人简介

测试场景4:基本信息不输入邮箱
预期结果:提示请输入您的邮箱

测试场景5:安全设置界面,点击修改按钮
预期结果:弹出修改密码对话框


测试场景6:旧密码未输入,
预期结果:提示请输入旧密码

测试场景7:新密码未输入
预期结果:提示请输入新密码

测试场景8:新密码和旧密码输入的不一样
预期结果:提示两次密码输入不一致

测试场景9:旧密码和新密码相同
预期结果:提示旧密码和新密码不能一致
**实际结果:**当新密码和旧密码一致的时候,修改成功了
**bug:**新密码和旧密码一致的时候没有提示和修改失败

六. 兼容性测试
测试场景一:在夸克浏览器下进入问卷考试系统
预期结果:无异常,一切布局显示功能都正常



测试场景2:在edge浏览器下进入问卷考试系统
预期结果:无异常,一切布局显示功能正常


七.自动化测试
驱动类
python
#创建一个浏览器对象
import datetime
import os
import sys
from selenium import webdriver
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()),options = options)
#添加隐式等待:因为隐式等待的作用域在driver的整个生命周期
self.driver.implicitly_wait(3)
def getScreenshot(self):
#创建屏幕截图
#图片文件名称:年-月-日-时分秒.png
#根据每天的日期进行分类,当天运行的自动化图片文件放到当天的文件夹下
#图片路径:../images/日期/图片名称.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
#判断dirname文件夹是否已经存在,若不存在则创建文件夹
# ../images/日期
if not os.path.exists("../images/" + dirname):
os.mkdir("../images/" + dirname)
#图片名称:方法名-日期-时分秒.png
filename = sys._getframe().f_back.f_code.co_name+"-"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
self.driver.save_screenshot("../images/"+dirname+"/"+filename)
#由于项目外层不是一个单纯的input标签,而是组件封装之后的,所以不能使用selenium中的clear()
#清空指定输入框的内容
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() # 执行所有动作
QE_Driver = Driver()
注册模块
python
import time
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统注册页面
class QE_RegisterTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/user/register"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#注册成功的测试用例
def RegisterSuccessTest(self):
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
time.sleep(1)
#如果能跳转到登录页面,说明注册成功,否则注册失败
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span")
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
# 注册失败的测试用例
def RegisterFailTest(self):
# 测试用例一:不输入用户名、但输入登陆账号、密码、确认密码后进行注册
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
time.sleep(1)
#检查是否注册失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "用户名是必填项!"
##########################################################################################################################
#测试用例二:输入了已经存在的账号进行注册
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
time.sleep(1)
#检查是否注册失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div").text
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "账号已存在"
##########################################################################################################################
# 测试用例三:密码和密码确认时输入的不一致
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#rePassword"))
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123123")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
time.sleep(1)
#检查是否注册失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#rePassword_help > div").text
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "两次密码不一致!"
#测试
# register = QE_RegisterTest()
# register.RegisterFailTest()
# register.RegisterSuccessTest()
# 指定浏览器的退出
# QE_Driver.driver.quit()
登录模块
python
import time
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统登录页面
class QE_LoginTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/user/login"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#登录成功的测试用例
def LoginSuccessTest(self):
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#如果能够找到问卷考试系统首页用户的昵称,说明登录成功,否则登陆失败
self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/header[2]/div/div[3]/div/div/div/span/div/span[2]")
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#登录异常的测试用例
def LoginFailTest(self):
#测试用例一:输入错误的用户名和错误的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例二:输入错误的用户名和正确的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例三:输入正确的用户名和错误的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例四:不输入用户名但输入密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "用户名是必填项!"
##########################################################################################################################
# 测试用例五:输入用户名但不输入密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "密码是必填项!"
#测试
# login = QE_LoginTest()
# login.LoginFailTest()
# login.LoginSuccessTest()
# 指定浏览器的退出
# QE_Driver.driver.quit()
首页功能测试
python
import time
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统登录页面
class QE_LoginTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/user/login"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#登录成功的测试用例
def LoginSuccessTest(self):
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#如果能够找到问卷考试系统首页用户的昵称,说明登录成功,否则登陆失败
self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/header[2]/div/div[3]/div/div/div/span/div/span[2]")
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#登录异常的测试用例
def LoginFailTest(self):
#测试用例一:输入错误的用户名和错误的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例二:输入错误的用户名和正确的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("error")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例三:输入正确的用户名和错误的密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "错误的用户名和密码"
##########################################################################################################################
# 测试用例四:不输入用户名但输入密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#username_help > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "用户名是必填项!"
##########################################################################################################################
# 测试用例五:输入用户名但不输入密码
#清空输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#username"))
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#password"))
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span").click()
#验证是否登陆失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#password_help > div").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "密码是必填项!"
#测试
# login = QE_LoginTest()
# login.LoginFailTest()
# login.LoginSuccessTest()
# 指定浏览器的退出
# QE_Driver.driver.quit()
我的项目页面功能测试类
python
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统我的项目页面
class QE_ProjectTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/project"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#进行页面元素的查找检查
def ProjectCheckElement(self):
#检查页面标题元素
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div > span")
#检查新建按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")
#检查搜索框
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input")
#检查搜索按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg")
#添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#功能测试
def ProjectFunctionTest(self):
#测试新建功能
#点击新建按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()
#测试用例一:测试新建问卷调查功能
#选择新建问卷调查
self.driver.find_element(By.CSS_SELECTOR, "body > div:nth-child(7) > div > div > ul > li:nth-child(1)").click()
time.sleep(1)
#添加屏幕截图
QE_Driver.getScreenshot()
#点击保存按钮
self.driver.find_element(By.CSS_SELECTOR, "#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm").click()
#添加屏幕截图
QE_Driver.getScreenshot()
#返回到项目页面
self.driver.back()
self.driver.back()
time.sleep(1)
#添加屏幕截图
QE_Driver.getScreenshot()
#测试项目查询功能
self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/span/span/input").send_keys("请输入标题")
#添加屏幕截图
QE_Driver.getScreenshot()
time.sleep(1)
#点击查询按钮
self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/div/div/span/span/span/button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
#检查是否查询成功同时验证刚刚新建功能是否保存成功
actual = self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div/div[1]/span[1]").text
print(f"提示信息: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "请输入标题"
##########################################################################################################################
#测试用例二:测试新建在线考试功能
#点击新建按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button").click()
# 添加屏幕截图
QE_Driver.getScreenshot()
#选择新建在线考试
self.driver.find_element(By.XPATH, "/html/body/div[5]/div/div/ul/li[2]").click()
time.sleep(1)
#添加屏幕截图
QE_Driver.getScreenshot()
#点击保存按钮
self.driver.find_element(By.XPATH, "/html/body/div[1]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[5]").click()
time.sleep(1)
#添加屏幕截图
QE_Driver.getScreenshot()
#返回到项目页面
self.driver.back()
self.driver.back()
#添加屏幕截图
QE_Driver.getScreenshot()
#测试项目查询功能
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").send_keys("考试名称")
#添加屏幕截图
QE_Driver.getScreenshot()
#点击查询按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg").click()
# 添加屏幕截图
QE_Driver.getScreenshot()
#检查是否查询成功同时验证刚刚新建功能是否保存成功
actual = self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div > div > div > div > div > div > div.card-header > span.survey-title").text
print(f"项目名称: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "考试名称"
# project = QE_ProjectTest()
# project.ProjectCheckElement()
# project.ProjectFunctionTest()
#指定浏览器的退出
# QE_Driver.driver.quit()
模板广场测试类
python
import time
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统我的题库页面
class QE_QuestionTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/repo/index"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#进行页面元素的查找检查
def QuestionCheckElement(self):
#检查名称输入标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-label > label")
#检查名称输入框
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-control > div > div > span")
#检查类型选择框标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2)")
#检查重置按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button")
#检查查询按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")
#检查新建按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button")
#检查导出按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(2) > button")
#检查题库列表
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-pro-table-list-toolbar-left > div")
#检查文本导入按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(1) > a")
#检查试题管理按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(3) > a")
#添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#功能测试
def QuestionFunctionTest(self):
type ="考试"
#测试新建功能
#点击新建按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button").click()
# 添加屏幕截图
QE_Driver.getScreenshot()
#输入题库名称
# 切换到点击新建之后的页面之中,因为新建之后的页面里面的元素的id和没点击新建的时候的元素是一样的,所以要限制一下查找元素的范围
drawer = self.driver.find_element(By.CLASS_NAME,"ant-drawer-wrapper-body")
#后续使用drawer 进行查找元素操作,意思就是在ant-drawer-body元素范围内进行查找元素
drawer.find_element(By.CSS_SELECTOR, "#name").send_keys("测试新增题库功能")
# 添加屏幕截图
QE_Driver.getScreenshot()
time.sleep(3)
#选择题库类型
drawer.find_element(By.CSS_SELECTOR, "#mode").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
#选择问卷
select_option= drawer.find_element(By.CLASS_NAME,"rc-virtual-list-holder-inner")
option = select_option.find_element(By.XPATH,f'.//div[@title="问卷"]')
self.driver.execute_script("arguments[0].scrollIntoView(true);",option)
self.driver.execute_script("arguments[0].click();", option)
# 这里并不是一个select组件,不能直接使用Select
time.sleep(2)
# 添加屏幕截图
QE_Driver.getScreenshot()
time.sleep(1)
#点击确定按钮
drawer.find_element(By.XPATH, "/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button").click()
# 添加屏幕截图
QE_Driver.getScreenshot()
#检查是否回到题库列表页面,如果是则创建题库成功,否则创建失败
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button")
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#测试查询功能
#名称输入框输入题库名称"测试新增题库功能"
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("测试新增题库功能")
# 添加屏幕截图
QE_Driver.getScreenshot()
#点击查询按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
#验证是否查询到,如果题库列表有输出则查询成功,否则查询失败
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr.ant-table-row.ant-table-row-level-0 > td:nth-child(1) > div")
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#测试重置功能
#点击重置按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
#验证是否重置成功,如果名称输入框为空则代表重置成功,否则重置失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#name").text
# 添加屏幕截图
QE_Driver.getScreenshot()
# 断言检测一下是否符合预期
assert actual == ""
# question = QE_QuestionTest()
# question.QuestionCheckElement()
# question.QuestionFunctionTest()
# 指定浏览器的退出
# QE_Driver.driver.quit()
个人设置页面测试
python
import time
from selenium.webdriver.common.by import By
from common.Utils import QE_Driver
#测试问卷考试系统个人设置页面
class QE_PersonalTest:
url = ""
driver = ""
def __init__(self):
self.url = "http://8.155.1.153:8081/system/setting"
self.driver = QE_Driver.driver
self.driver.get(self.url)
#进行页面元素的查找检查
def PersonalCheckElement(self):
# 检查页面标题
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.title___3cGwa")
# 检查更换头像按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.right___3-EXe > span > div > span > div > button")
# 检查姓名标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-label > label")
# 检查姓名输入框
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-control > div > div > span")
# 检查手机号标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-label > label")
# 检查手机号输入框
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-control > div > div > span")
# 检查邮箱标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-label > label")
# 检查邮箱输入框
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-control > div > div > span")
# 检查个人简介标签
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(5) > div > div.ant-col.ant-form-item-label > label")
# 检查个人简介输入框
self.driver.find_element(By.CSS_SELECTOR, "#profile")
# 检查提交按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")
# 添加屏幕截图
QE_Driver.getScreenshot()
##########################################################################################################################
#更新信息成功的测试用例
def PersonalSuccessTest(self):
#清空姓名输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
#清空手机号输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#phone"))
#清空邮箱输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#email"))
#清空个人简介输入框
self.driver.find_element(By.CSS_SELECTOR, "#profile").clear()
# 添加屏幕截图
QE_Driver.getScreenshot()
#输入姓名
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin123")
#输入手机号
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("14745667235")
#输入邮箱
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("lvdongrui2023@163.com")
#输入个人简介
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")
#点击提交按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()
# 添加屏幕截图
QE_Driver.getScreenshot()
#验证是否更新成功
#通过页面右上角的用户名来验证
actual = self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)").text
print(f"姓名: {actual}")
#添加屏幕截图
QE_Driver.getScreenshot()
#断言检测一下是否符合预期
assert actual == "Admin123"
##########################################################################################################################
# 更新信息失败的测试用例
def PersonalFailTest(self):
#测试用例一:不输入姓名,其他信息正常输入
#清空姓名输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
#清空手机号输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#phone"))
#清空邮箱输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#email"))
#清空个人简介输入框
self.driver.find_element(By.CSS_SELECTOR, "#profile").clear()
# 添加屏幕截图
QE_Driver.getScreenshot()
#输入手机号
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("14745667235")
#输入邮箱
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("lvdongrui2023@163.com")
#输入个人简介
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")
#点击提交按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
#验证是否更新失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#name_help > div").text
print(f"提示信息: {actual}")
# 添加屏幕截图
QE_Driver.getScreenshot()
# 断言检测一下是否符合预期
assert actual == "请输入您的昵称!"
##########################################################################################################################
# 测试用例二:不输入手机号,其他信息正常输入
#清空姓名输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
#清空手机号输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#phone"))
#清空邮箱输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#email"))
# 清空个人简介输入框
self.driver.find_element(By.CSS_SELECTOR, "#profile").clear()
# 添加屏幕截图
QE_Driver.getScreenshot()
# 输入姓名
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin123")
# 输入邮箱
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("lvdongrui2023@163.com")
# 输入个人简介
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")
# 点击提交按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
# 验证是否更新失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#phone_help > div").text
print(f"提示信息: {actual}")
# 添加屏幕截图
QE_Driver.getScreenshot()
# 断言检测一下是否符合预期
assert actual == "请输入您的联系电话!"
##########################################################################################################################
# 测试用例三:不输入邮箱,其他信息正常输入
#清空姓名输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#name"))
#清空手机号输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#phone"))
#清空邮箱输入框
QE_Driver.clear(self.driver.find_element(By.CSS_SELECTOR, "#email"))
# 清空个人简介输入框
self.driver.find_element(By.CSS_SELECTOR, "#profile").clear()
# 添加屏幕截图
QE_Driver.getScreenshot()
# 输入姓名
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("Admin123")
#输入手机号
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("14745667235")
# 输入个人简介
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("这是更新个人基本信息功能测试")
# 点击提交按钮
self.driver.find_element(By.CSS_SELECTOR, "#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button").click()
time.sleep(1)
# 添加屏幕截图
QE_Driver.getScreenshot()
# 验证是否更新失败
actual = self.driver.find_element(By.CSS_SELECTOR, "#email_help > div").text
print(f"提示信息: {actual}")
# 添加屏幕截图
QE_Driver.getScreenshot()
# 断言检测一下是否符合预期
assert actual == "请输入您的邮箱!"
# personal = QE_PersonalTest()
# personal.PersonalCheckElement()
# personal.PersonalFailTest()
# personal.PersonalSuccessTest()
# 指定浏览器的退出
# QE_Driver.driver.quit()
启动文件
python
from tests import QE_RegisterTest
from tests import QE_LoginTest
from tests import QE_HomeTest
from tests import QE_ProjectTest
from tests import QE_QuestionTest
from tests import QE_TemplateTest
from tests import QE_PersonalTest
from common.Utils import QE_Driver
if __name__ == '__main__':
QE_RegisterTest.QE_RegisterTest().RegisterFailTest()
QE_RegisterTest.QE_RegisterTest().RegisterSuccessTest()
QE_LoginTest.QE_LoginTest().LoginFailTest()
QE_LoginTest.QE_LoginTest().LoginSuccessTest()
QE_HomeTest.QE_HomeTest().HomeCheckElement()
QE_ProjectTest.QE_ProjectTest().ProjectCheckElement()
QE_ProjectTest.QE_ProjectTest().ProjectFunctionTest()
QE_QuestionTest.QE_QuestionTest().QuestionCheckElement()
QE_QuestionTest.QE_QuestionTest().QuestionFunctionTest()
QE_TemplateTest.QE_TemplateTest().TemplateCheckElement()
QE_TemplateTest.QE_TemplateTest().TemplateFunctionTest()
QE_PersonalTest.QE_PersonalTest().PersonalCheckElement()
QE_PersonalTest.QE_PersonalTest().PersonalFailTest()
QE_PersonalTest.QE_PersonalTest().PersonalSuccessTest()
#指定浏览器的退出
QE_Driver.driver.quit()
八.Bug描述
1.模板广场页面
搜模板按钮异常:输入已存在的模板,点击搜索按钮后,什么也没有搜索出来,搜模板功能失效

2.用户管理页面
新建用户页面:必选项状态栏未选也正常创建用户成功了

成功创建了新用户ccc,并且状态为激活

4.个人设置页面


九.测试总结
一.测试范围
本次测试主要覆盖 3 个核心页面:模板广场页面、用户管理页面、个人设置页面。 测试类型包含功能测试、界面 UI 测试、异常场景测试,使用等价类划分、边界值、场景法设计测试用例。
二.测试执行情况
- 缺陷分布:
- 用户管理页面:BUG 相对较多,集中在新增、编辑、删除用户权限校验;
- 模板广场页面:问题多为展示、样式、跳转类缺陷;
- 个人设置页面:少量参数保存、表单校验类问题。
三.主要发现的问题
- 功能问题:部分表单没有做非空校验、输入特殊字符没有拦截;删除用户后页面数据没有实时刷新。
- 界面 UI 问题:部分页面文字排版错位、按钮样式不统一,不同窗口下页面展示效果不一致。
- 体验类问题:部分操作后缺少成功 / 失败提示,用户无法判断操作是否生效
四.遗留问题
经过一轮回归测试,大部分提交的缺陷已经开发修复并验证通过;剩余少量低优先级优化建议,可放在后续迭代版本优化。
五.测试结论
当前问卷系统的模板广场、用户管理、个人设置模块主流程功能可以正常使用,核心业务无阻断性严重 bug,版本达到上线测试标准,可以交付。
六.后续改进建议
- 加强表单输入框的校验,完善异常输入拦截;
- 统一各个页面 UI 样式,优化操作后的弹窗提示;
- 后续版本迭代,建议增加兼容性测试,覆盖不同浏览器。