Selenium  POM

tsbc@vip.qq.com

Ray

  • 什么是POM

  • 为什么要引入POM

  • 如何构建POM

什么是POM?

POM全称是:Page Object Model(页面对象模型)

所以POM只是一种开发模式,我们做Selenium自动化所使用的一种开发模式。

为什么要引入POM?

  • 为了减少代码开发工作量,提高代码重用性
  • 为了提高代码的可读性
  • 为了减轻后期维护代码的工作量

Page Object Model的实现,就是通过分离测试对象和测试脚本的抽象来实现的。

如何构建POM?

首先,我们要分离测试对象(元素对象)和测试脚本(用例脚本)

如图构建PO模式脚本目录结构:

data目录用来存储 数据文件
result 目录用来存储测试报告
result\image 目录用来存储截图快照
testcase 目录用来存放要执行的测试脚本,只要是case,全部以“case”为文件开头
testcase\public 目录用来存放公共方法,和重定义过的通用方法
testcase\PO 目录用来存放操作的Page页面(BasePage+各个页面脚本)
test_doc 目录存储测试用例设计等相关文档

 #Action
 def open(self):
  #调用page中的_open打开连接
      self._open(self.base_url, self.pagetitle)
 #调用send_keys对象,输入用户名
 def input_username(self, username):
      self.find_element(*self.username_loc).send_keys(username)
 #调用send_keys对象,输入密码
 def input_password(self, password):
      self.find_element(*self.password_loc).send_keys(password)
 #调用send_keys对象,点击登录
 def click_submit(self):
      self.find_element(*self.submit_loc).click()

两种模式:登录功能代码

def test_login_mail(self): 
    driver = self.driver 
    driver.get("http://mail.126.com") 
    driver.find_element_by_id("idInput").clear() 
    driver.find_element_by_id("idInput").send_keys("auto_tester")
    driver.find_element_by_id("pwdInput").clear() 
    driver.find_element_by_id("pwdInput").send_keys("123456") 
    driver.find_element_by_id("loginBtn").click()
from PO import LoginPage

def test_login(self):
    login_page = LoginPage.LoginPage(self.driver,self.url,self.title)
    login_page.open()
    #调用用户名输入组件
    login_page.input_username("admin")
    login_page.input_password("111111")
    login_page.click_submit()

LoginPage.py

CaseLogin_po.py

CaseLogin.py

PO模式

普通模式

PO的思想:页面中要操作元素的动作,全部进行独立定义,每一个方法都是独立的组件,而这个Page页面相当于是组件仓库。然后再通过Case脚本页面中,通过调用组件方法来拼凑自动化用例脚本。(注:对于一些通用的公共方法我们可以单独创建一个Base.py脚本页面进行定义存放。)

POM总结

  1. 通过使用POM进行重新构造代码结构后,发现测试用例代码的可读性提高很多;
  2. 元素写成组件的方式,不需要每次都写findElement直接在脚本中调用组件就可以使用;
  3. 在用例脚本中,我们输入 login_page并敲入一个点时,LoginPage页面的元素对象组件都显示出来;
  4. 并且定义好的PageObject组件可以重复在其它的脚本中进行使用,减少了代码的工作量,也方便对脚本进行后期的维护管理;
  5. 当元素属性发生变化时,我们只需要对一个PageObaject页面中的对象组件定义进行更改即可。

Text

PO DEMO

thank you!

By: Ray

tsbc@vip.qq.com