selenium po模式,java+selenium自动化测试框架
众所周知,po模式可以提高代码的可读性,减少代码的重复。然而,也有相对的缺点。今天我们就通过这篇文章来学习selenium自动化测试框架中PO模式的优势,有需要的朋友可以参考一下。
PO模式简介
1.什么是PO模式
PO模型是:页面对象模型的简写页面对象模型。
功能:将测试页面从测试脚本中分离出来,即将页面封装成一个类,供测试脚本调用;
分层机制,允许不同的层做不同类型的事情,使代码结构清晰,增加可重用性。
PO设计模式是Selenium自动化测试中最好的设计模式之一,主要体现在接口交互细节的封装上。
2. 不使用PO设计会出现以下几种情况:
复用性差,扩展性差,可读性差,维护性差。维护UI界面频繁的项目比较麻烦。
3.PO模式的优缺点
优势:
提高代码的可读性,减少代码的重复,提高代码的可维护性,特别是针对UI界面频繁的项目的缺点:
项目结构复杂,因为它是按照流程模块化的。下面重点介绍一下selenium自动化测试框架中PO模式的优势。
PO模式是UI自动化测试过程中经常使用的一种设计模式。使用这种模式后,可以有效地提高代码的可重用性,使自动化测试代码更便于维护。
PO模式的全称叫页面对象模型(POM),有时也叫页面对象模式。这种模式最初由Martin Fowler提出,后来被selenium自动化测试框架大力推广,从而成为非常主流的自动化测试设计模式。
在PO模式中,每个UI页面都由编程语言中的一个类来表示。在这个类中,页面的行为和操作是以函数的形式定义的。这使得呼叫者可以专注于特定的业务,例如登录、购物等。而不是关注具体操作是点击还是拖动。即使程序员直接把代码给产品经理看,他也能看懂。
没有使用PO模式时
对于代码编写人员来说,直接在测试用例中编写浏览器操作API并不是很难,因为他已经非常熟悉这些API了,但是这些浏览器操作并不能体现业务,至少没有产品经理熟悉,所以他很难与产品经理和开发人员沟通。即使过了半个月,他也忘了自己写了什么。
def test_login_mail(自我):
司机=自己
driver . get( http://www . XXX . XXX.com )
driver . find _ element _ by _ id( id input )。清除()
driver.find_element_by_id(xxxxx
xx’)。send_keys(
ement(*self.username_loc).clear()
self.driver.find_element(*self.username_loc).send_keys("xxxxx")
self.driver.find_element(*self.password_loc).clear()
self.driver.find_element(*self.password_loc).send_keys("xxxxxx")
self.driver.find_element(*self.submit_loc).click()
这种方式把元素定位方式也分离了。但是这种元素定位的表达式可读性也不是很强,可以换用 property 方式来表示元素,所有的元素统一放在一起,修改起来也比较方便。
class LoginPage:def __init__(self, driver)
self.driver = driver
@property
def username_element(self):
return self.driver.find_element(id, idInput)
def password_element(self):
return self.driver.find_element(id, pwdInput)
def submit_element(self):
return self.driver.find_element(id, loginBtn)
def login(self, name, password):
self.username_element.send_keys(name)
self.password_element.send_keys(password)
self.submit_element.click()
第三种方式可以充分利用Python的描述符特性,你会发现很多序列化库或者ORM框架都有类似的用法。
class LoginPage:def __init__(self, driver)
self.driver = driver
username = Element(css=#idInput, desc=用户名输入框)
password = Element(css=#pwdInput, desc=密码输入框)
confirm = Element(css=#loginBtn, desc=登录确认按钮)
def login(self, name, password):
self.username.send_keys(name)
self.password.send_keys(password)
self.confirm.click()
而 Element 类可以通过 Python 描述符实现,这里为了方便,只定义了xpath的元素定位方法:
class Element:def __init__(self,xpath=None,desc=):
self.xpath = xpath
self.desc = desc
def __get__(self, instance, owner):
driver = instance.browser
el = driver.find_element(xpath, self.xpath)
return el
PO模式和DDD
PO模式是DDD(领域驱动设计)的一个简单实现,但是还不够彻底。如果要在自动化测试中贯彻DDD,我觉得还有一些可以优化的空间。
首先某一个业务不一定只是单个页面的操作,比如登录不一定只涉及到LoginPage这个页面,因此直接在LoginPage中编写login函数就不是很合理。对于调用方来说,应该明确说明的是谁在登录,而不是指某个页面。像这样:
user.login()# or
login(user)
我们编写的代码就像是自然语言,任何懂英语的人都知道代码在做什么,在DDD中,叫做领域特定语言(DSL), 要实现这种逻辑,在Page类和调用中间应该还会有一个层级来封装user。
其次,Page页面会依赖更底层的资源,比如组件,元素类型。因此在 Page 类的下方应该会使用 InputElement, ButtonElement 、SelectElement 这样的元素类和 HeaderComponent、FooterComponent 这样的组件类。
class LoginPage:username_filed = InputElement(xxx)
password_filed = PasswordElement(xxx)
领域驱动设计对于大型项目梳理业务、同步业务、沟通业务是非常有帮助的,是一种以业务为中心的设计范式。PO模式对于DDD的小范围应用,以及具体了足够多的好处:
- 便于维护。每一个页面的操作都被单独的存放在一个类文件中,当前端页面被修改之后,只需要找到对应类文件进行修改,其他的代码并不需要进行修改,这符合单一职责原则。
- 便于重复使用。在进行自动化测试的时候,一个测试由多个测试步骤组成,这些测试步骤可能涉及到多个页面的操作。而用例与用例之间的操作可能重合。PO模式可以重复利用这些测试步骤,简化代码的编写。
- 提高了可读性。页面的操作都被以函数的形式封装起来了。函数名就具备注释的作用,其他人阅读代码时可以通过函数了解业务。
到此这篇关于PO模式在selenium自动化测试框架有什么好处的文章就介绍到这了,更多相关selenium自动化测试内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。