千纸鹤

  博客园  ::  :: 新随笔  ::  ::  :: 管理
  5 随笔 :: 70 文章 :: 0 评论 :: 9301 阅读
(1)POM的结构
1.基类:封装的常用关键字
2.页面对象类:封装系统中的各个页面,以及页面的相关内容,是POM的核心层级,一般拆分的话会分为:页面元素类、页面业务类
3.测试用例类:测试代码的管理
4.测试数据类:管理测试数据
5.套件类:管理测试套件
(2)POM的特性
1.仅针对于单个系统来进行测试的设计模式
2.所有的代码都是为了单独的这个系统来进行服务的
3.可以理解为是为指定的系统量身打造的测试框架
4.自动化测试的维护成本最低,最佳的天花板设计模式
5.一个页面对象 可以对应多个业务流程 不同的业务流程 可以封装到不同的操作行为
(3)POM的源码
1.基类:base
from time import sleep
from selenium import webdriver

class BasePage:
# 初始化函数
def __init__(self,driver):
self.driver = driver
self.driver.implicitly_wait(10)

# 打开URL方法
def open(self,txt):
self.driver.get(txt)

# 元素方法
def locate(self,name,value):
return self.driver.find_element(name,value)

# 输入方法
def input(self,name,value,txt):
self.locate(name,value).send_keys(txt)

# 点击方法
def click(self,name,value):
self.locate(name,value).click()

# 强制等待
def wait(self,txt):
sleep(txt)

# 断言文本
def assert_text(self,name,value,expect):
try:
result = self.locate(name, value).text
assert expect == result,'断言失败,实际结果为:{}'.format(result)
return True
except Exception as e:
# print('异常:{}'.format(e))
# self.log.exception('异常'.format(e))
print('断言失败信息:断言失败,实际结果为:{}'.format(e))
return False
# 退出
def quit(self):
self.driver.quit()

2.页面对象类:base_object
1.Index_page.py 电商首页页面对象:未登录时,进行搜索和点击个人中心的操作
from selenium import webdriver
from test008.test0087.test0087_01.base.base_page import BasePage

class IndexPage(BasePage):
# 打开电商首页url
url = 'http://39.98.138.157/shopxo/index.php'

# 页面元素(搜索属性的定位方法和定位值)
# search_input:搜索输入框
# search_button:"搜索"按钮
search_input = ('name', 'wd')
search_button = ('id', 'ai-topsearch')

# 页面元素(个人中心属性的定位方法和定位值)
# info:个人中心
info = ('link text', '个人中心')

# 页面业务(搜索)
def search(self, txt):
self.open(self.url)
self.input(*self.search_input, txt=txt)
self.click(*self.search_button)

# 页面业务(个人中心)
def userinfo(self):
self.open(self.url)
self.click(*self.info)

if __name__ == '__main__':
driver = webdriver.Chrome()
ip = IndexPage(driver)
# 页面业务(搜索手机)
# ip.search('手机')
# 页面业务(个人中心)
ip.userinfo()

2.LoginPage 电商登录页面对象:输入账号和密码,点击登录,进行断言操作
from selenium import webdriver
from test008.test0087.test0087_01.base.base_page import BasePage

class LoginPage(BasePage):
# 页面url
url = 'http://39.98.138.157/shopxo/index.php?s=/index/user/logininfo.html'
# 页面元素(登录属性的定位方法和定位值)
# accounts:账号输入框
# password:密码输入框
# button:登录
# login_assert:退出
accounts = ('name','accounts')
password = ('name','pwd')
button = ('xpath','//button[text()="登录"]')
login_assert = ('xpath','//*[text()="退出"]')

# 页面业务(打开链接,输入账号和密码,点击登录,断言)
def login(self,user,pwd,expect):
self.open(self.url)
self.input(*self.accounts,txt=user)
self.input(*self.password,txt=pwd)
self.click(*self.button)
status = self.assert_text(*self.login_assert, expect=expect)
return status

if __name__ == '__main__':
driver = webdriver.Chrome()
lp = LoginPage(driver)
# (账号、密码和断言)
lp.login('xuzhu666', '123456', '退出')

3.配置类:conf chrome_options.py Chrome浏览器的配置
from time import sleep
from selenium import webdriver

