一、项目背景
为论坛系统项目设计并进行自动化测试。论坛系统由六个页面构成:用户登录页、用户注册页、个人中心页面、我的帖子页面、帖子编辑页、帖子列表页以及帖子详情页。
通过使用selenium工具来定位到web中的元素,对获取到的元素进行自动化测试等操作。博客系统实现了发布个人帖子并记录帖子的标题、内容、发布时间、发布人等详细信息的功能。
二、设计测试用例
三、执行测试用例
3.1 论坛登录页测试
3.1.1 登录页面
3.1.2 输入正确的用户名和密码
预期结果:输入正确的用户名和密码后,点击登录按钮成功跳转到论坛列表页
实际结果:
3.1.2 输入正确的用户名和错误的密码
预期结果:输入正确的用户名和错误的密码并点击登录按钮,会弹出警告框并提示用户名或者密码错误。
实际结果:
3.1.3 输入错误的用户名和正确的密码
预期结果:输入错误的用户名和正确的密码并点击登录按钮,会弹出警告框并提示用户名或者密码错误。
实际结果:
3.1.4 输入错误的用户名和密码
预期结果: 输入错误的用户名和密码并点击登录按钮,会弹出警告框并提示用户名或者密码错误。
实际结果:
3.1.5 输入用户名但不输入密码
预期结果: 输入用户名但不输入密码并点击登录按钮,密码输入框下方会提示密码不能为空。
实际结果:
3.1.6 输入密码但不输入用户名
预期结果: 输入密码但不输入用户名并点击登录按钮,用户名输入框下方会提示用户名不能为空。
实际结果:
3.1.7 不输入账号和密码
预期结果: 不输入用户名和密码并点击登录按钮,用户名输入框下方会提示用户名不能为空,密码输入框下方会提示密码不能为空。
实际结果:
3.2 论坛注册页面测试
3.2.1 注册页面
通过点击登录页面中的点击注册按钮进入到注册页面
3.2.2 输入用户名、昵称、密码、确认密码并同意条款
预期结果:注册成功并跳转到登录界面,在登陆界面输入注册时填写的账号和密码即可成功登录并跳转到论坛列表页
实际结果:
3.2.3 填写用户名,不填写昵称、密码、确认密码,不同意条款
预计结果:会提示昵称和密码不能为空且请同意条款
实际结果:
3.2.4 填写昵称、确认密码,不填写用户名、密码,不同意条款
预计结果:会提示用户名和密码不能为空且请同意条款
实际结果:
3.2.5 填写密码,不填写用户名、昵称、确认密码,同意条款
预计结果:会提示用户名、昵称不能为空且请检查确认密码
实际结果:
3.2.6 填写用户名、昵称、密码,不填写确认密码,不同意条款
预计结果:会提示请检查确认密码且同意条款
实际结果:
3.2.7 填写昵称、密码,不填写用户名、确认密码,不同意条款
预计结果:会提示用户名不能为空,请检查确认密码且同意条款
实际结果:
3.2.8 填写用户名、确认密码,不填写昵称、密码,同意条款
预计结果:会提示昵称和密码不能为空
实际结果:
3.2.9 填写确认密码,不填写用户名、昵称、密码,同意条款
预计结果:会提示用户名、昵称和密码不能为空
实际结果:
3.2.9 不填写用户名、昵称、密码、确认密码,同意条款
预计结果:会提示用户名、昵称和密码不能为空且请检查确认密码
实际结果:
3.2.9 不填写用户名、昵称、密码、确认密码,不同意条款
预计结果:会提示用户名、昵称和密码不能为空且请检查确认密码和同意条款
实际结果:
3.3 论坛列表页测试
3.3.1 列表页面
3.3.2 点击任意一个板块按钮,看下是否正确跳转到对应的界面
预期结果:点击Java板块按钮后,跳转到Java分类的页面
实际结果:
3.3.3 点击任意一篇帖子,跳转到该帖子的详情页
预期结果:点击Java板块按钮后,跳转到Java分类的页面并点击第一篇帖子。结果跳转到该帖子的详情页
实际结果:
3.3.4 点击发布帖子按钮,跳转到帖子编辑页
预期结果:点击发布帖子按钮,跳转到帖子编辑页
实际结果:
3.3.5 从论坛首页跳转到别的页面想通过浏览器回退的功能回到论坛首页
预期结果:点击浏览器的回退按钮,重新跳转到论坛首页
实际结果:跳转到登录页(BUG)
3.3.6 板块分类只显示部分
预期结果:成功登录后跳转到论坛首页,能清晰看到当前论坛帖子的分类
实际结果:只有部分分类显示(BUG)
3.3.7 搜索功能
预期结果:在搜索框输入正确的搜索条件并点击搜索,能正确搜索到帖子
实际结果:搜索功能无法使用并且加载时间没那么快(BUG)
3.4 论坛个人中心测试
3.4.1 界面
3.4.2 修改密码(查看密码按钮无法使用)
预期结果:输入正确的原密码,新原密码,确认密码后点击提交修改按钮即可修改密码
实际结果:当原密码和新原密码一样,也能修改成功。(BUG)
3.5 帖子详情页测试
3.5.1 页面
3.5.2 点赞
预期结果:进入一篇文章的详情页并点赞该文章
实际结果:能多次对该文章点赞(BUG)
3.5.3 评论文章
预期结果:在文章的评论输入框输入评论的文字,点击回复按钮。能在评论区看到评论
实际结果:
3.5.4 私信
预期结果:点击发私信按钮,在私信编辑框中输入文字并点击发送即可发私信给作者
实际结果:
3.5.5 查看作者主页
预期结果:点击作者名字进入到作者的个人主页
实际结果:
3.6 帖子编辑页
3.6.1 页面
3.6.2 成功发布文章
预期结果:选择板块,输入标题和内容并点击发布按钮即可发布一篇帖子
实际结果:
3.6.3 未成功发布文章
预期结果:未输入内容并点击发布按钮,提示内容不能为空
实际结果:
预期结果:不输入标题和内容并点击发布按钮,提示请输入帖子标题
实际结果:
3.7 我的帖子页面
3.7.1 页面
3.7.2 查看帖子
预期结果:在我的帖子页面任意点击一篇帖子进行查看
实际结果:跳转到被点击帖子的详情页
3.8 兼容性测试
在Chrome浏览器和edge浏览器进行测试
Chrome浏览器:
edge浏览器:
总结
在Chrome浏览器和edge浏览器下打开论坛系统并没多大差别,只是在edge上打开页面的大小比在Chrome上打开页面的大小大一些。
四、基于Python和selenium的自动化测试
1、背景
若通过安装驱动的⽅式来启动浏览器,每次浏览器更新后对应的驱动也需要更新,为了解决这个问题,selenium中提供了驱动管理⼯具webdriver-manager,有了webdriver-manager⽆需⼿动安装浏览器驱动,即使浏览器更新也不会影响⾃动化的执⾏。
WebDriver Manager是⼀个开源的命令⾏⼯具,它可以⾃动下载和安装适⽤于不同浏览器的WebDriver。通过使⽤WebDriver Manager,我们可以确保浏览器驱动版本始终与浏览器版本保持⼀致,从⽽避免因版本不匹配⽽导致的各种问题
selenium是⼀个web⾃动化测试⼯具,selenium中提供了丰富的⽅法供给使⽤者进⾏web⾃动化测试。
2、创建新项目
首先得在新项目的设置里查看project:当前项目名中是否存在selenium和webdriver-manager这两个软件包
3、参照测试用例编写自动化脚本
3.1 创建浏览器对象
想要执行一系列的自动化测试操作就得请求访问URL对应的页面,由于每个页面的自动化测试是独立进行且都要使用浏览器对象(多次创建浏览器对象会造成性能的消耗)。所以把浏览器对象的创建放在一个文件中(Until.py文件),这样在退出浏览器之前,各个文件只需要从Until.py文件调用即可。
有些时候自动化测试的返回结果有问题,我们需要了解具体是哪处页面出了问题,所以需要用到屏幕截图功能。这个功能也是实现在Until.py文件中。
- 首先实现一个类Driver
- 然后定义一个类成员driver和两个成员函数(一个是类的构造函数,另一个是调用获取屏幕截图的函数)
import datetime
import os.path
import sys
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 创建浏览器对象
class Driver:
driver = "" # 对象初始化为空
def __init__(self): # 默认的构造函数
options = webdriver.ChromeOptions()
# 本地驱动来打开
path = 'D:\\chromedriver.exe'
# 通过webdriver方法来选择打开Chrome浏览器
# 而打开Chrome有很多参数,只需要关注service(选择用什么样的服务打开Chrome)和option(浏览器的配置)即可
# Service函数有一个参数,这个参数是用创建好的驱动来打开Chrome
# self.driver = webdriver.Chrome(service = Service(ChromeDriverManager().install()), options = options)
self.driver = webdriver.Chrome(executable_path=path, options=options)
# 隐式等待2秒,等待页面加载
self.driver.implicitly_wait(3)
def GetScreenShot(self):
# 获取屏幕截图
dirName = datetime.datetime.now().strftime("%Y-%m-%d")
# 判断dirName文件夹是否存在,若不存在则创建文件夹
# ../images/2025-3-14
if not os.path.exists("../images/" + dirName):
os.mkdir("../images/" + dirName)
# 想要的截图文件夹名: 方法名 + 日期 + 时间 + .png
# ../images/LoginSucTest-2025-3-14-91325.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)
ForumDriver = Driver()
3.2 创建一个用于测试各种接口的文件(只运行这个文件)
- 文件名为:Run_Test.py
from common.Utils import ForumDriver
from tests import ForumLogin, ForumList, ForumCenter, ForumDetail, ForumEdit
if __name__ == "__main__":
# 论坛登录页测试用例
# ForumLogin.ForumLogin().ForumLoginByFail()
ForumLogin.ForumLogin().ForumLoginBySuc()
# 论坛首页测试用例
# ForumList.ForumList().ForumListByLogin()
# ForumList.ForumList().ForumListByNotLogin()
# 论坛个人中心
# ForumCenter.ForumCenter().FornumCenterByLogin()
# 帖子详情页
# ForumDetail.ForumDetail().ForumDetailByLogin()
# 帖子编辑页
ForumEdit.ForumEdit().ForumEditByLogin()
3.3 论坛登录页自动化测试
- 创建一个用于执行论坛登录自动化测试的文件(文件名为:ForumLogin.py)
- 在文件中创建一个类(ForumLogin)用于在里面实现自动化测试的接口
- 引入Until.py文件和一些需要用到的包和依赖
- 在类里面分别编写两个用于测试登陆成功和登录失败的函数(测试用例)
- 需要注意的是在输入账号和密码前需要将输入框中的文本给删除
- 在对论坛登录页进行测试时主要是对页面是否能正常打开和是否能正常登录
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛登录页自动化测试
class ForumLogin:
url = ""
driver = ""
def __init__(self):
self.url = "http://127.0.0.1:9580/sign-in.html"
self.driver = ForumDriver.driver
self.driver.get(self.url)
#测试论坛系统登录成功案例
def ForumLoginBySuc(self):
# 输入正确的账号和密码, 账号: oldneez 密码: 123456
# 输入前先把输入框中的文本给清除
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("oldneez")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 判断是否成功登陆,对用户的昵称进行断言。有就代表登陆成功,没有就代表失败
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname")
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# # 因为还要测试异常登录,所以需要从论坛首页回退到博客登录页
# self.driver.back()
# 测试论坛系统登陆失败案例
def ForumLoginByFail(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("oldneez")
# self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
#
# # 判断是否成功登陆,对用户的昵称进行断言。有就代表登陆成功,没有就代表失败
# self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname")
#
# # 截屏
# ForumDriver.GetScreenShot()
#######################################################################################
# 用例二: 输入正确的账号和错误的密码 账号:oldneez 密码:123
# 输入前先把输入框中的文本给清除
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("oldneez")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
time.sleep(1)
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
time.sleep(1)
# 输入错误的用户名和密码时会显示用户名或密码错误需要验证是否异常登录
# 由于警告框是页面元素,可以获取到文本信息来进行断言是否符合预期
alert = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2")
assert alert.text == "警告"
#######################################################################################
# 用例三:输入错误的账号和正确的密码 账号:admin 密码:123456
# 输入前先把输入框中的文本给清除
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("admin")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
time.sleep(1)
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
time.sleep(1)
# 输入错误的用户名和密码时会显示用户名或密码错误需要验证是否异常登录
# 由于警告框是页面元素,可以获取到文本信息来进行断言是否符合预期
alert = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2")
assert alert.text == "警告"
#######################################################################################
# 用例四:输入账号不输入密码 账号:oldneez
# 输入前先把输入框中的文本给清除
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("oldneez")
time.sleep(1)
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
time.sleep(1)
# 不输入用户名或密码时会显示用户名或密码不能为空
alert = self.driver.find_element(By.CSS_SELECTOR, "#signInForm > div.mb-2 > div > div")
assert alert.text == "密码不能为空"
#######################################################################################
# 用例五:输入密码不输入账号 密码:123456
# 输入前先把输入框中的文本给清除
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123456")
time.sleep(1)
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
time.sleep(1)
# 不输入用户名或密码时会显示用户名或密码不能为空
alert = self.driver.find_element(By.CSS_SELECTOR, "#signInForm > div.mb-3 > div")
assert alert.text == "用户名不能为空"
#######################################################################################
# 用例六:不输入密码和账号
# 输入前先把输入框中的文本给清除
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
time.sleep(1)
# 点击登录按钮
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
time.sleep(1)
# 不输入用户名或密码时会显示用户名或密码不能为空
alert = self.driver.find_element(By.CSS_SELECTOR, "#signInForm > div.mb-3 > div")
assert alert.text == "用户名不能为空"
# login = ForumLogin()
# login.ForumLoginBySuc()
# login.ForumLoginByFail()
3.4 论坛注册页面自动化测试
创建一个用于执行论坛注册页面自动化测试的文件(文件名为:ForumRegister.py)
在文件中创建一个类(ForumRegister)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试注册成功和注册失败的函数(测试用例)
测试的内容包括:如果注册成功,会跳转到登录页进行登录。注册失败则重新注册
import time
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛注册的测试用例
class ForumRegister:
driver = ""
url = ""
def __init__(self):
self.driver = ForumDriver.driver
self.url = "http://127.0.0.1:9580/sign-up.html"
self.driver.get(self.url)
# 正常注册测试
def ForumRegistBySuc(self):
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# 输入用户名、昵称、密码、确认密码
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("aaa2")
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("测试")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
time.sleep(1)
# 同意协议,然后点击注册按钮
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 查看注册成功后是否跳转到登录页
text = self.driver.find_element(By.CSS_SELECTOR, "body > div > div > div > div:nth-child(1) > div > div.card.card-md > div > h2").text
assert text == "用户登录"
self.driver.back()
# 注册异常的测试用例
def ForumRegistByFail(self):
# 用例一: 填写用户名,不填写昵称、密码、确认密码,不同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
# self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("test456")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(3) > div").text
assert text == "昵称不能为空"
############################################################################################################
# 用例二:填写昵称、确认密码,不填写用户名、密码,不同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("test456")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 用户名未填写时输入框底部会有提示说明未填写
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text == "用户名不能为空"
###########################################################################################################
# 用例三:填写密码,不填写用户名、昵称、确认密码,同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 未确认密码时输入框底部会有提示说明请确认密码
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text == "用户名不能为空"
###########################################################################################################
# 用例四:填写昵称、密码,不填写用户名、确认密码,不同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#nickname").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#password").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 用户名未填写时输入框底部会有提示说明未填写
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text == "用户名不能为空"
###########################################################################################################
# 用例五:填写用户名、确认密码,不填写昵称、密码,同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#username").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").send_keys("123")
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 昵称未填写时输入框底部会有提示说明未填写
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(3) > div").text
assert text == "昵称不能为空"
###########################################################################################################
# 用例七:不填写用户名、昵称、密码、确认密码,同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 用户名未填写时输入框底部会有提示说明未填写
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text == "用户名不能为空"
###########################################################################################################
# 用例八:不填写用户名、昵称、密码、确认密码,不同意条款
# 寻找输入框并清除内部数据
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#nickname").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR, "#passwordRepeat").clear()
self.driver.find_element(By.CSS_SELECTOR, "#policy").click()
time.sleep(1)
self.driver.find_element(By.CSS_SELECTOR, "#submit").click()
time.sleep(1)
# 放大屏幕且截图
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 用户名未填写时输入框底部会有提示说明未填写
text = self.driver.find_element(By.CSS_SELECTOR, "#signUpForm > div > div:nth-child(2) > div").text
assert text == "用户名不能为空"
register = ForumRegister()
# register.ForumRegistBySuc()
register.ForumRegistByFail()
3.5 论坛首页自动化测试
创建一个用于执行论坛注册页面自动化测试的文件(文件名为:ForumLIst.py)
在文件中创建一个类(ForumList)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试登录成功进入论坛首页和登录失败的函数(测试用例)
在进入到论坛首页后需要检查页面中的元素是否存在:如搜索框,用户的昵称,发布帖子按钮,帖子分类框,首页的标题等等
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛列表页的自动化测试用例
class ForumList:
url = ""
driver = ""
def __init__(self):
self.driver = ForumDriver.driver
self.url = "http://127.0.0.1:9580/index.html"
self.driver.get(self.url)
# 测试登陆成功后的论坛首页的测试用例
def ForumListByLogin(self):
# 检查论坛首页元素是否齐全
# 搜索框
self.driver.find_element(By.CSS_SELECTOR, "body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.d-none.d-md-flex.me-3 > div > form > div > input")
# 用户的昵称
text = self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname").text
assert text == "oldneez"
# 发布帖子按钮
self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")
# 帖子分类框
self.driver.find_element(By.CSS_SELECTOR, "#navbar-menu > div > div")
# 首页标题
text = self.driver.find_element(By.CSS_SELECTOR, "#article_list_board_title").text
assert text == "首页"
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 在未登陆的情况下访问论坛列表页直接跳转到登录页
def ForumListByNotLogin(self):
self.driver.get("http://127.0.0.1:9580/sign-in.html")
# 屏幕最大化且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
3.6 用户个人中心自动化测试
创建一个用于执行论坛用户个人中心的自动化测试的文件(文件名为:ForumCenter.py)
在文件中创建一个类(ForumCenter)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试登录成功进入论坛首页再从论坛首页进入个人中心和登录失败的函数(测试用例)
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛个人中心自动化测试
class ForumCenter:
url = ""
driver = ""
def __init__(self):
self.driver = ForumDriver.driver
self.driver.find_element(By.CSS_SELECTOR, "#index_nav_nickname").click()
self.driver.find_element(By.CSS_SELECTOR, "#index_user_settings").click()
# self.url = "http://127.0.0.1:9580/index.html"
# self.driver.get(self.url)
# 成功登录后跳转到个人中心进行测试
def FornumCenterByLogin(self):
# 判断是否在个人中心界面且昵称是否正确
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-header.d-print-none > div > div > div > h2").text
assert text == "用户中心"
nickname = self.driver.find_element(By.CSS_SELECTOR, "#settings_nickname").text
assert nickname == "oldneez"
# 查看功能是否齐全
# 修改头像
self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div.row.align-items-center > div:nth-child(2) > a")
# 昵称
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(4)").text
assert text == "昵称"
# 邮箱地址
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(7)").text
assert text == "邮箱地址"
# 电话号码
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(10)").text
assert text == "电话号码"
# 修改密码
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(13)").text
assert text == "修改密码"
# 个人简介
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > h3:nth-child(16)").text
assert text == "个人简介"
# 放大屏幕且截屏
self.driver.maximize_window()
ForumDriver.GetScreenShot()
# 未登录状态下直接跳转到登录页
def ForumCenterByNotLogin(self):
self.driver.get("http://127.0.0.1:9580/sign-in.html")
3.7 帖子详情页自动化测试
创建一个用于执行论坛帖子详情页的自动化测试的文件(文件名为:ForumDetail.py)
在文件中创建一个类(ForumDetail)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试登录成功后进入帖子详情页和登录失败的函数(测试用例)
需要注意帖子评论输入框是外部软件,无法进行交互。并且在进行自动化测试时输入框输入不了文字(BUG)
import time
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.remote.webelement import WebElement
from webdriver_manager.core import driver
from common.Utils import ForumDriver
# 论坛帖子详情页自动化测试
class ForumDetail:
driver = ""
url = ""
def __init__(self):
self.driver = ForumDriver.driver
# self.url = "http://127.0.0.1:9580/index.html"
# self.driver.get(self.url)
# 成功登录后帖子详情页的测试用例
def ForumDetailByLogin(self):
# 选择查看Java分类中的第一个帖子
self.driver.find_element(By.CSS_SELECTOR, "#topBoardList > li.nav-item.active > a").click()
self.driver.find_element(By.CSS_SELECTOR, "#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong").click()
# 检查详情页的元素
# 作者
self.driver.find_element(By.CSS_SELECTOR, "#article_details_author_name")
# 帖子标题
self.driver.find_element(By.CSS_SELECTOR, "#details_article_content_title")
# 帖子发布时间
self.driver.find_element(By.CSS_SELECTOR, "#details_article_createTime")
# 帖子浏览量
self.driver.find_element(By.CSS_SELECTOR, "#details_article_visitCount")
# 帖子内容
self.driver.find_element(By.CSS_SELECTOR, "#details_article_content > p")
# 点赞按钮
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_like_count")
# 评论区
self.driver.find_element(By.CSS_SELECTOR, "#details_reply_area")
# 回复按钮
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_article_reply")
# 测试功能是否正常
####################################################################################################
# 点赞功能
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_like_count").click()
time.sleep(1)
# 截图
ForumDriver.GetScreenShot()
# 点赞成功会有提示框
self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div")
####################################################################################################
# 发私信功能
# 点击发私信按钮
self.driver.find_element(By.CSS_SELECTOR, "#btn_details_send_message").click()
time.sleep(1)
# 点击发送框并输入文字,输入完成后点击发送按钮
self.driver.find_element(By.CSS_SELECTOR, "#index_message_receive_content").click()
self.driver.find_element(By.CSS_SELECTOR, "#index_message_receive_content").send_keys("hello")
self.driver.find_element(By.CSS_SELECTOR, "#btn_index_send_message").click()
time.sleep(1)
# 截图
ForumDriver.GetScreenShot()
# 判断是否发送成功
text = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text == "成功"
####################################################################################################
# # 帖子评论区能否正常使用
# 由于输入框是第三方软件,有时会失灵造成无法输入的后果(BUG)
element = self.driver.find_element(By.CSS_SELECTOR, "#article_details_reply > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div")
self.driver.execute_script("arguments[0].click();", element)
element.send_keys("111")
title_label = self.driver.find_element(By.CSS_SELECTOR, "#details_article_title")
time.sleep(1)
# tab键跳转到输入内容的位置
title_label.send_keys(Keys.TAB) # 重点
ele = self.driver.switch_to.active_element
ele.send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#details_btn_article_reply").click()
self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div").click()
time.sleep(1)
# 截图
ForumDriver.GetScreenShot()
text = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text == "提示"
text = self.driver.find_element(By.CSS_SELECTOR, "#details_article_reply_content_442 > p").text
assert text == "111"
# 未登录后在论坛的测试用例
def ForumDetailByNotLogin(self):
self.driver.get("http://127.0.0.1:9580/sign-in.html")
# detail = ForumDetail()
# detail.ForumDetailByLogin()
在进行自动化测试时打开的帖子详情页与不进行自动化测试时打开的帖子详情页是不一样的
3.8 我的帖子页面
创建一个用于执行我的帖子页面的自动化测试的文件(文件名为:ForumMyPost.py)
在文件中创建一个类(ForumMyPost)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试登录成功后进入我的帖子页面和登录失败的函数(测试用例)
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 我的帖子自动化测试
class ForumMyPost:
driver = ""
url = ""
def __init__(self):
self.driver = ForumDriver.driver
self.url = "http://127.0.0.1:9580/index.html"
self.driver.get(self.url)
self.driver.find_element(By.CSS_SELECTOR, "body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div.nav-item.dropdown > a").click()
self.driver.find_element(By.CSS_SELECTOR, "#index_user_profile").click()
# 成功登录时的自动化测试
def ForumPostByLogin(self):
# 检查页面元素是否齐全
# 昵称
self.driver.find_element(By.CSS_SELECTOR, "#profile_nickname")
# 帖子数量
self.driver.find_element(By.CSS_SELECTOR, "##profile_articleCount")
# 邮箱地址
self.driver.find_element(By.CSS_SELECTOR, "##profile_email")
# 注册日期
self.driver.find_element(By.CSS_SELECTOR, "#profile_createTime")
# 未登录的自动化测试
def ForumPostByNotLogin(self):
self.driver.get("http://127.0.0.1:9580/sign-in.html")
3.9 帖子编辑页
创建一个用于执行帖子编辑页面的自动化测试的文件(文件名为:ForumEdit.py)
在文件中创建一个类(ForumEdit)用于在里面实现自动化测试的接口
引入Until.py文件和一些需要用到的包和依赖
在类里面分别编写两个用于测试登录成功后进入帖子编辑页面和登录失败的函数(测试用例)
需要注意帖子内容输入框是外部软件,无法进行交互。并且在进行自动化测试时输入框输入不了文字(BUG)
帖子发布板块选择默认是Java
import time
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from common.Utils import ForumDriver
# 论坛帖子编辑页的自动化测试
class ForumEdit:
url = ""
driver = ""
def __init__(self):
self.driver = ForumDriver.driver
self.url = "http://127.0.0.1:9580/index.html"
self.driver.get(self.url)
# 登录成功时的自动化测试
def ForumEditByLogin(self):
# 在论坛列表页点击发布帖子按钮进入帖子编辑页
self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post").click()
time.sleep(5)
# 元素检查
# 标题是否正确
text = self.driver.find_element(By.CSS_SELECTOR, "#bit-forum-content > div.page-header.d-print-none > div > div > div > h2").text
assert text == "发新贴"
# 板块选项框是否存在
self.driver.find_element(By.CSS_SELECTOR, "#article_post_borad")
# 标题输入框是否存在
self.driver.find_element(By.CSS_SELECTOR, "#article_post_title")
# 内容输入框是否存在
self.driver.find_element(By.CSS_SELECTOR, "#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre")
# 发布按钮是否存在
self.driver.find_element(By.CSS_SELECTOR, "#article_post_submit")
# 功能测试
# 用例一: 正常发布帖子
# 板块默认是java分类, 但由于内容输入框是外部软件无法进行交互
# (BUG):在进行自动化测试时,外部软件输入框在当前页面是无法输入文本
# 输入标题
# self.driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys("111")
# 使用Tab键跳转到内容输入框
# element = self.driver.find_element(By.CSS_SELECTOR, "#article_post_title")
# element.send_keys("111")
# element = self.driver.find_element(By.CSS_SELECTOR, "#article_post_title")
# element.send_keys(Keys.TAB)
# ele = self.driver.switch_to.active_element
#
# element.send_keys("111")
#
# # 点击发送按钮
# self.driver.find_element(By.CSS_SELECTOR, "#article_post_submit").click()
###############################################################################################
# 用例二: 异常登录: 不输入标题和内容,点击发送按钮,会提示请输入帖子标题
self.driver.find_element(By.CSS_SELECTOR, "#article_post_submit").click()
text = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text == "提示"
###############################################################################################
# 用例三: 异常登录: 不输入内容,点击发送按钮,会提示请输入帖子内容
self.driver.find_element(By.CSS_SELECTOR, "#article_post_title").send_keys("111")
self.driver.find_element(By.CSS_SELECTOR, "#article_post_submit").click()
text = self.driver.find_element(By.CSS_SELECTOR, "body > div.jq-toast-wrap.bottom-right > div > h2").text
assert text == "提示"
# 未登录
# 自动跳转到登录页
def ForumEditByNotLogin(self):
self.driver.get("http://127.0.0.1:9580/sign-in.html")
五、项目BUG
1、板块分类显示不全
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版
但是在帖子编辑页中的板块选择却全部展示出来
2 、 搜索框不能使用
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版
在搜索框输入对应帖子的关键字并进行搜索
结果却只是跳转到论坛首页。
3 、文本输入框在进行自动化测试时无法输入文字
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版
在帖子详情页中留言和帖子编辑页中输入帖子内容的输入框都是外部软件,但是在进行自动化测试时却无法输入文本。
帖子详情页:
帖子编辑页面:
4 、无论在哪个页面点击回退按钮都跳转到登录页而不是跳转到上一级页面
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版
在帖子编辑页想要跳转到上一级页面(论坛首页)
点击回退按钮
跳转到的却是登陆页面
5 、在个人中心修改密码,显示密码功能使用不了
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版
6 、在个人中心修改密码,原密码与新原密码一致也可以进行修改
出现问题的浏览器版本:Chrome浏览器134.0.6998.166(正式版本) (64 位)
出现问题的环境:Windows家庭版