编写自动化测试用例
根据博客网页的基本功能分析并编写测试用例。
根据测试用例编写自动化测试脚本
新建项目
查看相应的库是否包含 settings->python:[项目]
分析封装自动化测试文件整体框架。
Utils
存放测试时需要的前提和公共部分 比如:浏览器驱动对象、屏幕截图,这里用Edge的驱动来对网站进行测试。
创建驱动
from selenium import webdriver
from selenium.webdriver.edge.service import Service
from webdriver_manager.microsoft import EdgeChromiumDriverManager
class Driver:
#类成员driver
driver=""
def __init__(self):
#创建edge配置给driver,这里用基础默认的即可
options = webdriver.EdgeOptions()
#service:表示要选择的浏览器服务,这里用edge的,所以传参用Edge的驱动
self.driver=webdriver.Edge(service = Service(EdgeChromiumDriverManager().install()),options=options)
self.driver.implicitly_wait(2)
由于我们想要实现:所有的其他测试文件里,都只用一个驱动对象来测试,而不创建多个驱动对象(节约空间,方便管理),所以就考虑使用单例模式。
单例模式特点:只有一个对象。所以我们可以创建一个全局变量,后面在其他测试文件中只使用这个全局变量。由于我们会在不同的测试页面进行截图观察,所以需要将屏幕截图的配置在公共区域配置好。
#用上面的Driver类对象创建一个全局变量,让所有的测试都只用这一个驱动对象
BLogDriver=Driver()
创建屏幕截图方法
对于图片文件,我们再开一个文件夹用于存放图片images,里面再通过每天的日期来分类图片,每个图片的名字为时间+调用截图的方法名。
创建images文件夹
创建文件夹名称为:当日时间,年-月-日(如果文件夹已经存在,则不创建)
创建截图图片名称:调用方法-年-月-日-具体时间
整体代码如下:
#屏幕截图方法
def getScreenShoot(self):
#文件夹名程:年-月-日
dirname = datetime.datetime.now().strftime("%Y-%m-%d")
#判断是否存在该文件夹,没有则新建文件夹
if not os.path.exists("../images/"+dirname):
os.mkdir("../images/"+dirname)
#文件名称:调用方法+年-月-日-时间
#sys._getframe().f_back.f_code.co_name 获取调用方法名
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)
注意:在我们输入错误密码或者错误账号等情况时,会出现弹框,在弹框被点击消失前,上述代码是不能实现截图的。
BlogLoginText 博客登录界面测试
初始化driver和url
from common.Utils import BLogDriver
#初始化URL和driver
class BlogLogin:
url=""
driver=""
def __init__(self):
self.url=" http://8.137.19.140:9090/blog_list.html"
self.driver=BLogDriver.driver
self.driver.get(self.url)
成功登录
输入正确的账号和密码,点击登入。登入后通过用户名是否存在来判断是否成功登录。需要先清除账号和密码输入框。
判断网页界面是否有用户名时,有时候会因为程序运行过快,网页未加载完毕,从而导致搜索不到元素,所以加强制等待。测试后发现可以成功运行。
强制等待太浪费时间,修改为显示等待
显示等待需要包含头文件
显示等待代码 :
整体代码为:
#成功登入
def LoginSuccess(self):
self.driver.find_element(By.CSS_SELECTOR, "#username").clear()
self.driver.find_element(By.CSS_SELECTOR, "#password").clear()
self.driver.find_element(By.CSS_SELECTOR,"#username").send_keys("zhangsan")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
#如果成功登录,则可以找到用户名,不会报错。这里因为程序运行太快,会因为找不到元素而报错
# time.sleep(2)
# self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
#改为显示等待来找元素(要包含库),使用visibility_of_element_located要多加一个括号
WebDriverWait(self.driver,3).until(EC.visibility_of_element_located((By.CSS_SELECTOR,"body > div.container > div.left > div > h3")))
#登录成功后返回,继续测试登录失败
失败登录
测试失败登录之前,需要将前面成功登录返回,然后清空输入框内容
因为连续、多次send_keys会在输入框拼接内容,而不是覆盖,所以也需要先clear清除输入框内容。
测试正确账号错误密码
#正确的账号,错误密码
def LoginLoss_1(self):
#先清空输入框内容,再重新输入
self.driver.implicitly_wait(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("12345")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
#判断密码错误弹窗是否出现,需要先等待一下,让网页加载
time.sleep(0.5)
alert=self.driver.switch_to.alert #获取弹窗
text=alert.text
assert text == "密码错误"
alert.accept()
测试错误账号正确密码
#错误的账号,正确密码
def LoginLoss_2(self):
#先清空输入框内容,再重新输入
self.driver.implicitly_wait(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("zhangsa")
self.driver.find_element(By.CSS_SELECTOR,"#password").send_keys("123456")
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
#判断用户名不存在弹窗是否出现,需要先等待一下,让网页加载
time.sleep(0.5)
alert=self.driver.switch_to.alert #获取弹窗
text=alert.text
assert text == "用户不存在"
alert.accept()
测试不输入密码
#正确账号,不输入密码
def LoginLoss_3(self):
#先清空输入框内容,再重新输入
time.sleep(0.5)
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,"#submit").click()
#判断用户名不存在弹窗是否出现,需要先等待一下,让网页加载
time.sleep(1)
alert=self.driver.switch_to.alert #获取弹窗
text=alert.text
assert text == "账号或密码不能为空"
alert.accept()
BLogDriver.getScreenShoot()
BlogLIstTest 博客首页测试
在博客首页中,只去查找元素是否存在,这里需要添加隐式等待,要不然程序运行过快会导致查找不到元素而误报。
from selenium.webdriver.common.by import By
from common.Utils import BLogDriver
class BlogList:
url=""
driver=""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_list.html"
self.driver= BLogDriver.driver
self.driver.get(self.url)
#成功登录后测试博客主页
def BlogListTestSuc(self):
self.driver.implicitly_wait(2) #添加隐式等待
#查找博客标题
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.title")
#查找博客时间
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.date")
#查找博客大纲
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > div.desc")
#查找博客查看按钮
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div:nth-child(1) > a")
#查找个人信息(用户名)
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
BLogDriver.getScreenShoot()
后续的测试都在RunTest中进行测试
BlogDetailTest 博客详情页测试
from selenium.webdriver.common.by import By
from common.Utils import BLogDriver
class BlogDetail:
url=""
driver=""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_detail.html?blogId=3998"
self.driver=BLogDriver.driver
self.driver.get(self.url)
#测试博客详情页
def DetailTestSuc(self):
self.driver.implicitly_wait(2)
#查找标题
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.title")
#查找时间
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.right > div > div.date")
#查找大纲
self.driver.find_element(By.CSS_SELECTOR,"#h2-u5728u8FD9u91CCu5199u4E0Bu4E00u7BC7u535Au5BA2")
#查找具体内容
self.driver.find_element(By.CSS_SELECTOR,"#detail > p")
#查找具体用户名
self.driver.find_element(By.CSS_SELECTOR,"body > div.container > div.left > div > h3")
BLogDriver.getScreenShoot()
BlogEditTest 博客编辑页测试
在博客编辑页面,内容部分是由一个markdown文本编辑器插件实现的,我们无法在自动化测试时去添加/修改内容。但是菜单栏是可点击的,我们可以尝试在自动化测试时去点击,但有可能菜单栏的元素无法被定位。
成功发布博客:输入标题,点击菜单栏按钮,然后点击发布。
from selenium.webdriver.common.by import By
from common.Utils import BLogDriver
class BlogEdit:
url=""
driver=""
def __init__(self):
self.url="http://8.137.19.140:9090/blog_edit.html"
self.driver=BLogDriver.driver
self.driver.get(self.url)
def EditTestSuc(self):
self.driver.find_element(By.CSS_SELECTOR,"#title").send_keys("博客自动化测试")
self.driver.find_element(By.CSS_SELECTOR,"#editor > div.editormd-toolbar > div > ul > li:nth-child(21) > a").click()
BLogDriver.getScreenShoot()
self.driver.find_element(By.CSS_SELECTOR,"#submit").click()
RunTest
from common.Utils import BLogDriver
from test import BLogLoginTest
from test import BlogListTest
from test import BlogDetailTest
from test import BlogEditTest
if __name__ == "__main__":
#测试登录界面
BLogLoginTest.BlogLogin().LoginLoss_1()
BLogLoginTest.BlogLogin().LoginLoss_2()
BLogLoginTest.BlogLogin().LoginLoss_3()
BLogLoginTest.BlogLogin().LoginSuccess()
#测试博客首页
BlogListTest.BlogList().BlogListTestSuc()
#测试博客详情页
BlogDetailTest.BlogDetail().DetailTestSuc()
#测试博客编辑页面
BlogEditTest.BlogEdit().EditTestSuc()
BLogDriver.driver.quit()