好口碑自适应网站建设个人做外贸怎样起步
一、项目介绍
本项目旨在通过 Selenium 自动化测试工具对某论坛系统进行全面测试,以确保其功能的完整性和稳定性。测试范围涵盖用户注册登录、发帖回帖、权限管理等核心功能。使用 Selenium WebDriver 模拟用户操作,结合 Python 编写测试脚本,实现对论坛各模块的自动化测试
二、项目测试
2.1思维导图
2.2测试用例
展示部分测试用例
(1)登陆测试
正常登录
登陆结果
登陆成功
异常登录
登陆结果
登陆失败
(2)注册测试
正常注册
注册成功
异常注册
注册失败
(3) 功能栏测试
搜索功能
可以看到分类栏缺少文字,这是一个bug
搜索结果
搜索不了对应内容,搜索出现了Bug
消息查看及回复
消息查看
消息回复
回复结果
(4)论坛主页测试
主页面点击帖子
进入帖子详情页
(5)个人帖子集合页面测试
点击帖子
进入帖子详情页
(6)个人中心功能测试
正常传输头像结果
头像并未改变,发现bug
修改邮箱、电话结果
邮箱和电话都不是标准格式,但依旧可修改,发现bug
(7)发布帖子测试
正常发布
发布成功
异常发布
发布失败
(8)帖子详情页测试
点赞、发评论
可以看到评论信息为空(纯空白字符),这是不好的,测试为bug
(9)退出测试
点击退出
退出成功
三、测试代码
3.1创建驱动类
import datetime
import os.path
import sysfrom selenium import webdriver
from selenium.webdriver.ie.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManagerclass Driver:driver=''options=''def __init__(self):self.options=webdriver.EdgeOptions()self.options.page_load_strategy="normal"self.driver=webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()),options=self.options)self.driver.implicitly_wait(10)def photo(self):dirname=datetime.datetime.now().strftime("%Y-%m-%d")if not os.path.exists("../photo/"+dirname):os.mkdir("../photo/"+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("../photo/"+dirname+"/"+filename)
MDriver=Driver()
3.2登陆测试
(1)基本功能
from selenium.webdriver.common.by import Byfrom Driver.Driver import MDriverclass LogInFace:driver=''alert=''url=''def __init__(self):self.driver=MDriver.driverself.url="http://127.0.0.1:9580/sign-in.html"# 进入登陆界面def Come(self):self.driver.get(self.url)# 检测界面元素def QFind(self,str):self.driver.find_element(By.CSS_SELECTOR,str)def Face(self):# 检测图标self.QFind("body > div.page.page-center > div > div > div:nth-child(1) > div > div.text-center.mb-4 > img")# 检测用户登录文字self.QFind("body > div.page.page-center > div > div > div:nth-child(1) > div > div.card.card-md > div > h2")# 检测用户名、输入框、提示灯等登陆元素self.QFind("#signInForm > div.mb-3 > label")self.QFind("#username")self.QFind("#signInForm > div.mb-2 > label")self.QFind("#password")# 检测查看密码按钮self.QFind("#password_a > svg")# 检测登陆按钮self.QFind("#submit")# 检测注册按钮self.QFind("body > div.page.page-center > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a")# 检测图画self.QFind("body > div.page.page-center > div > div > div.col-lg.d-none.d-lg-block > img")# 输入用户名def LogInScanfName(self,name):self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys(name)# 输入密码def LogInScanfPass(self,Pass):self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys(Pass)# 清空用户名def DeleteName(self):self.driver.find_element(By.CSS_SELECTOR,"#username").clear()# 清空密码def DeletePass(self):self.driver.find_element(By.CSS_SELECTOR,"#password").clear()# 点击登录def LogInTake(self):self.driver.find_element(By.CSS_SELECTOR,"#submit").click()# 跳转到注册界面def LogInGoToRego(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.page.page-center > div > div > div:nth-child(1) > div > div.text-center.text-muted.mt-3 > a").click()
(2)测试类封装
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom part import LogInFace
from Driver.Driver import MDriver
class test1:Log=''def __init__(self):self.Log=LogInFace.LogInFace()# 检测界面元素def LogFace(self):self.Log.Come()self.Log.Face()MDriver.photo()# 登陆函数def LogIn(self,name,Pass):self.Log.LogInScanfName(name)self.Log.LogInScanfPass(Pass)self.Log.LogInTake()MDriver.photo()# 清空函数def Delete(self):self.Log.DeleteName()self.Log.DeletePass()# 正常登陆def LogInSccess(self):self.LogIn("zhang","12345")WebDriverWait(MDriver.driver,3).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"#article_list_board_title")))MDriver.photo()# 可能正常登陆def LogInMaybeSccess(self):# 正确的用户名后有空白字符,正确的密码self.LogIn("zhang ", "12345")WebDriverWait(MDriver.driver,3).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"#article_list_board_title")))MDriver.photo()# 异常登陆def LogInMaybeFalse(self):# 正确的用户名,错误的密码self.LogIn("zhangsan","12345678")self.Delete()# 正确的用户名,无密码self.LogIn("zhangsan","")self.Delete()# 错误的用户名,正确的密码self.LogIn("zhan","1234")self.Delete()# 错误的用户名,错误的密码self.LogIn("zhan","1234567")self.Delete()# 错误的用户名,无密码self.LogIn("zhan","")self.Delete()# 无用户名,正确的密码self.LogIn("","1234")self.Delete()# 无用户名,错误的密码self.LogIn("","123")self.Delete()# 无用户名,无密码self.LogIn("","")self.Delete()# 正确的用户名后有空白字符,无密码self.LogIn("zhangsan ","")self.Delete()# 正确的用户名后有空白字符,错误的密码self.LogIn("zhangsan ", "1234567")self.Delete()
(3)测试实现
from Driver.Driver import MDriver
from test import onetestclass
def test():# 检测登陆界面onetestclass.test1().LogFace()# 异常登录onetestclass.test1().LogInMaybeFalse()# 可能正常登陆onetestclass.test1().LogInMaybeSccess()MDriver.driver.back()onetestclass.test1().Delete()# 正常登陆onetestclass.test1().LogInSccess()
3.注册测试
(1)基本功能
from selenium.webdriver.common.by import Byfrom Driver.Driver import MDriver
from part import LogInFace
class RegoFace:driver=''def __init__(self):self.driver=MDriver.driver# 进入界面def Come(self):LogInFace.LogInFace().Come()LogInFace.LogInFace().LogInGoToRego()# 辅助写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 检测界面元素def RegoFace(self):# 检测图标self.QFind("body > div.page.page-center > div > div.text-center.mb-4 > img")# 检测用户名输入框self.QFind("#username")# 检测昵称输入框self.QFind("#nickname")# 检测密码输入框self.QFind("#password")# 检测显示密码按钮self.QFind("#password_a > svg")# 检测去让人密码输入框self.QFind("#passwordRepeat")# 检测同意条款方框self.QFind("#policy")# 检测条框文字链接self.QFind("#signUpForm > div > div:nth-child(6) > label > span > a")# 检测注册按钮self.QFind("#submit")# 检测登录入口self.QFind("body > div.page.page-center > div > div.text-center.text-muted.mt-3 > a")# 检测文字及提示*号self.QFind("#signUpForm > div > div:nth-child(2) > label")self.QFind("#signUpForm > div > div:nth-child(3) > label")self.QFind("#signUpForm > div > div:nth-child(4) > label")self.QFind("#signUpForm > div > div:nth-child(5) > label")MDriver.photo()# 输入用户名def RegoScanfName(self,name):self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys(name)# 输入昵称def RegoScanfFName(self,fname):self.driver.find_element(By.CSS_SELECTOR,"#nickname").send_keys(fname)# 输入密码def RegoScanfPass(self,Pass):self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys(Pass)# 输入确认密码def RegoScanfAgainPass(self,Pass):self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").send_keys(Pass)# 清空用户名输入框def RegoDeleteName(self):self.driver.find_element(By.CSS_SELECTOR,"#username").clear()# 清空昵称输入框def RegoDeleteFName(self):self.driver.find_element(By.CSS_SELECTOR,"#nickname").clear()# 清空密码输入框def RegoDeletePass(self):self.driver.find_element(By.CSS_SELECTOR,"#password").clear()# 清空确认密码输入框def RegoDeleteAgianPass(self):self.driver.find_element(By.CSS_SELECTOR,"#passwordRepeat").clear()# 勾选确认框def RegoCheckBox(self):self.driver.find_element(By.CSS_SELECTOR,"#policy").click()# 点及文字链接def RegoClickWordLink(self):self.driver.find_element(By.CSS_SELECTOR,"#signUpForm > div > div:nth-child(6) > label > span > a").click()# 点击注册按钮def Rego(self):self.driver.find_element(By.CSS_SELECTOR,"#submit").click()# 点击登陆按钮def RegoGotoLogIn(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.page.page-center > div > div.text-center.text-muted.mt-3 > a").click()
(2)测试类封装
from Driver.Driver import MDriver
from part import RegoFace
class test2:Rego=''def __init__(self):self.Rego=RegoFace.RegoFace()# 注册界面def RegoFace(self):self.Rego.Come()self.Rego.RegoFace()# 方便写代码def QScanf(self,name,fname,Pass,rPass):self.Rego.RegoScanfName(name)self.Rego.RegoScanfFName(fname)self.Rego.RegoScanfPass(Pass)self.Rego.RegoScanfAgainPass(rPass)# 清空输入框def QDelete(self):self.Rego.RegoDeleteName()self.Rego.RegoDeleteFName()self.Rego.RegoDeletePass()self.Rego.RegoDeleteAgianPass()# 正常注册def RegoSccess(self):self.QScanf("zhan","战","12345","12345")self.Rego.RegoCheckBox()self.Rego.Rego()MDriver.photo()# 异常注册def RegoFalse(self):# 填写用户名,填写昵称,填写密码,不填写确认密码,不勾选同意方案方框self.QScanf("zhan","战","","12345")self.Rego.Rego()MDriver.photo()self.QDelete()# 填写用户名,不填写昵称,不填写密码,填写确认密码,勾选同意方案方框self.QScanf("zhan","","","12345")self.Rego.RegoCheckBox()self.Rego.Rego()self.Rego.RegoCheckBox()MDriver.photo()self.QDelete()# 不填写用户名,填写昵称,不填写密码,不填写确认密码,勾选同意方案方框self.QScanf("","战","","")self.Rego.RegoCheckBox()self.Rego.Rego()self.Rego.RegoCheckBox()MDriver.photo()self.QDelete()# 不填写用户名,不填写昵称,填写密码,填写确认密码,不勾选同意方案方框self.QScanf("","","12345","12345")self.Rego.Rego()MDriver.photo()self.QDelete()# 不填写用户名,填写昵称,填写密码,填写确认密码,勾选同意方案方框self.QScanf("","战","12345","12345")self.Rego.RegoCheckBox()self.Rego.Rego()self.Rego.RegoCheckBox()MDriver.photo()self.QDelete()# 填写用户名,不填写昵称,不填写密码,不填写确认密码,勾选同意方案方框self.QScanf("zhan","","","")self.Rego.RegoCheckBox()self.Rego.Rego()self.Rego.RegoCheckBox()MDriver.photo()self.QDelete()# 不填写用户名,不填写昵称,不填写密码,不填写确认密码,不勾选同意方案方框self.QScanf("","","","")self.Rego.Rego()MDriver.photo()self.QDelete()# 填写用户名,填写昵称,填写密码,填写确认密码但与密码不相同,勾选同意方案方框self.QScanf("zhan","战","12345","12344355")self.Rego.RegoCheckBox()self.Rego.Rego()self.Rego.RegoCheckBox()MDriver.photo()self.QDelete()# 查看条款def RegoCheckWordLink(self):self.Rego.RegoClickWordLink()MDriver.photo()
(3)测试实现
from test import twotestclass
def test():# 检测界面twotestclass.test2().RegoFace()# 非正常注册twotestclass.test2().RegoFalse()# 点击查看条款twotestclass.test2().RegoCheckWordLink()# 正常注册twotestclass.test2().RegoSccess()
3.4功能栏测试
(1)基本功能
from selenium.webdriver import Keys
from selenium.webdriver.common.by import Byfrom Driver.Driver import MDriver
from part import LogInFace
class BarFace:driver=''def __init__(self):self.driver=MDriver.driver# 进入首页查看功能栏def Come(self):LogInFace.LogInFace().Come()LogInFace.LogInFace().LogInScanfName("zhang")LogInFace.LogInFace().LogInScanfPass("12345")LogInFace.LogInFace().LogInTake()# 方便写代码def Qfind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 检测界面元素def BarFace(self):# 检测图标self.Qfind("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > h1 > a > img")# 检测搜素框self.Qfind("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")# 检测夜间模式self.Qfind("body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > a.nav-link.px-0.hide-theme-dark > svg")# 检测消息self.driver.find_element(By.CSS_SELECTOR,"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a").click()# 检测消息信息self.Qfind("#index_div_message_list > div:nth-child(1) > div > div.col.text-truncate > a")# 检测X号self.Qfind("#index_message_offcanvasEnd > div.offcanvas-header > button")# 检测提示灯self.Qfind("#index_div_message_list > div:nth-child(1) > div > div:nth-child(1) > span")self.CloseBarMessage()# 检测头像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").click()# 头像元素self.Qfind("#index_user_profile")self.Qfind("#index_user_settings")self.Qfind("#index_user_logout")# 分类栏元素self.Qfind("#nav_board_index > a")self.Qfind("#topBoardList > li:nth-child(2) > a")self.Qfind("#topBoardList > li:nth-child(3) > a")self.Qfind("#topBoardList > li:nth-child(5) > a")# 搜索功能def BarSearch(self,name):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").send_keys(name)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").send_keys(Keys.ENTER)# 夜间模式def BarNight(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > a.nav-link.px-0.hide-theme-dark").click()# 查看消息def BarLookMessage(self):self.driver.find_element(By.CSS_SELECTOR,"body > div.page > header.navbar.navbar-expand-md.navbar-light.d-print-none > div > div > div:nth-child(2) > div > a").click()# 回复消息def BarReplayMessage(self,name):self.driver.find_element(By.CSS_SELECTOR,"#index_div_message_list > div:nth-child(2) > div > div.col.text-truncate > a").click()self.driver.find_element(By.CSS_SELECTOR,"#btn_index_message_reply > svg").click()self.driver.find_element(By.CSS_SELECTOR,"#index_message_reply_receive_content").send_keys(name)self.driver.find_element(By.CSS_SELECTOR,"#btn_index_send_message_reply").click()# 关闭信息列表def CloseBarMessage(self):self.driver.find_element(By.CSS_SELECTOR,"#index_message_offcanvasEnd > div.offcanvas-header > button").click()# 点击头像def BarHead(self):self.driver.find_element(By.CSS_SELECTOR,"#index_nav_avatar").click()# 进入个人帖子界面def BarGotoPersonalPost(self):self.driver.find_element(By.CSS_SELECTOR,"#index_user_profile").click()# 进入个人中心界面def BarGotoPersonalCenter(self):self.driver.find_element(By.CSS_SELECTOR,"#index_user_settings").click()# 退出登陆def BarLogOut(self):self.driver.find_element(By.CSS_SELECTOR,"#index_user_logout").click()# 进入首页def BarHome(self):self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a").click()# 进入Java板块def BarGoJava(self):self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(2) > a").click()# 进入C++板块def BarGoCpp(self):self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(3) > a").click()# 进入MySQL板块def BarGoMySQL(self):self.driver.find_element(By.CSS_SELECTOR,"#topBoardList > li:nth-child(5) > a").click()
(2)测试类封装
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom Driver.Driver import MDriver
from part import BarFaceclass test3:Bar=''def __init__(self):self.Bar=BarFace.BarFace()# 检测功能栏元素def BarFace(self):self.Bar.Come()self.Bar.BarFace()MDriver.photo()# 测试搜索功能def BarSearch(self,name):self.Bar.BarSearch(name)WebDriverWait(MDriver.driver,3).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"#article_list_board_title")))MDriver.photo()# 测试夜间模式def BarNight(self):self.Bar.BarNight()MDriver.photo()# 查看消息def BarLookMessage(self):self.Bar.BarLookMessage()# 回复消息def BarReplayMessage(self,name):self.Bar.BarReplayMessage(name)MDriver.photo()# 关闭消息def BarCloseMessage(self):self.Bar.CloseBarMessage()# 分类板块def BarGoHome(self):self.Bar.BarHome()MDriver.photo()def BarGoJava(self):self.Bar.BarGoJava()MDriver.photo()def BarGoCpp(self):self.Bar.BarGoCpp()MDriver.photo()def BarGoMySQL(self):self.Bar.BarGoMySQL()MDriver.photo()# 进入个人帖子板块def BarGotoPersonalPost(self):self.Bar.BarHead()self.Bar.BarGotoPersonalPost()MDriver.photo()# 进入个人中心def BarGotoPersonalCenter(self):self.Bar.BarHead()self.Bar.BarGotoPersonalCenter()MDriver.photo()# 退出登录def BarLogOut(self):self.Bar.BarHead()self.Bar.BarLogOut()MDriver.photo()
(3)测试实现、
from test import threetestclass
def test():# 检测界面threetestclass.test3().BarFace()# 搜索功能threetestclass.test3().BarSearch("1")# 夜间切换模式threetestclass.test3().BarNight()# 查看消息threetestclass.test3().BarLookMessage()# 回复空消息threetestclass.test3().BarReplayMessage("")# 回复春空白字符的消息threetestclass.test3().BarReplayMessage(" ")# 回复正常的消息threetestclass.test3().BarReplayMessage("1234567")# 关闭消息列表threetestclass.test3().BarCloseMessage()# 进入Java版块threetestclass.test3().BarGoJava()# 进入C++版块threetestclass.test3().BarGoCpp()# 进入MySQL版块threetestclass.test3().BarGoMySQL()# 进入个人帖子界面threetestclass.test3().BarGotoPersonalPost()# 返回首页threetestclass.test3().BarGoHome()# 进入个人中心界面threetestclass.test3().BarGotoPersonalCenter()# 返回首页threetestclass.test3().BarGoHome()# 返回登陆界面threetestclass.test3().BarLogOut()
3.5个人帖子集合界面测试
(1)基本功能
from selenium.webdriver.common.by import Byfrom Driver.Driver import MDriver
from part import BarFace
class PersonalPost:driver=''def __init__(self):self.driver=MDriver.driver# 进入个人帖子集合界面def Come(self):BarFace.BarFace().Come()BarFace.BarFace().BarHead()BarFace.BarFace().BarGotoPersonalPost()# 方便写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 检测界面元素def PersonalPostFace(self):# 检测头像self.QFind("#profile_avatar")# 检测姓名self.QFind("#profile_nickname")# 检测发帖数self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div > div.col > div > div:nth-child(1)")# 检测邮箱self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div > div.col > div > div:nth-child(2)")# 检测注册日期self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div > div.col > div > div:nth-child(3)")# 检测个人介绍self.QFind("#bit-forum-content > div.page-body > div > div > div.col-lg-4 > div > div > div > div > h2")self.QFind("#profile_remark")# 检测帖子前的一个图标self.QFind("#profile_article_body > li:nth-child(1) > div.timeline-event-icon.bg-twitter-lt")# 检测帖子标题self.QFind("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-truncate")# 检测帖子发布时间self.QFind("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-muted.mt-2 > div > div.col > ul > li")# 检测帖子观看量self.QFind("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(1)")# 检测帖子点赞量self.QFind("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(2)")# 检测帖子评论量self.QFind("#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(3)")# 打开帖子def PersonalPostOpenPost(self):self.driver.find_element(By.CSS_SELECTOR,"#profile_article_body > li:nth-child(1) > div.card.timeline-event-card > div > div > div > div > div.text-truncate > a > strong").click()
(2)测试类封装
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom part import PersonalPostFace
from Driver.Driver import MDriver
class test4:PersonalPost=''stat=0def __init__(self):self.PersonalPost=PersonalPostFace.PersonalPost()# 检测界面def PersonalPostFace(self):self.PersonalPost.Come()self.stat=self.PersonalPost.PersonalPostFace()MDriver.photo()# 进入帖子def PersonalPostGotoPost(self):self.PersonalPost.PersonalPostOpenPost()WebDriverWait(MDriver.driver,3).until(expected_conditions.presence_of_element_located((By.CSS_SELECTOR,"#bit-forum-content > div.page-body > div > div > div:nth-child(2) > h3")))MDriver.photo()
(3)测试实现
from test import fourtestclass
def test():# 检测界面fourtestclass.test4().PersonalPostFace()# 打开帖子fourtestclass.test4().PersonalPostGotoPost()
3.6个人中心功能测试
(1)基本功能
from selenium.webdriver.common.by import Byfrom Driver.Driver import MDriver
from part import BarFace
class PersonalCenterFace:driver=''def __init__(self):self.driver=MDriver.driver# 进入个人中心def Come(self):BarFace.BarFace().Come()BarFace.BarFace().BarHead()BarFace.BarFace().BarGotoPersonalCenter()self.driver.execute_script("document.body.style.zoom='0.5'")# 方便写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 元素检测def PersonalCenterFace(self):# 用户中心的文字self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2")# 我的账户分栏self.QFind("#bit-forum-content > div.page-body > div > div > div > div.col-3.d-none.d-md-block.border-end > div > div > a")# 姓名self.QFind("#settings_nickname")# 头像self.QFind("#settings_avatar")# 必须填写的提示*号self.QFind("#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div:nth-child(14) > div > div > form > div:nth-child(1) > label")# 修改头像按钮self.QFind("#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")# 昵称输入框及按钮self.QFind("#setting_input_nickname")self.QFind("#setting_submit_nickname")# 邮箱地址输入框及按钮self.QFind("#setting_input_email")self.QFind("#setting_submit_email")# 电话号码输入框及按钮self.QFind("#setting_input_phoneNum")self.QFind("#setting_submit_phoneNum")# 显示密码按钮self.QFind("#bit-forum-content > div.page-body > div > div > div > div.col.d-flex.flex-column > div > div:nth-child(14) > div > div > form > div:nth-child(1) > div > span > a > svg")# 原密码输入框self.QFind("#settings_input_oldPassword")# 新密码输入框self.QFind("#settings_input_newPassword")# 确认密码输入框self.QFind("#settings_input_passwordRepeat")# 确认修改按钮self.QFind("#settings_submit_password")#个人简介输入框及按钮self.QFind("#settings_textarea_remark")self.QFind("#settings_submit_remark")# 输入昵称def PersonalCenterScanfName(self,name):self.driver.find_element(By.CSS_SELECTOR,"#setting_input_nickname").send_keys(name)# 输入邮箱地址def PersonalCenterScanfEmail(self,email):self.driver.find_element(By.CSS_SELECTOR,"#setting_input_email").send_keys(email)# 输入电话号码def PersonalCenterScanfPhone(self,phone):self.driver.find_element(By.CSS_SELECTOR,"#setting_input_phoneNum").send_keys(phone)# 输入原密码def PersonalCenterScanfOldPass(self,oldpass):self.driver.find_element(By.CSS_SELECTOR,"#settings_input_oldPassword").send_keys(oldpass)# 输入新密码def PersonalCenterScanfNewPass(self,newpass):self.driver.find_element(By.CSS_SELECTOR,"#settings_input_newPassword").send_keys(newpass)# 输入确认新密码def PersonalCenterScanfAgainPass(self,againpass):self.driver.find_element(By.CSS_SELECTOR,"#settings_input_passwordRepeat").send_keys(againpass)# 输入个人简介def PersonalCenterScanfShot(self,shot):self.driver.find_element(By.CSS_SELECTOR,"#settings_textarea_remark").send_keys(shot)# 清空昵称输入框def PersonalCenterDeleteName(self):self.driver.find_element(By.CSS_SELECTOR,"#setting_input_nickname").clear()# 清空邮箱输入框def PersonalCenterDeleteEmail(self):self.driver.find_element(By.CSS_SELECTOR, "#setting_input_email").clear()# 清空电话号码输入框def PersonalCenterDeletePhone(self):self.driver.find_element(By.CSS_SELECTOR, "#setting_input_phoneNum").clear()# 清空原密码输入框def PersonalCenterDeleteOldPass(self):self.driver.find_element(By.CSS_SELECTOR, "#settings_input_oldPassword").clear()# 清空新密码输入框def PersonalCenterDeleteNewPass(self):self.driver.find_element(By.CSS_SELECTOR, "#settings_input_newPassword").clear()# 清空确认密码输入框def PersonalCenterDeleteAgainPass(self):self.driver.find_element(By.CSS_SELECTOR, "#settings_input_passwordRepeat").clear()# 清空个人简介def PersonalCenterDeleteShot(self):self.driver.find_element(By.CSS_SELECTOR, "#settings_textarea_remark").clear()# 点击修改昵称def PersonalCenterChangeName(self):self.driver.find_element(By.CSS_SELECTOR,"#setting_submit_nickname").click()# 点击修改邮箱def PersonalCenterChangeEmail(self):self.driver.find_element(By.CSS_SELECTOR,"#setting_submit_email").click()# 点击修改电话def PersonalCenterChangePhone(self):self.driver.find_element(By.CSS_SELECTOR,"#setting_submit_phoneNum").click()# 点击修改密码def PersonalCenterChangePass(self):self.driver.find_element(By.CSS_SELECTOR,"#settings_submit_password").click()# 点击修改个人简介def PersonalCenterChangeShot(self):self.driver.find_element(By.CSS_SELECTOR,"#settings_submit_remark").click()
(2)测试类封装
from Driver.Driver import MDriver
from part import PersonalCenterFace
class test5:Center=''def __init__(self):self.Center=PersonalCenterFace.PersonalCenterFace()# 检测界面def PersonalCenterFace(self):self.Center.Come()self.Center.PersonalCenterFace()MDriver.photo()# 修改昵称def PersonalCenterChageName(self,name):self.Center.PersonalCenterDeleteName()self.Center.PersonalCenterScanfName(name)self.Center.PersonalCenterChangeName()MDriver.photo()# 修改邮箱def PersonalCenterChageEmail(self,email):self.Center.PersonalCenterDeleteEmail()self.Center.PersonalCenterScanfEmail(email)self.Center.PersonalCenterChangeEmail()MDriver.photo()# 修改电话号码def PersonalCenterChagePhone(self,phone):self.Center.PersonalCenterDeletePhone()self.Center.PersonalCenterScanfPhone(phone)self.Center.PersonalCenterChangePhone()MDriver.photo()# 修改密码def PersonalCenterChagePass(self,old,new,re):self.Center.PersonalCenterDeleteOldPass()self.Center.PersonalCenterDeleteNewPass()self.Center.PersonalCenterDeleteAgainPass()self.Center.PersonalCenterScanfOldPass(old)self.Center.PersonalCenterScanfNewPass(new)self.Center.PersonalCenterScanfAgainPass(re)self.Center.PersonalCenterChangePass()MDriver.photo()# 修改个人简介def PersonalCenterChageShot(self,shot):self.Center.PersonalCenterDeleteShot()self.Center.PersonalCenterScanfShot(shot)self.Center.PersonalCenterChangeShot()MDriver.photo()
(3)测试实现
from test import fivetestclass
def test():# 检测界面元素fivetestclass.test5().PersonalCenterFace()# 修改昵称# 什么也不输入fivetestclass.test5().PersonalCenterChageName("")# 输入纯空白字符fivetestclass.test5().PersonalCenterChageName(" ")# 输入原昵称fivetestclass.test5().PersonalCenterChageName("hhhh")# 输入新昵称fivetestclass.test5().PersonalCenterChageName("zhangzhangsan")# 修改邮箱# 什么也不输入fivetestclass.test5().PersonalCenterChageEmail("")# 输入纯空白字符fivetestclass.test5().PersonalCenterChageEmail(" ")# 输入原邮箱fivetestclass.test5().PersonalCenterChageEmail("3456544567qq.com")# 输入非邮箱格式fivetestclass.test5().PersonalCenterChageEmail("得完其25")# 输入新邮箱fivetestclass.test5().PersonalCenterChageEmail("12345qq.com")# 修改电话号# 什么也不输入fivetestclass.test5().PersonalCenterChagePhone("")# 输入纯空白字符fivetestclass.test5().PersonalCenterChagePhone(" ")# 输入原电话号fivetestclass.test5().PersonalCenterChagePhone("15683759385")# 输入非电话号格式fivetestclass.test5().PersonalCenterChagePhone("123456709876543")# 输入新电话号fivetestclass.test5().PersonalCenterChagePhone("15939603056")# 修改个人简介# 什么也不输入fivetestclass.test5().PersonalCenterChageShot("")# 输入纯空白字符fivetestclass.test5().PersonalCenterChageShot(" ")# 输入原简介内容fivetestclass.test5().PersonalCenterChageShot("对对对")# 输入新内容fivetestclass.test5().PersonalCenterChageShot("怼怼怼")# 修改密码# 原密码错误,新密码与原密码相同fivetestclass.test5().PersonalCenterChagePass("12","12345","12345")# 原密码错误,新密码与原密码不同fivetestclass.test5().PersonalCenterChagePass("12","12345","1234")# 原密码正确,新密码与原密码相同# fivetestclass.test5().PersonalCenterChagePass("1234","1234","1234")# 原密码正确,新密码与原密码不同,新密码与确认密码不同fivetestclass.test5().PersonalCenterChagePass("1234","12345","123")# 原密码正确,新密码与原密码不同,新密码与确认密码相同fivetestclass.test5().PersonalCenterChagePass("1234","12345","12345")
3.7退出功能测试
(1)基本功能
from part import BarFaceclass LogOut:def Come(self):BarFace.BarFace().Come()BarFace.BarFace().BarHead()def Out(self):BarFace.BarFace().BarLogOut()
(2)测试类封装
from part import LogOut
from Driver.Driver import MDriver
class test6:Out=''def __init__(self):self.Out=LogOut.LogOut()def LogOut(self):self.Out.Come()self.Out.Out()MDriver.photo()
(3)测试实现
from test import sixtestclass
def test():sixtestclass.test6().LogOut()
3.8发布帖子测试
(1)基本功能
from selenium.webdriver.common.by import Byfrom part import BarFace
from Driver.Driver import MDriver
class SendPost:driver=''def __init__(self):self.driver=MDriver.driver# 进入编辑界面def Come(self):BarFace.BarFace().Come()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()self.driver.execute_script("document.body.style.zoom='0.5'")# 方便写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 界面元素def SendPostFace(self):# 查找板块选择框self.QFind("#article_post_borad")# 查找标题输入框self.QFind("#article_post_title")# 查找写作编辑器self.QFind("#article_post_title")# 查找发布按钮self.QFind("#article_post_submit")# 查找“发新帖”文字self.QFind("#article_post_submit")# 选择Java板块def SendPostChageBlock(self):self.driver.find_element(By.CSS_SELECTOR,"#article_post_borad").click()self.driver.find_element(By.CSS_SELECTOR,"#article_post_borad > option:nth-child(1)").click()# 输入标题def SendPostTitle(self,title):self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").send_keys(title)# 输入内容def SendPostWord(self):self.driver.find_element(By.CSS_SELECTOR,"#edit-article > div.editormd-toolbar > div > ul > li:nth-child(12) > a > i").click()# 点击发布def SendPostPut(self):self.driver.find_element(By.CSS_SELECTOR,"#article_post_submit").click()# 清空标题def SendPostDeleteTitle(self):self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").clear()# 清空标题def SendPostDeleteWord(self):self.driver.find_element(By.CSS_SELECTOR,"#article_post_title").clear()
(2)测试类封装
from part import SendPostFace
from Driver.Driver import MDriver
class test7:Send=''def __init__(self):self.Send=SendPostFace.SendPost()# 界面元素检测def SendPostFace(self):self.Send.Come()self.Send.SendPostFace()MDriver.photo()# 选择Java板块def SendPostChageBlock(self):self.Send.SendPostChageBlock()MDriver.photo()# 标题填写def SendPostTitle(self,title):self.Send.SendPostDeleteTitle()self.Send.SendPostTitle(title)# 内容填写def SendPostWord(self):self.Send.SendPostDeleteWord()self.Send.SendPostWord()# 发布def SendPostPut(self):self.Send.SendPostPut()MDriver.photo()
(3)测试实现
from test import seventestclass
def test():# 检测界面元素seventestclass.test7().SendPostFace()# 选择Java板块seventestclass.test7().SendPostChageBlock()# 发布# 有标题,无内容发布seventestclass.test7().SendPostTitle("1234567")seventestclass.test7().SendPostPut()# 无标题,有内容发布seventestclass.test7().SendPostTitle("")seventestclass.test7().SendPostWord()seventestclass.test7().SendPostPut()# 纯空白标题,有内容发布seventestclass.test7().SendPostTitle(" ")seventestclass.test7().SendPostWord()seventestclass.test7().SendPostPut()# 有标题,有内容发布seventestclass.test7().SendPostTitle("1234567")seventestclass.test7().SendPostWord()seventestclass.test7().SendPostPut()
3.9论坛主页功能测试
(1)基本功能
import timefrom selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWaitfrom Driver.Driver import MDriver
from part import BarFaceclass Froum:driver=''def __init__(self):self.driver=MDriver.driver# 进入论坛主页def Come(self):BarFace.BarFace().Come()# 方便写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 界面元素检测def ForumFace(self):# 发布帖子按钮self.QFind("#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.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a")# 首页文字self.QFind("#article_list_board_title")# 帖子作者要头像self.QFind("#artical-items-body > div:nth-child(1) > div > div.col-auto > span")# 帖子发布者任务图标及姓名self.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.col > ul > li:nth-child(1)")# 帖子时间self.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.col > ul > li:nth-child(2)")# 帖子观看量self.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(1)")# 帖子点赞量self.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(2)")# 帖子评论量self.QFind("#artical-items-body > div:nth-child(1) > div > div.col > div.text-muted.mt-2 > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(3)")# 进入帖子编辑页def ForumGotoSendPost(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()# 进入帖子def ForumOpenPost(self,selector):self.driver.execute_script("arguments[0].scrollIntoView();",self.driver.find_element(By.CSS_SELECTOR,selector))time.sleep(1)self.driver.find_element(By.CSS_SELECTOR,selector).click()# 返回主页def GoHome(self):self.driver.execute_script("arguments[0].scrollIntoView();",self.driver.find_element(By.CSS_SELECTOR,"#nav_board_index > a"))time.sleep(1)BarFace.BarFace().BarHome()
(2)测试类封装
from Driver.Driver import MDriver
from part import ForumFace
class test8:forum=''def __init__(self):self.forum=ForumFace.Froum()# 界面检测def ForumFace(self):self.forum.Come()self.forum.ForumFace()MDriver.photo()# 进入帖子编辑页def ForumGotoSendPost(self):self.forum.ForumGotoSendPost()MDriver.photo()# 进入帖子def ForumOpenPost(self,name):self.forum.ForumOpenPost(name)MDriver.photo()# 返回主页def GoHome(self):self.forum.GoHome()
(3)测试实现
from test import eighttestclass
def test():# 检测界面元素eighttestclass.test8().ForumFace()# 进入帖子编辑页eighttestclass.test8().ForumGotoSendPost()eighttestclass.test8().GoHome()# 进入别人帖子eighttestclass.test8().ForumOpenPost("#artical-items-body > div:nth-child(10) > div > div.col > div.text-truncate > a > strong")eighttestclass.test8().GoHome()# 进入自己帖子eighttestclass.test8().ForumOpenPost("#artical-items-body > div:nth-child(11) > div > div.col > div.text-truncate > a > strong")
3.10帖子详情页功能测试
(1)基本功能
import timefrom selenium.webdriver.common.by import Byfrom Driver.Driver import MDriverclass PostDetail:driver=''def __init__(self):self.driver=MDriver.driver# 方便写代码def QFind(self,name):self.driver.find_element(By.CSS_SELECTOR,name)# 界面元素检测# 共同元素def PostDetailFaceSame(self):self.driver.execute_script("document.body.style.zoom='0.5'")# 标题self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div.row.g-2.align-items-center > div")# 时间、观看量、点赞数、评论数self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(1)")self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(2)")self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(3)")self.QFind("#bit-forum-content > div.page-header.d-print-none > div > div.col-auto.d-none.d-md-inline > ul > li:nth-child(4)")# 头像self.QFind("#article_details_author_avatar")# 作者名self.QFind("#bit-forum-content > div.page-body > div > div > div:nth-child(1) > div.col-3.card > div > h3")# 最新回复self.QFind("#bit-forum-content > div.page-body > div > div > div:nth-child(2)")# 点赞按钮self.QFind("#details_btn_like_count")# 评论# 如果没有评论,检测默认文字time.sleep(0.2)if self.driver.find_element(By.CSS_SELECTOR,"#details_article_replyCount").text=='0':self.QFind("#details_reply_area > p")# 如果有评论else:# 评论者头像self.QFind("#details_reply_area > div:nth-child(1) > div.col-3.card > div > span")# 评论者名字self.QFind("#details_reply_area > div:nth-child(1) > div.col-3.card > div > h3")# 评论者回复内容self.QFind("#details_reply_area > div:nth-child(1) > div.col-9.card.card-lg > div.card-body")# 评论时间self.QFind("#details_reply_area > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto > div > div > ul > li")# 评论编辑器self.QFind("#article_details_reply")# 回复按钮self.QFind("#details_btn_article_reply")# 别人帖子元素def PostDetailFaceOther(self):# 给作者发私信按钮self.QFind("#btn_details_send_message")# 点赞功能def PostDetailLike(self):self.driver.find_element(By.CSS_SELECTOR,"#details_btn_like_count").click()# 给作者发私信def PostDetailSendToAuthor(self,name):self.driver.find_element(By.CSS_SELECTOR,"#btn_details_send_message").click()self.driver.find_element(By.CSS_SELECTOR,"#index_message_receive_content").send_keys(name)time.sleep(1)self.driver.find_element(By.CSS_SELECTOR,"#btn_index_send_message").click()# 发送评论def PostDetailSendComment(self,name):self.driver.execute_script("arguments[0].scrollIntoView();",self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply"))time.sleep(0.5)self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.editormd-toolbar > div > ul > li:nth-child(39) > a > i").click()if name is None:self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply").click()else:self.driver.find_element(By.CSS_SELECTOR,"#article_details_reply > div.editormd-toolbar > div > ul > li:nth-child(4) > a > i").click()self.driver.find_element(By.CSS_SELECTOR,"#details_btn_article_reply").click()
(2)测试类封装
from Driver.Driver import MDriver
from part import PostDetailsFace
from part import BarFace
from part import ForumFace
class test9:Detail=''def __init__(self):self.Detail=PostDetailsFace.PostDetail()# 进入主页def Home(self):BarFace.BarFace().Come()# 检测帖子界面# 别人的帖子界面def PostDetailOther(self,select):BarFace.BarFace().BarHome()ForumFace.Froum().ForumOpenPost(select)self.Detail.PostDetailFaceSame()self.Detail.PostDetailFaceOther()MDriver.photo()# 自己的帖子界面def PostDetailMy(self,select):BarFace.BarFace().BarHome()ForumFace.Froum().ForumOpenPost(select)self.Detail.PostDetailFaceSame()MDriver.photo()# 给文章点赞def PostDetailLike(self):self.Detail.PostDetailLike()# 给别人发私信def PostDetailSendWord(self,name):self.Detail.PostDetailSendToAuthor(name)MDriver.photo()# 发布评论def PostDetailSendComment(self,name):self.Detail.PostDetailSendComment(name)MDriver.photo()
(3)测试实现
from test import ninetestclass
def test():# 进入主页ninetestclass.test9().Home()# 检测自己帖子元素ninetestclass.test9().PostDetailMy("#artical-items-body > div:nth-child(5) > div > div.col > div.text-truncate > a")# 检测别人的帖子元素ninetestclass.test9().PostDetailOther("#artical-items-body > div:nth-child(9) > div > div.col > div.text-truncate > a > strong")# 给文章点赞ninetestclass.test9().PostDetailLike()# 发私信# 内容为空ninetestclass.test9().PostDetailSendWord("")# 内容不为空ninetestclass.test9().PostDetailSendWord("返回")# 发评论# 评论为空ninetestclass.test9().PostDetailSendComment("")# 评论不为空ninetestclass.test9().PostDetailSendComment("***")
四、测试发现的Bug
1.Bug描述:注册界面的条款链接无法跳转
预期效果:点击注册界面的条款链接会跳转到条款说明
实际效果:点击后没有反应
2.Bug描述:登陆后屏幕上方的分类栏缺少分类文字
预期效果:每个分类栏都有对应的分类文字显示
实际效果:部分分类栏没有文字
3、Bug描述:功能栏搜索功能失效
预期效果:搜索指定内容后,下方会显示包括指定搜索元素关键字的帖子
实际效果:搜索后界面不变
4.Bug描述:功能栏的回复消息功能,回复的内容为纯空白字符,依旧可以回复消息
预期效果:回复消息的内容不能为纯空白字符
实际效果:纯空白字符也可以回复
5.Bug描述:个人中心的邮箱信息可以乱填并修改
预期效果:填写邮箱信息时,在填写固定格式时才能修改
实际效果:可以填写任何东西并修改
6.Bug描述:个人中心的电话信息可以乱填并修改
预期效果:填写电话信息时,在填写固定格式时才能修改
实际效果:可以填写任何东西并修改
7.Bug描述:个人中心的修改密码,新旧密码相同时,依旧可以修改成功
预期效果:修改密码时,新旧密码相同无法修改,并出现提醒
实际效果:新旧密码相同时,依旧发生了修改
8.Bug描述:帖子详情页,发送的评论可以是纯空白字符
预期效果:纯空白字符无法发送
实际效果:纯空白字符可以发送
9.Bug描述:在自己的帖子详情页,没有编辑和修改选项
预期效果:在自己的帖子详情页,有编辑和修改选项
实际效果:没有编辑和修改选项
10.Bug描述:多个设备可以同时登陆一个账号
预期效果:多个设备不能同时登陆一个账号,最多存在一个登陆设备
实际效果:多个设备可以同时登陆一个账号
11.Bug描述:上传图片后,头像依旧无法修改
预期效果:上传图片后头像可以修改
实际效果:上传图片后,头像依旧没有修改
五、总结
本次测针对论坛项目设计了多个测试用例,测试用例涵盖范围广、深度深,有效的测试了论坛的基本功能,并发现了一些问题,并将这些问题罗列了出来,方便以后修改。这次的测试为用户今后使用本产品的体验提供了有力保障。