POM设计思想



POM简介

 Page Object Model (POM) 直译为“页面对象模型”,这种设计模式旨在为每个待测试的页面创建一个页面对象(class),将那些繁琐的定位操作封装到这个页面对象中,只对外提供必要的操作接口,是一种封装思想。

POM优势有哪些


  • 让UI自动化更早介入项目中,可项目开发完再进行元素定位的适配与调试
  • POM 将页面元素定位和业务操作流程分开,分离了测试对象和测试脚本
  • 如果UI页面元素更改,测试脚本不需要更改,只需要更改页面对象中的某些代码就可以
  • POM能让我们的测试代码变得可读性更好,高可维护性,高复用性
  • 可多人共同维护开发脚本,利于团队协作

为什么使用POM设计模式


  • 少数的自动化测试用例维护起来看起来是很容易的。但随着时间的迁移,测试套件将持续的增长。脚本也将变得越来越臃肿庞大。
  • 如果变成我们需要维护10个页面,100个页面,甚至1000个呢?而且页面元素很多是公用的。那页面元素的任何改变都会让我们的脚本维护变得繁琐复杂,而且变得耗时易出错。

如何设计POM

思路解析


  • 需要一个文件用于管理页面元素,如login_page.py
  • 封装一个公用的操作方法
  • 最后需要一个文件用于编写测试用例

login_page.py文件

  • 该文件用于管理登录页面所有的元素,操作这些元素的方法
#! /usr/bin/python3
#-*- coding:utf-8 -*-



'''管理登录页面所有的元素,操作这些元素的方法'''
from import By


class LoginPage:
username_input = (By.XPATH,'//*[@id="name"]') #登录页面的用户名输入框
password_input = (By.XPATH,'//*[@id="password"]') #登录页面的密码输入框
login_button = (By.XPATH,'//*[@id="submit"]') #登录按钮

common.py

  • 该文件有用于封装一些共用的操作方法
#! /usr/bin/python3
#-*- coding:utf-8 -*-


from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from import By

'''封装一些常用公共方法'''
class InitBrowser():
'''浏览器常用操作封装'''

def __init__(self):
self.driver = webdriver.Firefox() # 启动谷歌浏览器
self.driver.get('https://sso.kuaidi100.com/sso/') # 打开网站

def wait_element_visible(self, locate):

ele = WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(locate)) #等待元素出现再去操作
print('等待元素出现')
return ele

def click_until_visible(self, locate):
self.wait_element_visible(locate).click()

def send_keys_until_visible(self, locate, value):
self.wait_element_visible(locate).send_keys(value)

TestCase.py

  • 该文件用于管理测试用例
#! /usr/bin/python3
#-*- coding:utf-8 -*-

'''管理测试用例'''
import unittest
from common import InitBrowser
# 导入Pages文件下的login_page文件中的LoginPage类
from Pages.login_page import LoginPage


class TestCases(unittest.TestCase, InitBrowser, LoginPage):
def setUp(self) -> None:
'''前置操作初始化:打开浏览器,连接数据库,初始化数据'''
InitBrowser.__init__(self)

def testcase01(self):
'''测试用例'''

self.send_keys_until_visible(LoginPage.username_input, "账号")
self.send_keys_until_visible(LoginPage.password_input, "密码")
self.click_until_visible(LoginPage.login_button)

def tearDown(self) -> None:
'''后置操作:关闭浏览器,关闭数据库连接,清理测试数据'''
self.driver.quit()

if __name__=='__main__':
unittest.main()

总结


  • 当我们再次使用登录时,只需要修改login_page.py里的定位元素方法和值就可以了
  • 以上代码当然还有很多不足的地方,比如账号密码没有提出来,小伙伴可自行尝试


如果对软件测试、接口测试、自动化测试、持续集成、面试经验。感兴趣可以进到893694563,群内会有不定期的分享测试资料。还会有技术大牛,业内同行一起交流技术