1、POM模式是什么
页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库
在POM模式下,应用程序的每一个页面都有一个对的page class
每一个page class维护着该web页的元素集合操作这些元素的方法
page class中的方法名最好根据业务场景进行
POM模式的代码目录组织示例:
2、 POM的优势
POM提供了一种在UI层操作、业务流程与验证分离的模式,这使得测试代码变得更加清晰和高可读性
对象库与用例分离,使得我们更好的复用对象,甚至能与不同的工具进行深度结合应用
可复用的页面方法代码会变得更加优化
更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。例如我们要回到首页,方法名命名为: gotoHomePage(),通过方法名即可清晰的知道具体的功能实现。
可以理解POM模式是一种底层、逻辑、用例的分层。
3、POM分层封装
1)driver层的封装(最底层的封装base)
这一层主要是对于webdriver方法的封装,这里来举一个栗子,最常用的定位方法,使用find_element()方法通过BY类、字符串、元组三种方法传递定位类型和数据,这里我使用元组的形式(例如locator = (“id”,“name_box”))来传递参数
定位元素方法封装:
这个定位元素的公共方法中,加了很多东西;如果每次定位的时候写这些异常捕获、打印操作的话,那么程序会非常臃肿,所以需要单独提出来,每次需要定位的时候统一调用这个方法。
有一个入参locator,格式为(‘定位类型’,‘定位参数值’),返回我们所定位到的元素;
加入了元素等待,并判断该元素是否存在;
对关键信息的打印输出,方便定位监控;
加入了异常捕获,定位失败后可以继续执行程序;
def findElementNew(self, locator):
'''定位到元素返回元素对象,没定位到,返回timeout异常'''
# isinstance() 函数来判断一个对象是否是一个已知的类型
if not isinstance(locator, tuple):
print('locator参数类型错误,必须是元祖类型:loc=("id", "value")')
else:
try:
print("正在定位元素信息:定位方式->%s, value值->%s" % (locator[0], locator[1]))
ele = WebDriverWait(self.driver, self.timeout, self.t).until(EC.presence_of_element_located(locator))
return ele
except:
return []
封装类的初始化:
对于webdriver的封装,我们要先创建一个class,这样方便我们继承调用这些封装的方法。在class中,我这里设计了一个初始化,每次调用封装的driver时,传递参数,一个必填项:driver,我这样的想法是每次引用这个封装类时,传递一个driver进来
def __init__(self, driver):
self.driver = driver
self.driver.maximize_window()
2)page层封装
page类在继承我们封装的webdriver后,主要写具体的操作步骤,例如输入登录名、输入登录密码、点击登录按钮等操作。
继承driver类
操作步骤书写
class LoginPage(Base): #继承
# 定位登录
loc_user = ('id', 'account')
loc_psw = ('css selector', '[name="password"]')
loc_button = ('xpath', '//*[@id="submit"]')
loc_get_user = ('css selector', '#userMenu>a')
loc_forget_psw_page = ('xpath', '/html/body/div/div/div[2]/p/a')
def input_user(self, text=''):
self.sendKeys(self.loc_user, text)
def input_psw(self, text=''):
self.sendKeys(self.loc_psw, text)
def click_login_button(self):
self.click(self.loc_button)
3)case层调用
终于到了第三层,这里我们要做的就是把page层的方法,像搭积木一样搭起来,并且连成完整的操作。
使用unittest/Pytest,并初始化数据:
在unittest/Pytest框架的基础上,主要是在setUp()方法中初始化我们的数据,例如网址、账号、driver的初始化。
调用方法,完成用例:
首先引用page层,然后使用page层的方法搭建case。
4、POM模型的核心要素
抽象封装一个BasePage基类,基类应该拥有一个指向webdriver实例的属性
每一个Page都应该继承BasePage,并通过driver来管理本Page的元素,且将Page才操作都封装成一个个的方法
TestCase应该继成unittest.Testcase类,并依赖相应的Page类来实现相应的test step(即测试步骤)
目录框架文件作用
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
生命的价值在于奋斗,只有通过不断的挑战和努力,我们才能实现自我价值,才能在人生的舞台上留下深深的脚印。让我们以坚定的信念和不屈的精神,迎接每一个挑战。
每个人都是自己命运的舵手,只有紧握生活的舵,才能驶向理想的彼岸。无论前方风浪多大,只要我们坚持不懈的奋斗,就能在生活的大海中破浪前行,创造出属于自己的辉煌人生。
无论你现在处于什么位置,都不应放弃努力和追求。记住,每一次的挫折都是对你意志的考验,每一次的困难都是通向成功的垫脚石。只有坚持不懈的奋斗,才能实现自己的梦想。