目录
[1.1 项目背景](#1.1 项目背景)
[1.2 项目功能](#1.2 项目功能)
[3.1 测试项目范围](#3.1 测试项目范围)
[3.2 测试目标](#3.2 测试目标)
[3.3 性能测试覆盖](#3.3 性能测试覆盖)
[4.1 测试用例](#4.1 测试用例)
一、项目简介
1.1 项目背景
本项目旨在对一款基于Web的问卷考试系统进行全面自动化测试,确保系统功能的完整性、稳定性和用户体验。该系统集成了用户管理、题库管理、考试练习、模板管理、系统设置等多个核心模块,支持多样化的在线评估需求。
1.2 项目功能
-
登录功能: 用户输入用户名和密码,如果输入正确的用户名和密码则登录成功并跳转到个人博客列表页面;如果输入错误的用户名和密码则提示用户输入的信息有误,登录失败。
-
展示个人博客列表功能: 用户登录之后会进入个人博客列表页,此页可以展示用户所发表的所有文章,并且用户在该页面可进行发表新博客、修改博客、删除博客等功能。
-
发表博客功能: 用户在登录的状态下可进行发表博客,对于发表的博客需要验证博客的标题和内容,两者均不能为空内容,如果两者都不为空内容则点击发表博客,博客发表成功,反之发表失败。
-
修改博客功能: 用户可以修改自己已发表的博客文章,并且需要验证修改后的博客的标题和内容,两者均不能为空内容,如果两者都不为空内容则博客修改成功,反之修改失败。
-
删除博客功能:用户可以删除自己发表的文章,并返回首页
-
展示博客功能: 展示博客的正文所有内容以及标题,并且在博客详情页会显示出该篇博客的作者信息。
-
注销登录: 用户进行正常登录后,如若需要退出登录,点击注销,则退出登录并且跳转到登录页面。
二、测试环境
软件:Google Chrome
开发工具:pycharm
测试工具:自动化测试工具Selenium
操作系统:Windows 11家庭中文版
浏览器版本:Google Chrome版本 144.0.7559.97(正式版本) (64 位)
三、测试
3.1 测试项目范围

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

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

四、自动化测试
4.1 测试用例








五、自动化测试代码
驱动管理和工具
python
#Common/Utils.py
import datetime
import os
import sys
#创建一个浏览器对象
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
class Driver:
driver = ""
def __init__(self):
options = webdriver.ChromeOptions()
self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install(),options=options))
def getScreeShot(self):
#创建屏幕截图
#图片文件名称:2026-1-29-1834.png
#图片路径:../images/2026-1-29-1834.png
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
if not os.path.exists("../images/" + dirname):
os.mkdir("../images/"+dirname)
filename = sys._getframe().f_back.f_code.co_name+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
self.driver.save_screenshot("../images/"+dirname+"/"+filename)
ExamDriver = Driver()
登录测试
python
#Login.py
import time
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/user/login"
self.driver = ExamDriver.driver
self.driver.get(self.url)
# 正常登录
def LogSucTest(self):
time.sleep(3)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
time.sleep(3)
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
time.sleep(3)
self.driver.find_element(By.XPATH, "//span[text()='首页']")
# self.driver.quit()
# time.sleep(1)
ExamDriver.getScreeShot()
# 切换为上一个页面
# self.driver.back()
# time.sleep(2)
# 使用不存在的用户登录失败
def LoginFail(self):
wait = WebDriverWait(self.driver, 2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234567")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
ret = self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
assert ret == "错误的用户名和密码"
ExamDriver.getScreeShot()
self.driver.refresh()
# 登录失败------密码错误
def LoginFailByPassword(self):
wait = WebDriverWait(self.driver, 2)
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("1234567")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
ret = self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div").text
assert ret == "错误的用户名和密码"
ExamDriver.getScreeShot()
self.driver.refresh()
# 登录失败------用户名和密码为空
def LoginFailEmpty(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
# time.sleep(1)
wait = WebDriverWait(self.driver, 2)
username_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))
nameremind = username_error.text
assert nameremind == "用户名是必填项!"
wait = WebDriverWait(self.driver, 2)
password_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))
passwordremind = password_error.text
assert passwordremind == "密码是必填项!"
ExamDriver.getScreeShot()
self.driver.refresh()
# 登录失败------用户名为空
def LoginFailNameEmpty(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
# time.sleep(1)
wait = WebDriverWait(self.driver, 2)
password_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#password_help > div")))
passwordremind = password_error.text
assert passwordremind == "密码是必填项!"
ExamDriver.getScreeShot()
self.driver.refresh()
# 登录失败------密码为空
def LoginFailPasswordEmpty(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button").click()
# time.sleep(1)
wait = WebDriverWait(self.driver, 2)
username_error = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#username_help > div")))
nameremind = username_error.text
assert nameremind == "用户名是必填项!"
ExamDriver.getScreeShot()
# 跳转到注册页面
def ToRegister(self):
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > div:nth-child(4) > a").click()
ret = self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div:nth-child(2) > div > div.ant-col.ant-form-item-label").text
assert ret == "姓名"
ExamDriver.getScreeShot()
# login_test = ExamLogin()
# login_test.LogSucTest()
注册测试
python
#Register.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamRegister:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/user/register"
self.driver = ExamDriver.driver
self.driver.get(self.url)
# 正常注册
def RegisterSuctest(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi111")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")
self.driver.back()
# 账号已存在
def RegisterFailReRG(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("wamhwu111")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ret = self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div").text
assert ret == "账号已存在"
ExamDriver.getScreeShot()
self.driver.back()
# 输入的所有都为空
def RegisterFailEmpty(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").clear()
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 输入的姓名为空
def RegisterFailEmptyName(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").clear()
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi111")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 输入的用户名为空
def RegisterFailEmptyUser(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("wangwu")
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 输入密码为空
def RegisterFailEmptyPassword(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("lisi")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("zhangsan111")
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 输入的确认密码为空
def RegisterFailEmptyRePassword(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("lisi")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("lisi111")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345678")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").clear()
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 输入的密码长度小于6
def RegisterFailPasswordUnder5(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("lisi")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("hznagsan111")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("12345")
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span").click()
ExamDriver.getScreeShot()
self.driver.refresh()
# 返回登录页面
def Returntologin(self):
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div:nth-child(6) > a").click()
self.driver.find_element(By.CSS_SELECTOR,
"#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")
ExamDriver.getScreeShot()
首页测试
python
#Index.py
import time
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamIndex:
def __init__(self):
# 初始化移到最前面,确保driver先加载
self.driver = ExamDriver.driver
self.wait = WebDriverWait(self.driver, 10) # 全局显式等待,超时10秒
self.driver.maximize_window()
# 先访问登录页,再处理首页
self.home_url = "http://49.235.61.184:8080/home"
self.driver.implicitly_wait(5) # 隐式等待作为兜底
# 一、测试首页页面元素
def HomeElement(self):
try:
# 确保在首页
self.driver.get(self.home_url)
# 1. 等待欢迎语句元素加载完成(简化选择器)
self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,
".contentTitle___Yu-cR"))
)
# 2. 核心元素定位(改用文本+XPath,更稳定)
elements_to_check = [
("我的考试", By.XPATH, "//div[text()='我的考试']"),
("我的问卷", By.XPATH, "//div[text()='我的问卷']"),
("问卷记录", By.XPATH, "//div[text()='问卷记录']"),
("考试记录", By.XPATH, "//div[text()='考试记录']")
]
# 批量检查元素是否存在
for name, locator_type, locator in elements_to_check:
self.wait.until(EC.presence_of_element_located((locator_type, locator)))
# 3. 问卷数/考试数统计元素(简化选择器)
self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR,
".extraContent___3rMo7 .ant-statistic-content span"))
)
# 4. 创建考试/问卷按钮(简化选择器,等待可点击后再操作)
create_exam_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH,
"//a[contains(text(), '创建考试')]"))
)
create_exam_btn.click()
self.driver.back()
time.sleep(1) # 回退後短暫等待頁面加載
create_survey_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH,
"//a[contains(text(), '创建问卷')]"))
)
create_survey_btn.click()
self.driver.back()
time.sleep(1)
# print("HomeElement 所有元素检查完成")
except Exception as e:
print(f"HomeElement 执行失败: {str(e)}")
raise
# 二、测试首页设置按键功能(完全替换不稳定选择器)
def HomeSettings(self):
try:
# 确保在首页
self.driver.get(self.home_url)
# 1. 截取更改前截图
ExamDriver.getScreeShot()
# 2. 点击用户下拉菜单按钮(简化选择器)
user_dropdown_btn = self.wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR,
".ant-pro-global-header-right-content div:nth-child(2) span"))
)
user_dropdown_btn.click()
time.sleep(0.5) # 等待菜单展开
# 3. 选择整体风格设置(改用文本定位)
style_setting_menu = self.wait.until(
EC.element_to_be_clickable((By.XPATH, "//span[text()='整体风格设置']"))
)
style_setting_menu.click()
# 等待抽屉完全加载
self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ant-drawer-content")))
time.sleep(0.5)
# 4. 更改整体颜色(深色主题)- 用类名定位,抛弃nth-child
dark_theme_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH,
"//div[contains(@class, 'ant-pro-setting-drawer-block-checkbox-item-realDark')]"))
)
dark_theme_btn.click()
time.sleep(0.3)
# --- 核心修复:主题色定位(根据你截图,第7个是绿色) ---
# 截图里主题色顺序是:蓝、蓝、红、橙、黄、绿、青、蓝、紫
# 第7个是绿色,索引从1开始,所以是 [7]
theme_color_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH,
"/html/body/div[1]/div/div[2]/div[3]/div/div/div/div/div[2]/div/div[7]"))
)
theme_color_btn.click()
time.sleep(0.3)
# 6. 修改导航模式(侧边菜单布局)- 用类名定位
# 截图里导航模式第三个是"侧边菜单布局",已勾选
nav_mode_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH,
"/html/body/div[1]/div/div[2]/div[3]/div/div/div/div/div[4]/div/div[2]"))
)
nav_mode_btn.click()
time.sleep(0.3)
# 7. 修改侧边菜单类型(分组模式)- 用类名定位
# 截图里侧边菜单类型第一个是"分组模式",已勾选
# menu_type_btn = self.wait.until(
# EC.element_to_be_clickable((By.XPATH,
# "/html/body/div[1]/div/div[2]/div[3]/div/div/div/div/div[5]/div/div[2]/div/svg/g/path[1]"))
# )
# menu_type_btn.click()
# time.sleep(0.3)
# 8. 关闭设置抽屉(简化选择器)
mask_btn = self.wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR,
".ant-drawer-mask"))
)
mask_btn.click()
time.sleep(1) # 等待样式生效
# 9. 截取更改后截图
ExamDriver.getScreeShot()
# 10. 退出登录功能(简化选择器)
# 重新打开用户下拉菜单
user_dropdown_btn = self.wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR,
".ant-pro-global-header-right-content div:nth-child(2) span"))
)
user_dropdown_btn.click()
time.sleep(0.5) # 等待菜单展开
except Exception as e:
print(f" HomeSettings 执行失败: {str(e)}")
ExamDriver.getScreeShot()
raise
def IndexExitLogin(self):
# 点击退出登录
logout_btn = self.wait.until(
EC.element_to_be_clickable((By.XPATH, "/html/body/div[4]/div/div/ul/li[4]/span[2]"))
)
logout_btn.click()
# # 执行测试
# if __name__ == "__main__":
# index_test = ExamIndex()
# index_test.LogSucTest()
# index_test.HomeElement()
# index_test.HomeSettings()
我的项目测试
python
#Project.py
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamProject():
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/project"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
# 创建显式等待对象
self.wait = WebDriverWait(self.driver, 10)
def ProjectTest(self):
# 点击详细显示
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > div > label:nth-child(2)").click()
ExamDriver.getScreeShot()
# 搜索框输入测试
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").send_keys(
"测试")
# 点击搜索按钮
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button").click()
ExamDriver.getScreeShot()
# 将搜索框的内容清空
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input").clear()
# 重新搜索
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button").click()
# 对一个项目进行重命名
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(1) > div > div > div > div > div > div > table > tbody > tr:nth-child(1) > td:nth-child(7) > a:nth-child(1)").click()
# self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("")
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试001")
ExamDriver.getScreeShot()
# 点击确定按钮
self.driver.find_element(By.CSS_SELECTOR,
"body > div:nth-child(8) > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary > span").click()
self.wait.until(EC.invisibility_of_element_located(
(By.CSS_SELECTOR, "body > div:nth-child(8) > div > div.ant-modal-wrap")
))
# 将项目进行删除
self.driver.find_element(By.XPATH, "//a[text()='删除']").click()
# 等待删除确认弹窗出现
self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous")
))
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous").click()
# 等待删除操作完成
self.wait.until(EC.invisibility_of_element_located(
(By.CSS_SELECTOR, "button.ant-btn.ant-btn-default.ant-btn-dangerous")
))
# 点击新建 - 1.新建AI对话
self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
# 等待下拉菜单出现
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div[4]/div/div/ul/li[1]/span")
))
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div/ul/li[1]/span").click()
# 等待AI对话窗口出现 - 替换time.sleep(1)
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//div[contains(@class, 'ant-drawer-content-wrapper')]//textarea")
))
self.driver.find_element(By.XPATH, "//div[contains(@class, 'ant-drawer-content-wrapper')]//textarea").send_keys(
"对话测试")
self.driver.find_element(By.XPATH, "//button[span='发送']").click()
ExamDriver.getScreeShot()
# 等待发送按钮可点击
self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//button[span='清空对话']")
))
self.driver.find_element(By.XPATH, "//button[span='清空对话']").click()
self.driver.find_element(By.XPATH, "//div[contains(@class, 'ant-drawer-extra')]//button").click()
# 2.新建问卷调查
self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
# 等待下拉菜单出现 - 替换time.sleep(1)
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div[4]/div/div/ul/li[2]/span")
))
self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div/ul/li[2]/span").click()
# 等待问卷调查编辑器加载完成
self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR,
"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
))
self.driver.find_element(By.CSS_SELECTOR,
"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys(
"自动化测试")
self.driver.find_element(By.CSS_SELECTOR,
"#rc-tabs-0-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(1)").click()
self.driver.find_element(By.CSS_SELECTOR,
"#rc-tabs-0-panel-1 > div > div > dl:nth-child(1) > div > div:nth-child(2)").click()
self.driver.find_element(By.CSS_SELECTOR,
"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm").click()
ExamDriver.getScreeShot()
self.driver.back()
self.driver.back()
# 新建考试
self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div[5]/div/div/ul/li[3]/span")
))
self.driver.find_element(By.XPATH, "/html/body/div[5]/div/div/ul/li[3]/span").click()
self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR,
"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p")
))
self.driver.find_element(By.CSS_SELECTOR,
"#editorContent > div > div > div.header > div.header-content > div.sc-aXZVg.LyTMt.title.quill-container.not-focus > div > pre > div.ql-editor > p").send_keys(
"考试自动化测试")
self.driver.find_element(By.XPATH,
"//*[starts-with(@id, 'rc-tabs-') and contains(@id, '-panel-1')]/div/div/dl[2]/div/div[1]").click()
self.driver.find_element(By.XPATH,
"//*[starts-with(@id, 'rc-tabs-') and contains(@id, '-panel-1')]/div/div/dl[2]/div/div[2]").click()
self.driver.find_element(By.CSS_SELECTOR,
"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm").click()
ExamDriver.getScreeShot()
self.driver.back()
self.driver.back()
# 新建文件夹
self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div/div/div/ul/li[7]/span")
))
self.driver.find_element(By.XPATH, "/html/body/div/div/div/ul/li[7]/span").click()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试创建文件夹")
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div/div/div/div/div/div/button[2]").click()
# 从回收站当中恢复文件夹
self.driver.find_element(By.XPATH, "//button[normalize-space()='新建']").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div/div/div/ul/li[8]/span")
))
self.driver.find_element(By.XPATH, "/html/body/div/div/div/ul/li[8]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div/table/tbody/tr[1]/td[1]/label/span/input").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div[2]/div/div[2]")
))
self.driver.find_element(By.XPATH,
"/html/body/div/div/div[2]/div/div[2]/div/div/div/div/div[2]/div/div/div/div/div[2]/div/div[2]").click()
self.driver.find_element(By.XPATH, "/html/body/div/div/div/div/div[2]/div/div/div[2]/button[2]").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "/html/body/div/div/div[2]/div/div[2]/button")
))
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div/div/div[2]/div/div[2]/button").click()
我的练习测试
python
#Exercise.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamExercise:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/exercise"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
# 遍历我的练习页功能
def ExamExerciseList(self):
# 点击我的练习
self.driver.find_element(By.XPATH,
"//div[contains(@class, 'ant-tabs-tab') and contains(., '我的练习')]/span").click()
# 进行查询
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div.ant-pro-table > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "//*[@id='sk-layout']//table//tr[6]//a[text()='继续答题']").click()
ExamDriver.getScreeShot()
# self.driver.find_element(By.XPATH,"//span[text()='查看答案']").click()
self.driver.find_element(By.XPATH, "//button[normalize-space()='下一页']").click()
self.driver.find_element(By.XPATH, "//button[normalize-space()='结束练习']").click()
self.driver.find_element(By.XPATH, "//*[@id='sk-layout']//table//tr[1]//a[text()='二维码']").click()
self.driver.find_element(By.XPATH, "//*[@id='sk-layout']//table//tr[1]//a[text()='删除']").click()
ExamDriver.getScreeShot()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//button[normalize-space()='Cancel']")
))
# self.driver.find_element(By.XPATH,"//button[normalize-space()='OK']").click()
self.driver.find_element(By.XPATH, "//button[normalize-space()='Cancel']").click()
我的题库测试
python
#RepoIndex.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamRepoIndex:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/repo/index"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def RepoIndexList(self):
self.driver.find_element(By.XPATH, "//*[@id='name']").send_keys("自动化")
self.driver.find_element(By.XPATH, "//*[@id='sk-layout']//form//div[2]/button").click()
ExamDriver.getScreeShot()
self.wait.until(EC.visibility_of_element_located((By.XPATH, "//a[contains(text(), '文本导入')]")))
# 文本导入
self.driver.find_element(By.XPATH, "//a[contains(text(), '文本导入')]").click()
self.driver.find_element(By.XPATH, "/html/body/div/div/div/div/div/div/div/div[1]/div/div/div[6]").send_keys(
"感谢您能抽出几分钟时间来参加本次答题,现在我们就马上开始吧!【欢迎语】")
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body//div[2]/div/div[2]/button").click()
# 试题管理
self.driver.find_element(By.XPATH, "//a[contains(text(), '试题管理')]").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div//div[2]/div/div/button").click()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(2) > div > div:nth-child(2)").click()
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(1)")))
self.driver.find_element(By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(1)").click()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(2) > div > div:nth-child(2)").click()
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(2)")))
self.driver.find_element(By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(2)").click()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(2) > div > div:nth-child(2)").click()
self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(3)")))
self.driver.find_element(By.CSS_SELECTOR, "div.ant-dropdown ul > li:nth-child(3)").click()
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']//section/div[2]/main/div/div[2]//div[2]/div/div[3]").click()
time.sleep(2)
# self.wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR,"div > div > div > div.ant-popover-inner > div.ant-popover-title > div > label > span.ant-checkbox.ant-checkbox-checked > input")))
# 列设置
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-title > div > label > span.ant-checkbox.ant-checkbox-checked > input").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(1) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(2) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(3) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(4) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(5) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(6) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(7) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(8) > span.ant-tree-checkbox").click()
self.driver.find_element(By.CSS_SELECTOR,
"div > div > div > div.ant-popover-inner > div.ant-popover-inner-content > div > div > div.ant-tree-list > div > div > div > div:nth-child(9) > span.ant-tree-checkbox").click()
ExamDriver.getScreeShot()
# 新建题库
self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
self.driver.find_element(By.XPATH, "/html/body/div//div[3]/div/div/div[1]/button").click()
我的笔记测试
python
#RepoBook.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
# 我的笔记页
class ExamRepoBook:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/repo/book"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def ExamRepoBookList(self):
# 根据错题的标题进行查询
self.driver.find_element(By.XPATH,
"//div[contains(@class, 'ant-tabs-nav')]//div[contains(@class, 'ant-tabs-tab') and contains(., '我的错题')]").click()
# time.sleep(1)
self.driver.find_element(By.XPATH, "//*[@id='name']").send_keys("驾驶")
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main/div//div[1]/form/div//div[1]/div/div[2]/button").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH,
"//div[contains(@class, 'ant-tabs-nav')]//div[contains(@class, 'ant-tabs-tab') and contains(., '我的收藏')]").click()
ExamDriver.getScreeShot()
问题管理测试
python
#RepoTemplate.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
from tests.RepoIndex import ExamRepoIndex
# 问题管理页
class ExamRepoTemplate:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/repo/template"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def RepoTemplateList(self):
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/form//div[1]/div/div[2]/button").click()
self.driver.find_element(By.XPATH, "//tr[2]//a[text()='编辑']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#editorContent > div > div").click()
# self.driver.find_element(By.CSS_SELECTOR,"#editorContent > div > div > div > div > div > div > div > div.q-content > div > div > div > div > div > div:nth-child(2) > input").send_keys("自动化测试")
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR,
"#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button:nth-child(5)").click()
模板管理测试
python
#Template.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.action_chains import ActionChains
from Common.Utils import ExamDriver
# 模板广场页
class ExamTemplate:
def __init__(self):
self.url = "http://49.235.61.184:8080/template"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def ExaTemplateList(self):
# 1. 模板筛选
self._filter_templates()
# 2. 添加模板
self._add_template()
# 3. 填写模板信息
self._fill_template_info()
def _filter_templates(self):
"""筛选模板"""
# 第一类筛选
filter1 = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*[@id='sk-layout']//section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[1]")
))
filter1.click()
ExamDriver.getScreeShot()
# 选择"全部"
all_option = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//form//div[contains(@class, 'content')]//span[text()='全部']")
))
all_option.click()
ExamDriver.getScreeShot()
# 输入筛选关键词
search_input1 = self.wait.until(EC.presence_of_element_located(
(By.XPATH, "//*[@id='sk-layout']/div/div/section/div/main/div//div/div/div/span/span/input")
))
search_input1.clear()
search_input1.send_keys("自动化测试")
ExamDriver.getScreeShot()
# 等待筛选结果加载完成
self.wait.until(
lambda driver: "加载" not in driver.page_source or
EC.invisibility_of_element_located((By.CSS_SELECTOR, ".ant-spin, .loading"))(driver)
)
# 第二类筛选(重复类似操作)
filter2 = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*[@id='sk-layout']//section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[2]")
))
filter2.click()
# 同样选择"全部"
all_option2 = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//form//div[contains(@class, 'content')]//span[text()='全部']")
))
all_option2.click()
# 输入筛选关键词
search_input2 = self.wait.until(EC.presence_of_element_located(
(By.XPATH, "//*[@id='sk-layout']/div/div/section/div/main/div//div/div/div/span/span/input")
))
search_input2.clear()
search_input2.send_keys("自动化测试")
# 等待筛选结果加载完成
self.wait.until(
lambda driver: "加载" not in driver.page_source or
EC.invisibility_of_element_located((By.CSS_SELECTOR, ".ant-spin, .loading"))(driver)
)
def _add_template(self):
"""添加模板操作"""
# 点击添加模板按钮
add_btn = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*[@id='sk-layout']/div/div/section/div[2]/main/div//span/div/div/button")
))
add_btn.click()
time.sleep(1)
# 选择模板选项
option1 = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*/div/div/dl[2]/div/div[1]/dd/div")
))
option1.click()
option2 = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*/div/div/dl[2]/div/div[2]/dd/div")
))
option2.click()
# 点击下一步按钮
next_btn = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//*[@id='editor']//div[1]/div[2]/div/button[5]")
))
next_btn.click()
# 等待确认对话框出现
self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".ant-modal-footer .ant-btn-primary"))
)
# 确认操作
confirm_btn = self.wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, ".ant-modal-footer .ant-btn-primary")
))
confirm_btn.click()
# 等待模板信息表单加载完成
self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, "#name"))
)
def _fill_template_info(self):
"""填写模板信息"""
# 输入模板名称
name_input = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#name")))
name_input.clear()
name_input.send_keys("自动化测试模板001")
# 等待输入完成
self.wait.until(
lambda driver: name_input.get_attribute("value") == "自动化测试模板001"
)
# 处理分类输入框
self._input_category()
# 处理标签输入框
self._input_tags()
# 等待标签输入完成
self.wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, ".ant-tag"))
)
# 选择复选框
checkbox = self.wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, "#survey-modal-container .ant-checkbox-wrapper")
))
checkbox.click()
# 等待复选框被选中
self.wait.until(
lambda driver: driver.find_element(By.CSS_SELECTOR,
"#survey-modal-container .ant-checkbox-wrapper input").is_selected()
)
ExamDriver.getScreeShot()
# 保存模板
save_btn = self.wait.until(EC.element_to_be_clickable(
(By.CSS_SELECTOR, "#survey-modal-container .ant-modal-footer .ant-btn-primary")
))
save_btn.click()
# 等待保存成功,模态框关闭
self.wait.until(
EC.invisibility_of_element_located((By.CSS_SELECTOR, "#survey-modal-container .ant-modal"))
)
self.driver.back()
def _input_category(self):
"""处理分类输入框"""
# 尝试直接输入
category_input = self.wait.until(EC.presence_of_element_located(
(By.XPATH, "//div[@id='survey-modal-container']//form//div[2]//input")
))
category_input.clear()
category_input.send_keys("自动化测试")
def _input_tags(self):
"""处理标签输入框 - 使用多种方式尝试"""
tags = ["牛人", "二号", "考试", "测试001", "二哈", "测试", "自动化"]
# 查找标签输入框
tag_input = self.wait.until(EC.presence_of_element_located(
(By.CSS_SELECTOR, ".ant-select-selection-search input, .ant-select-selector input, [role='combobox'] input")
))
# 逐个输入标签
for tag in tags:
tag_input.clear()
tag_input.send_keys(tag)
tag_input.send_keys(Keys.RETURN) # 按回车生成标签
用户管理测试
python
#SystemUser.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamSystemUser:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/user"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemUser(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("zhz")
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-md-18 > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']")
))
self.driver.find_element(By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR,
"body > div:nth-child(8) > div > div.ant-drawer-content-wrapper > div > div > div.ant-drawer-footer > div > div > div:nth-child(2) > button").click()
self.driver.find_element(By.XPATH, "//button[span[text()='新建']]").click()
self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("test002")
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test002")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#rePassword").send_keys("123456")
# 触发下拉框
gender_input = self.driver.find_element(By.ID, "gender")
# 尝试点击输入框
gender_input.click()
# 等待直到选项元素可见
option1 = self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='男']")
))
option1.click()
# 触发下拉框
gender_input = self.driver.find_element(By.ID, "status")
# 尝试点击输入框
gender_input.click()
# 等待直到选项元素可见
option2 = self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='激活']")
))
option2.click()
ExamDriver.getScreeShot()
# time.sleep(5)
self.driver.find_element(By.CSS_SELECTOR,
"body > div:nth-child(8) > div > div.ant-drawer-content-wrapper > div > div > div.ant-drawer-footer > div > div > div:nth-child(2) > button").click()
角色管理测试
python
#SystemRole.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamSystemRole:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/role"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemRole(self):
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("yonghu")
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div.ant-col.ant-col-8.ant-col-offset-8 > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
ExamDriver.getScreeShot()
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']")
))
time.sleep(1)
self.driver.find_element(By.XPATH, "//tr[contains(@class, 'ant-table-row')][1]//*[text()='编辑']").click()
code = self.driver.find_element(By.CSS_SELECTOR, "#code")
code.clear()
code.send_keys("1")
self.driver.find_element(By.XPATH,
"/html/body//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[6]/span[2]/span").click()
self.driver.find_element(By.XPATH, "/html/body/div//div[3]/div/div/div[2]/button").click()
self.driver.find_element(By.XPATH, "//button[span[text()='新建']]").click()
#
self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("test")
self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("666")
# 触发下拉框
gender_input = self.driver.find_element(By.ID, "status")
# 尝试点击输入框
gender_input.click()
# 等待直到选项元素可见
option2 = self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//div[contains(@class,'ant-select-item-option') and text()='正常']")
))
option2.click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("这是进行自动化测试的角色")
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[1]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[2]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[3]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[4]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[5]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[6]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[7]/span[2]/span").click()
self.driver.find_element(By.XPATH,
"/html/body/div//div[2]/form/div[3]/div/div/div/div/div[2]/div/div/ul/li[8]/span[2]/span").click()
self.driver.find_element(By.XPATH, "/html/body//div[3]/div/div/div[2]/button").click()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("test")
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div.ant-col.ant-col-8.ant-col-offset-8 > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
组织机构测试
python
#SystemDept.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
from tests.RepoIndex import ExamRepoIndex
class ExamSystemDept:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/dept"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemDeptList(self):
self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
self.driver.find_element(By.CSS_SELECTOR, "#shortName").send_keys("test")
# 负责人选择框处理
manager = self.driver.find_element(By.CSS_SELECTOR, "#managerId")
manager.click()
# 等待下拉选项出现
self.wait.until(EC.visibility_of_element_located(
(By.CSS_SELECTOR, "div.ant-select-dropdown:not([style*='display: none'])")
))
# 输入搜索关键字
manager.send_keys("测试")
# 等待搜索结果出现
self.wait.until(EC.visibility_of_element_located(
(By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '测试账号')][1]")
))
# 选择第一个匹配的负责人
first_option = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '测试账号')][1]")
))
first_option.click()
self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("自动化测试")
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body//div/div/div[2]/button").click()
self.driver.refresh()
岗位设置测试
python
#SystemPosition.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamSystemPosition:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/position"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemPosition(self):
self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
ExamDriver.getScreeShot()
self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("自动化测试")
self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("999")
Type = self.driver.find_element(By.CSS_SELECTOR, "#dataPermissionType")
Type.click()
# 选择第一个匹配的负责人
first_option = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '本人')][1]")
))
first_option.click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div[4]//div/div/div[2]/button").click()
self.driver.refresh()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main/div/div//form/div/div[2]/div/div//div/div[2]/button").click()
ExamDriver.getScreeShot()
字典管理测试
python
#SystemDict.py
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamSystemDict:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/dict"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemPosition(self):
self.driver.find_element(By.XPATH, "//*[text()='新建']").click()
ExamDriver.getScreeShot()
self.driver.find_elements(By.CSS_SELECTOR, "#name")[1].send_keys("自动化字典测试")
Type = self.driver.find_element(By.CSS_SELECTOR, "#dictType")
Type.click()
first_option = self.wait.until(EC.element_to_be_clickable(
(By.XPATH, "//div[contains(@class, 'ant-select-item-option') and contains(., '问卷字典')][1]")
))
first_option.click()
self.driver.find_element(By.CSS_SELECTOR, "#code").send_keys("1234")
self.driver.find_element(By.CSS_SELECTOR, "#remark").send_keys("自动化测试新增字典")
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button").click()
self.driver.refresh()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化字典测试")
self.driver.find_element(By.CSS_SELECTOR,
"#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button").click()
ExamDriver.getScreeShot()
个人设置测试
python
#SystemSetting.py
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.wait import WebDriverWait
from Common.Utils import ExamDriver
class ExamSystemSetting:
url = ""
driver = ""
def __init__(self):
self.url = "http://49.235.61.184:8080/system/setting"
self.driver = ExamDriver.driver
if self.driver.current_url != self.url:
self.driver.get(self.url)
self.wait = WebDriverWait(self.driver, 10)
def SystemSetting(self):
# 基础设置
self.driver.find_element(By.XPATH, "//span[text()='基本设置']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试")
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#phone").send_keys("1234567890")
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#email").send_keys("123456@qq.com")
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#profile").send_keys("自动化测试个人简介")
# self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main/div//span/div/span/div/button").send_keys("C:\\Users\\zhuohongze\\Pictures\\linux.jpg")
# self.driver.find_element(By.XPATH,"/html/body/div/div/div/div/div[2]/div[3]/button[2]").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div/main//div[2]/div[1]/form/div[5]/div[2]/button").click()
# 安全设置
self.driver.find_element(By.XPATH, "//span[text()='安全设置']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main//div/div/ul/li/ul/li").click()
self.driver.find_element(By.CSS_SELECTOR, "#oldPassword").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#confirmPassword").send_keys("123456")
ExamDriver.getScreeShot()
self.driver.find_element(By.XPATH, "/html/body/div//div/div/div[2]/button").click()
self.driver.find_element(By.XPATH, "//span[text()='AI设置']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#aiSetting_enabled").click()
self.driver.find_element(By.CSS_SELECTOR, "#aiSetting_enabled").click()
# self.driver.find_element(By.XPATH,"//*[@id='sk-layout']/div/div/section/div[2]/main//div[2]/div[2]/div/form/div[2]/div[1]/button").click()
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main//div/form/div[5]/div[1]/button").click()
self.driver.find_element(By.XPATH, "//span[text()='系统设置']").click()
ExamDriver.getScreeShot()
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#name").send_keys("自动化测试问卷考试系统")
self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#description").send_keys("进行一次自动化测试")
self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#setting_copyright").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys(Keys.CONTROL + 'a')
self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys(Keys.DELETE)
self.driver.find_element(By.CSS_SELECTOR, "#setting_recordNum").send_keys("123456")
self.driver.find_element(By.XPATH,
"//*[@id='sk-layout']/div/div/section/div[2]/main/div/div/div/div[2]/div[2]/div[1]/form/div[8]/div[1]/button").click()
测试执行主程序
python
#Run.py
from Common.Utils import ExamDriver
from tests.Exercise import ExamExercise
from tests.Project import ExamProject
from tests.RepoBook import ExamRepoBook
from tests.RepoIndex import ExamRepoIndex
from tests.RepoTemplate import ExamRepoTemplate
from tests.SystemDept import ExamSystemDept
from tests.SystemDict import ExamSystemDict
from tests.SystemPosition import ExamSyatemPosition
from tests.SystemRole import ExamSystemRole
from tests.SystemSetting import ExamSystemSetting
from tests.SystemUser import ExamSystemUser
from tests.Template import ExamTemplate
from tests.Index import ExamIndex
from tests.Login import ExamLogin
from tests.Register import ExamRegister
if __name__ == '__main__':
# 1.登录页
ExamLogin().LogSucTest()
# 3.首页
# 创建单个实例
exam_index = ExamIndex()
# 调用第一个方法
exam_index.HomeElement()
exam_index.HomeSettings()
# 4.我的项目
exam_project = ExamProject()
exam_project.ProjectTest()
#
# #5.我的练习页
ExamExercise().ExamExerciseList()
# 题库中心页
ExamRepoIndex().RepoIndexList()
# 问题管理页
ExamRepoTemplate().RepoTemplateList()
# 我的笔记页
ExamRepoBook().ExamRepoBookList()
# 模板广场
ExamTemplate().ExaTemplateList()
# 系统管理
# 用户管理
ExamSystemUser().SystemUser()
# 角色管理
ExamSystemRole().SystemRole()
# 组织机构
ExamSystemDept().SystemDeptList()
# 岗位设置
ExamSyatemPosition().SystemPosition()
# 字典管理
ExamSystemDict().SystemPosition()
# 个人设置
ExamSystemSetting().SystemSetting()
ExamIndex().IndexExitLogin()
ExamLogin().LoginFail()
ExamLogin().LoginFailByPassword()
ExamLogin().LoginFailEmpty()
ExamLogin().LoginFailNameEmpty()
ExamLogin().LoginFailPasswordEmpty()
ExamLogin().ToRegister()
# 2.注册页
ExamRegister().RegisterSuctest()
ExamRegister().RegisterFailReRG()
ExamRegister().RegisterFailEmpty()
ExamRegister().RegisterFailEmptyName()
ExamRegister().RegisterFailEmptyUser()
ExamRegister().RegisterFailEmptyPassword()
ExamRegister().RegisterFailEmptyRePassword()
ExamRegister().RegisterFailPasswordUnder5()
ExamRegister().Returntologin()
ExamDriver.driver.quit()
六、BUG描述
1. BUG:"搜模板"按键异常,对于已存在的模板,搜索不出来,搜模板功能失效


2. BUG:必选项之一的"状态"选择异常,未选择也可以成功创建用户,且用户状态为"激活"


3. BUG:新密码与旧密码相同时也可以成功修改密码


4.BUG:组织机构模块无法正常添加新部门


七、测试结论
功能完整性: 除了组织机构添加功能外,系统所有核心功能均正常运行
系统稳定性: 测试期间系统稳定,未出现崩溃或严重错误
用户体验: 界面友好,操作流程清晰,响应及时
数据一致性: 数据操作结果符合预期,无数据异常
测试覆盖: 自动化测试覆盖了所有主要功能模块
该系统上有四个BUG需要修复