目录
做法
以页⾯为单位独⽴建模
隐藏实现细节
class Base(object):
def __init__(self, w_driver: webdriver):
# PO原则:不对外暴露细节
self._driver = w_driver
self._timeout = 10
self._interval_time = 0.5
本质是⾯向接口编程,因为在用例中,只需要调用page层封装好的方法。
def test_login(self):
# 根据PO原则,用例只保留基本步骤。
wd = self.home.login()
text = wd.get_title()
self.assertEqual("企业登录", text)
def test_register(self):
wd = self.home.register()
text = wd.get_title()
self.assertEqual("注册企业微信", text)
优点
减少重复find click样板代码
易读性提⾼
页⾯修改不影响测试⽤例,只需要在page层做修改。
Page Object Model的基本原则
⽤公共⽅法代表UI所提供的功能
⽅法应该返回其他的PageObject或者返回⽤于断⾔的数据
def login(self):
self.click(self._loc_login)
# 根据PageObject原则,返回跳转后的PageObject
return Login(self.driver)
def get_title(self):
"""
获取文本
:return: 元素对应的文本内容
"""
return self.get_text(self._loc_title)
同样的⾏为不同的结果可以建模为不同的⽅法
不要在⽅法内加断⾔
不要暴露页⾯内部的元素给外部,(这点我见过很多人写代码都没意识到)
class Login(Base):
# 写成私有,不对外暴露
_loc_title = ('css selector', '.login_head_title')
不需要建模UI内的所有元素
基于POM的⽤例组织结构
page:完成对页⾯的封装
driver:完成对web、android、ios、接⼜的驱动
testcase:调⽤各类page完成业务流程并进⾏断⾔
data:配置⽂件和数据驱动
utils:其他便捷的功能封装,可选
框架代码模型可参考:https://github.com/chaunchengZeng/selenium_wechat_web