class ChromeOptions:
def options(self):
# chrome浏览器的配置项,可以通过修改默认参数,改变默认启动的浏览器的形态
options = webdriver.ChromeOptions()
# 将浏览器默认设置为最大窗体
# options.add_argument('start-maximized')
# 设置默认窗体的启动大小
# options.add_argument('window-size=400,2000')
# 无头模式:虽然看不到,但是一切照旧,在一些特定场景下会失败
# options.add_argument('--headless')
# 去掉默认的提示自动化信息:没啥用,一般没有什么影响。警告条可能会导致页面内容的遮挡或者挤压,影响自动化测试
options.add_experimental_option('excludeSwitches', ['enable-automation', 'enable-logging'])
# 去掉控制台多余信息
# options.add_experimental_option('excludeSwitches', ['enable-logging'])
# 老版本去掉警告条的参数,已经不生效了。已弃用
# options.add_argument('disable-infobars')
# 读取本地缓存,实现一个有缓存的浏览器,这个指令执行前必须关闭所有本地的chrome浏览器
# options.add_argument(r'--user-data-dir=C:\Users\xuzhu\AppData\Local\Google\Chrome\User Data')
# 去掉账号密码弹窗
prefs = {}
prefs["credentials-enable-service"] = False
prefs['profile.password_manager_enable'] = False
options.add_experimental_option("prefs", prefs)

# 娱乐设置
# 指定窗口打开在哪个位置
# options.add_argument('window-position=2200,500')
# 隐身模式
# options.add_argument('incognito')
# 去掉控制台打印的多余信息:忽略!暂时参数有问题
# options.add_argument("--disable-gpu")
# options.add_argument("--log_level= 3")
# options.add_argument("--ignore-certificate-errors")
return options

4.测试数据类:data info.yaml
-
txt: 手机
-
txt: 连衣裙

5.测试用例类:test_cases
1.case_demo.py POM下的测试用例:调用LoginPage登录函数方法和IndexPage搜索手机方法
from selenium import webdriver
from test008.test0087.test0087_01.base.index_page import IndexPage
from test008.test0087.test0087_01.base_object.login_page import LoginPage

driver = webdriver.Chrome()
lp = LoginPage(driver)
lp.login('xuzhu666','123456','退出')
ip = IndexPage(driver)
ip.search('手机')
2.test_demo01 第一组测试用例:登录之后进行搜索
import unittest
from ddt import ddt, data, file_data, unpack
from selenium import webdriver
from test008.test0087.test0087_01.base.index_page import IndexPage
from test008.test0087.test0087_01.base_object.login_page import LoginPage
from test008.test0087.test0087_01.conf.chrome_options import ChromeOptions

@ddt
class TestDemo01(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome(options=ChromeOptions().options())
cls.lp = LoginPage(cls.driver)
cls.ip = IndexPage(cls.driver)

@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()

@data(['xuzhu666', '123456','退出'])
@unpack
def test_01_login(self, user, pwd, expect):
self.lp.login(user, pwd, expect)

@file_data('../data/info.yaml')
def test_02_search(self,txt):
self.ip.search(txt)


if __name__ == '__main__':
unittest.main()
3.test_demo02 第二组测试用例:登录之后进行搜索最后点击个人中心
import unittest
from ddt import ddt, data, file_data, unpack
from selenium import webdriver
from test008.test0087.test0087_01.base.index_page import IndexPage
from test008.test0087.test0087_01.base_object.login_page import LoginPage
from test008.test0087.test0087_01.conf.chrome_options import ChromeOptions

@ddt
class TestDemo01(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver = webdriver.Chrome(options=ChromeOptions().options())
cls.lp = LoginPage(cls.driver)
cls.ip = IndexPage(cls.driver)

@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit()

@data(['xuzhu666', '123456','退出'])
@unpack
def test_01_login(self,user,pwd,expect):
self.assertTrue(self.lp.login(user,pwd,expect))

@file_data('../data/info.yaml')
def test_02_search(self,txt):
self.ip.search(txt)

# @file_data('../data/info.yaml')
def test_03_user(self):
self.ip.userinfo()

if __name__ == '__main__':
unittest.main()
6.套件类:test_suit
1.report
报告文件
2.suite_demo.py 基于套件的形态管理测试用例
import os
import time
import unittest
# python学习之生成HTMLTestRunner测试报告(配置测试报告信息)
from test008.test0087.test0087_01.HTMLTestRunner import HTMLTestRunner

path = '../test_cases'
discover = unittest.defaultTestLoader.discover(start_dir=path, pattern='test*.py')

# 配置测试报告信息
# 时间戳
t = time.strftime('%Y-%m-%d %H-%M-%S')

# 保存路径
report_dir = './report/'
# 测试报告的title
report_title = '虚竹的测试报告'
# 描述
report_description = '这是测试报告的描述'
# 测试报告文件
report_file = report_dir + t + 'report.html'
# 生成路径
if not os.path.exists(report_dir):
os.mkdir(report_dir)

# 生成HTMLTestRunner测试报告,本质意义上就是写入一个文件
with open(report_file, 'wb') as file:
runner = HTMLTestRunner(stream=file, title=report_title,
description=report_description, verbosity=2)
runner.run(discover)
7.第三方库:HTMLTestRunner.py
见博客园
posted on   隆江猪脚饭  阅读(149)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示