全称:page object model 简称:POM/PO
PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性!
主要分三层:
1.基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。
2.PO层:元素定位、获得元素对象,页面动作
3.测试用例层:业务逻辑,数据驱动!
三者的关系:PO层继承继承层,测试用例层调用PO层!
说到自动化框架,我相信很多人应该都听过这个词,但是不知其到底是个什么东西,为什么要用自动化框架。有很多人堆自动化框架都是懵懵懂懂,就跟谈恋爱一样,朦胧美!
一个好的自动化测试框架是可以让不那么懂技术的人也可以写自动化测试脚本的,
一个好的自动化测试框架可以减少自动化测试中脚本管理和维护当中的人力物力和财力。
其实自动化框架的一个最大的意义在于可重用性。因为在框架里,你可以实现很多的通用功能来简化整个脚本的开发过程。并且生成美观的测试报告。
非PO模式 | PO模式 |
面向过程的线性脚本 | POM把页面元素定位和业务操作流程分开。实现松耦合。 |
复用性差 | UI元素的改变不需要修改业务逻辑代码。只需要找到对应的PO页修改定位即可,数据代码分离 |
维护性差 | PO能使我们的测试代码提高代码的可读性,高复用性,可维护性。 |
非PO模式举个栗子:有如下百度搜索脚本:
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
class Test(unittest.TestCase):
def test01(self):
# 打开浏览器
driver = webdriver.Chrome()
# 加载百度首页
driver.get('http://www.baidu.com')
# 在百度搜索栏中输入软件测试
driver.find_element(By.ID, 'kw').send_keys('软件测试')
# 点击百度一下按钮
driver.find_element(By.ID, 'su').click()
def test02(self):
# 打开浏览器
driver = webdriver.Chrome()
# 加载百度首页
driver.get('http://www.baidu.com')
# 在百度搜索栏中输入软件测试
driver.find_element(By.ID, 'kw').send_keys('硬件测试')
# 点击百度一下按钮
driver.find_element(By.ID, 'su').click()
如何把上述栗子改成PO模式呢?
1、基础层BasePage
from selenium import webdriver
class BasePage:
#构造方法
def __init__(self):
# 打开浏览器
self.driver = webdriver.Chrome() # Alt+Enter
# 加载百度首页
self.driver.get('http://www.baidu.com')
#封装定位元素
def find_ele(self,*args):
ele = self.driver.find_element(*args)
return ele
2、PO层:封装百度页面元素定位,元素对象以及页面操作
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class BaiduPage(BasePage):
#元素定位,
baidu_text_loc = (By.ID, 'kw')
baidu_submit_loc = (By.ID, 'su')
#获得元素对象,
def get_text_obj(self):
ele = self.find_ele(*BaiduPage.baidu_text_loc)
return ele
def get_submit_obj(self):
ele = self.find_ele(*BaiduPage.baidu_submit_loc)
return ele
#页面操作
def search(self,search_string):
self.get_text_obj().send_keys(search_string)
self.get_submit_obj().click()
3、测试用例层:业务逻辑和数据驱动
from ddt import ddt, data
from po.baidu_page import BaiduPage
@ddt
class BaiduTest(unittest.TestCase):
@data('软件测试','硬件测试')
def test01(self,seaString):
BaiduPage().search(seaString)
time.sleep(5)
if __name__ == '__main__':
unittest.main()
从上面的PO案例:让我们更加了解清晰PO的优点在于:
1.POM把页面元素定位和业务操作流程分开。实现松耦合。
2.UI元素的改变不需要修改业务逻辑代码。只需要找到对应的PO页修改定位即可,数据代码分离
3.PO能使我们的测试代码提高代码的可读性,高复用性,可维护性。
自动化框架=po+各种封装(日志处理封装,全局配置文件的封装,数据库连接的封装,excel操作封装,数据驱动封装等)
其实想要胜任UI自动化测试岗位还需要掌握以下内容:
1.python或java
2.selenium的API
3.unittest/pytest单元测试框架
4.htmltestrunner/allure测试报告
5.数据驱动dtt(excel,yaml,mysql)或pytest中的fixtrue
6.关键字驱动:公共类,方法封装,随机数,数据库连接,全局登录
7.全局配置文件处理
8.日志处理
9.断言
10.第三方库
11.git和github或码云集成开发!
12.jenkins持续集成
生命不息,奋斗不止。每一份努力都不会被辜负,只要坚持不懈,终究会有回报。珍惜时间,追求梦想。不忘初心,砥砺前行。你的未来,由你掌握!
生命短暂,时间宝贵,我们无法预知未来会发生什么,但我们可以掌握当下。珍惜每一天,努力奋斗,让自己变得更加强大和优秀。坚定信念,执着追求,成功终将属于你!
只有不断地挑战自己,才能不断地超越自己。坚持追求梦想,勇敢前行,你就会发现奋斗的过程是如此美好而值得。相信自己,你一定可以做到!
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!