这里对之前的代码进行封装https://blog.youkuaiyun.com/weixin_45730790/article/details/121889321
视频传送门https://www.bilibili.com/video/BV1Ey4y1L7xU?p=7&spm_id_from=pageDriver
一、设计模式
Pom模式+关键字驱动模式
pom模式:page object model 页面对象模式。
好处:
1.解决:线性脚本的问题
2.解决:代码不能重复利用的问题
3.解决:后期的维护问题。
pom模式,简单来说就是分类
分三层:
1.基础层:base层 主要放selenium原生的方法。
2.页面对象层:po层 主要用于放页面的元素和页面的动作。
3.测试用例层:testcase 存放测试用例以及测试数据。
页面对象层调用基础层的方法,测试用例层调用页面对象层的方法。
unittest的前后置处理(夹具)
setup在测试用例之前的准备工作
teardown在测试用例之后的扫尾工作
分层之后的结构如下:
base_page代码如下:
from selenium.webdriver.support.select import Select
class BasePage:
def __init__(self, driver):
self.driver = driver
def locator_element(self, loc): # loc参数是一个元组
"""定位元素的关键字"""
return self.driver.find_element(*loc) # 加*解包,去掉一层()
def set_keys(self, loc, value):
"""设置值的关键字"""
self.locator_element(loc).send_keys(value)
def click(self, loc):
"""单击的关键字"""
self.locator_element(loc).click()
def goto_frame(self, frame_name):
"""进入框架的关键字"""
self.driver.switch_to.frame(frame_name)
def quit_frame(self):
"""出框架的关键字"""
self.driver.switch_to.default_content()
def choice_select(self, loc, value):
""" 封装选中下拉框关键字"""
sel = Select(self.locator_element(loc))
sel.select_by_value(value)
def get_value(self, loc):
"""获取文本的值"""
return self.locator_element(loc).text
base_util代码如下:
import time
import unittest
from selenium import webdriver
class BaseUtil(unittest.TestCase):
# 重写了unittest里的setUp和tearDown
def setUp(self) -> None:
global driver
# 打开浏览器
self.driver = webdriver.Chrome()
driver = self.driver
# 加载网页
self.driver.get("http://localhost/ecshop/admin/privilege.php?act=logout")
def tearDown(self) -> None:
time.sleep(3)
self.driver.quit()
login_page代码如下:
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class LoginPage(BasePage):
"""登录页面"""
# 页面的元素
username_loc = (By.NAME, "username") # 用户名
password_loc = (By.NAME, "password") # 密码
submit_loc = (By.XPATH, "//input[@value='进入管理中心']") # 登录按钮
# 页面的动作
def login_ecshop(self, username, password):
self.set_keys(LoginPage.username_loc, username) # 输入用户名
self.set_keys(LoginPage.password_loc, password) # 输入密码
self.click(LoginPage.submit_loc) # 点击登录按钮
product_manage_page代码如下:
from selenium.webdriver.common.by import By
from base.base_page import BasePage
from pageobject.login_page import LoginPage
class ProductManagePage(BasePage):
# 页面元素
product_list_loc = (By.LINK_TEXT, "商品列表")
cat_id_loc = (By.NAME, "cat_id")
sousuo_loc = (By.XPATH, "//input[@value=' 搜索 ']")
# 页面动作
def select_product(self, value):
# 登录
lp = LoginPage(self.driver)
lp.login_ecshop()
# 查询
self.goto_frame("menu-frame")
self.click(ProductManagePage.product_list_loc)
self.quit_frame()
self.goto_frame("main-frame")
self.choice_select(ProductManagePage.cat_id_loc, value)
self.click(ProductManagePage.sousuo_loc)
test_login代码如下:
from base.base_util import BaseUtil
from pageobject.login_page import LoginPage
class TestCase(BaseUtil):
def test_01_login(self):
# 登录
lp = LoginPage(self.driver)
lp.login_ecshop("admin", "admin123")
test_product_manage代码如下:
from base.base_util import BaseUtil
from pageobject.login_page import LoginPage
from pageobject.product_manage_page import ProductManagePage
class TestProductManage(BaseUtil):
def test_03_select_product(self):
"""
查询商品
"""
pm = ProductManagePage(self.driver)
pm.select_product("4")
这里的关键字虽然封装好了,但是并没有用关键字驱动,所以实际上就是pom模式
二、生成测试报告
添加一个all.py和report目录
all.py代码如下:
import unittest
from HTMLTestRunner import HTMLTestRunner
import pytest
if __name__ == '__main__':
# 执行需要的用例,并且生成HTML格式的自动化的测试报告
# 使用unittest默认的测试用例的加载器去发现testcase目录下以py结尾的所有的测试用例
suite = unittest.defaultTestLoader.discover("./testcase", "*.py")
# 生成html报告文件
report_file = open("./report/reports.html", "wb")
# 生成一个HTMLTestRunenr运行器对象(必须下载一个文件HTMLTestRunner.py,放到python的lib目录,注意python2和python3是不一样的)
runner = HTMLTestRunner(stream=report_file, title="ECSHOP自动化测试报告", description="报告详情如下:")
# 通过运行器运行测试用例
runner.run(suite)
三、断言
unittest断言用于判断预期结果和实际结果是否相符
在这里面有几十种断言,主要需要知道三种
self.assertEqual() 判断两个值是否相等
self.assertTrue() 判断一个值是否为True
self.asserIn() 判断一个值是否在另一个值里面
查询断言不太好做,一般是与新增连着一起,新增之后再查询刚刚新增的值
这里展示登录断言的例子
在login_page.py里面加上断言
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class LoginPage(BasePage):
"""登录页面"""
# 页面的元素
username_loc = (By.NAME, "username") # 用户名
password_loc = (By.NAME, "password") # 密码
submit_loc = (By.XPATH, "//input[@value='进入管理中心']") # 登录按钮
tuichu_loc = (By.LINK_TEXT, '退出')
# 页面的动作
def login_ecshop(self, username, password):
self.set_keys(LoginPage.username_loc, username) # 输入用户名
self.set_keys(LoginPage.password_loc, password) # 输入密码
self.click(LoginPage.submit_loc) # 点击登录按钮
# 断言
def get_except_result(self):
self.goto_frame("header-frame")
return self.get_value(LoginPage.tuichu_loc)
在test_login.py里面加上断言
from base.base_util import BaseUtil
from pageobject.login_page import LoginPage
class TestCase(BaseUtil):
def test_01_login(self):
""" 登录 """
lp = LoginPage(self.driver)
lp.login_ecshop("admin", "admin123")
# 断言 self.assertEqual(预期结果,"退出")
self.assertEqual(lp.get_except_result(), "退出")