Page Object Mode(POM)模式是一种在自动化测试中常用的设计模式,也叫页面对象模型,简称PO。用于将页面的逻辑和操作封装到一个对象中。每个页面都对应一个Page Object,通过Page Object可以访问页面上的元素和执行操作。Page Object模式可以提高测试脚本的可读性和可维护性,同时也可以减少测试脚本对页面细节的依赖。
在Page Object模式中,通常会将页面的元素(如按钮、输入框、下拉列表等)和操作(如点击、输入、选择等)封装成方法,通过调用这些方法来进行页面操作和断言。这样可以使测试脚本更加简洁,并且当页面发生变化时,只需要修改Page Object而不需要修改所有的测试脚本。
PO 模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。
非POM结构将所有代码都写在一个类中,不利于代码维护,代码存在冗余,UI页面元素发生变化需要修改很多地方。
而POM结构将selenium的基础API进行封装为基类,每一个页面的所有定位元素都有一个类(都继承基类),通过继承定位元素类形成业务流,在通过业务流组织成用例。这样降低了代码的耦合性,可以很好的维护代码,就算页面UI进行变动,只需要找到对应的页面元素定位类进行修改即可(自动化分层越详细,越利于维护)。
BasePage基类,封装驱动器对象的获取方法,可以将驱动器对象中的浏览器进行基本设置。然后是打开被测浏览器地址的封装,需要传入URL地址。最后是对元素定位方法的封装。(还可以将其他定位方式以及定位元素的操作封装到BasePage类中)
from selenium import webdriver
from selenium.webdriver.common.by import By
class BasePage:
def __init__(self, browserType):
"""
:param browserType: 表示传入浏览器的类型,传入的数据类型为string类型
"""
# 将输入的字符串字母全部转换为小写
__type = browserType.lower()
if __type == "chrome":
self.get_driver = webdriver.Chrome()
elif __type == "firefox":
self.get_driver = webdriver.Firefox()
else:
print("请选择正确的浏览器!")
def open(self, url):
self.get_driver.get(url)
# 元素定位封装
def get_element(self, property, value):
"""
:param property: 传入元素定位的类型,数据类型为string,值为ID,Name,Xpath,ClassName,Css
:param value: 表示的是页面上元素属性所对应的值
:return: 返回元素定位的对象,如果传入的类型或者不存在抛出值异常
"""
if property == "ID":
return self.get_driver.find_element(By.ID, value)
elif property == "Name":
return self.get_driver.find_element(By.NAME, value)
elif property == "Xpath":
return self.get_driver.find_element(By.XPATH, value)
elif property == "ClassName":
return self.get_driver.find_element(By.CLASS_NAME, value)
elif property == "Css":
return self.get_driver.find_element(By.CSS_SELECTOR, value)
else:
raise ValueError
该类继承BasePage基类,将被测的一个页面所有元素定位都封装在这个类中,并返回所有元素定位的对象。
from Page_Manage_Layer.Base_Page import BasePage
class BaiduPage(BasePage):
# 继承BasePage页面获取浏览器对象
# 百度首页搜索输入框的元素定位
def baidu_input_element(self):
# self.log.info("百度输入框元素定位成功")
return self.get_element("ID", "kw")
# 百度首页搜索按钮的元素定位
def baidu_submit_element(self):
# self.log.info("百度搜索按钮元素定位成功")
return self.get_element("ID", "su")
该类继承BaiduPage类,主要是定义业务场景流程。
from Page_Manage_Layer.Baidu_Page import BaiduPage
class BaiduFlow(BaiduPage):
# 完成百度搜索
def baidu_query(self, content):
self.baidu_input_element().send_keys(content)
self.baidu_submit_element().click()
该类继承BaiduFlow类,结合unittest定义测试用例。(parameterized为参数化,将在后面分享的文章中详细介绍自动化测试的参数化)
import time
import unittest
from parameterized import parameterized
from Business_Flow_Layer.Baidu_Flow import BaiduFlow
class BaiduTest(unittest.TestCase, BaiduFlow):
def setUp(self):
self.s = BaiduFlow("chrome")
self.s.open("https://www.baidu.com")
@parameterized.expand([["测试"], ["开发"], ["产品"]])
def test_cs1(self, value):
self.s.baidu(value)
time.sleep(1)
def tearDown(self):
self.s.get_driver.quit()
至此,简单的一个POM结构案例就完成了。
最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取【保证100%免费】
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。