Page Object Model 简称POM 

普通的测试用例代码:

  1. ....
  2. #测试用例
  3. def test_login_mail(self):
  4. driver = self.driver
  5. driver.get("http://mail.126.com")
  6. driver.find_element_by_id("idInput").clear()
  7. driver.find_element_by_id("idInput").send_keys("liuke01")
  8. driver.find_element_by_id("pwdInput").clear()
  9. driver.find_element_by_id("pwdInput").send_keys("liuke123")
  10. driver.find_element_by_id("loginBtn").click()
  11. ....

改造:

首先,我们要分离测试对象(元素对象)和测试脚本(用例脚本),那么我们分别创建两个脚本文件, LoginPage.py 用于定义页面元素对象,每一个元素都封装成组件(可以看做存放页面元素对象的仓库)  CaseLoginTest.py 测试用例脚本。我们的实现思想,一切元素和元素的操作组件化定义在Page页面,用例脚本页面,通过调用Page中的组件对象,进行拼凑成一个登录脚本。
在写这两个脚本之前,我先对WebDriver中的一些方法进行重定义,以方便我们在写PO的时候,更简洁,快速。
 
BasePage.py:
  1. #-*- coding: utf-8 -*-
  2.  
  3. from selenium.webdriver.support.wait importWebDriverWait
  4. from selenium import webdriver
  5. classAction(object):
  6. """
  7. BasePage封装所有页面都公用的方法,例如driver, url ,FindElement等
  8. """
  9. #初始化driver、url、等
  10. def __init__(self, selenium_driver, base_url, pagetitle):
  11. self.base_url = base_url
  12. self.pagetitle = pagetitle
  13. self.driver = selenium_driver
  14.  
  15. #打开页面,校验页面链接是否加载正确
  16. def _open(self, url, pagetitle):
  17. #使用get打开访问链接地址
  18. self.driver.get(url)
  19. self.driver.maximize_window()
  20. #使用assert进行校验,打开的链接地址是否与配置的地址一致。调用on_page()方法
  21. assert self.on_page(pagetitle), u"打开开页面失败 %s"% url
  22.  
  23. #重写元素定位方法
  24. def find_element(self,*loc):
  25. #return self.driver.find_element(*loc)
  26. try:
  27. WebDriverWait(self.driver,10).until(lambda driver: driver.find_element(*loc).is_displayed())
  28. return self.driver.find_element(*loc)
  29. except:
  30. print u"%s 页面中未能找到 %s 元素"%(self, loc)
  31.  
  32. #重写switch_frame方法
  33. def switch_frame(self, loc):
  34. return self.driver.switch_to_frame(loc)
  35. #定义open方法,调用_open()进行打开链接
  36.  
  37. def open(self):
  38. self._open(self.base_url, self.pagetitle)
  39.  
  40. #使用current_url获取当前窗口Url地址,进行与配置地址作比较,返回比较结果(True False)
  41. def on_page(self, pagetitle):
  42. return pagetitle in self.driver.title
  43.  
  44. #定义script方法,用于执行js脚本,范围执行结果
  45. def script(self, src):
  46. self.driver.execute_script(src)
  47.  
  48. #重写定义send_keys方法
  49. def send_keys(self, loc, vaule, clear_first=True, click_first=True):
  50. try:
  51. loc = getattr(self,"_%s"% loc)
  52. if click_first:
  53. self.find_element(*loc).click()
  54. if clear_first:
  55. self.find_element(*loc).clear()
  56. self.find_element(*loc).send_keys(vaule)
  57. exceptAttributeError:
  58. print u"%s 页面中未能找到 %s 元素"%(self, loc)

LoginPage.py:

  1. #-*- coding: utf-8 -*-
  2.  
  3. from selenium.webdriver.common.by importBy
  4. importBasePage
  5.  
  6. #继承BasePage类
  7. classLoginPage(BasePage.Action):
  8.  
  9. #定位器,通过元素属性定位元素对象
  10. username_loc =(By.ID,"idInput")
  11. password_loc =(By.ID,"pwdInput")
  12. submit_loc =(By.ID,"loginBtn")
  13. span_loc =(By.CSS_SELECTOR,"div.error-tt>p")
  14. dynpw_loc =(By.ID,"lbDynPw")
  15. userid_loc =(By.ID,"spnUid")
  16.  
  17. #Action
  18. def open(self):
  19. #调用page中的_open打开连接
  20. self._open(self.base_url, self.pagetitle)
  21. #调用send_keys对象,输入用户名
  22. def input_username(self, username):
  23. self.find_element(*self.username_loc).send_keys(username)
  24. #调用send_keys对象,输入密码
  25. def input_password(self, password):
  26. self.find_element(*self.password_loc).send_keys(password)
  27. #调用send_keys对象,点击登录
  28. def click_submit(self):
  29. self.find_element(*self.submit_loc).click()
  30. #用户名或密码不合理是Tip框内容展示
  31. def show_span(self):
  32. return self.find_element(*self.span_loc).text
  33. #切换登录模式为动态密码登录(IE下有效)
  34. def swich_DynPw(self):
  35. self.find_element(*self.dynpw_loc).click()
  36. #登录成功页面中的用户ID查找
  37. def show_userid(self):
  38. return self.find_element(*self.userid_loc).text
  39.  
  40. CaseLoginTest.py
  41.  
  42. #-*- coding: utf-8 -*-
  43.  
  44. import sys
  45. reload(sys)
  46. sys.setdefaultencoding('utf-8')
  47. import unittest
  48. from PO importLoginPage
  49. from selenium import webdriver
  50.  
  51. classCaselogin126mail(unittest.TestCase):
  52. """
  53. 登录126邮箱的case
  54. """
  55. @classmethod
  56. def setUpClass(cls):
  57. cls.driver = webdriver.Chrome()
  58. cls.driver.implicitly_wait(30)
  59.  
  60. cls.url ="http://mail.126.com"
  61. cls.username ="liuke01"
  62. cls.password ="liuke123"
  63.  
  64. #用例执行体
  65. def test_login_mail(self):
  66. #声明LoginPage类对象
  67. login_page =LoginPage.LoginPage(self.driver, self.url, u"网易")
  68.  
  69. #调用打开页面组件
  70. login_page.open()
  71. #调用用户名输入组件
  72. login_page.input_username(self.username)
  73. #调用密码输入组件
  74. login_page.input_password(self.password)
  75. #调用点击登录按钮组件
  76. login_page.click_submit()
  77. @classmethod
  78. def tearDownClass(cls):
  79. cls.driver.quit()
  80.  
  81. if __name__ =="__main__":
  82. unittest.main()

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

Selenium的PO模式(Page Object Model)[python版]的更多相关文章

  1. Selenium的PO模式(Page Object Model)|(Selenium Webdriver For Python)

            研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数 ...

  2. Page Object Model (Selenium, Python)

    时间 2015-06-15 00:11:56  Qxf2 blog 原文  http://qxf2.com/blog/page-object-model-selenium-python/ 主题 Sel ...

  3. Appium+Python之PO模型(Page object Model)

    思考:我们进行自动化测试时,如果把代码都写在一个脚本中,代码的可读性会变差,且后期代码维护也麻烦,最好的想法就是测试对象和测试用例可以分离,可以很快定位问题,代码可读性高,也比较容易理解.这里推荐大家 ...

  4. Python+Selenium框架设计--- Page Object Model

    POM(Page Object Model):页面对象模型,POM是一种最近几年非常流行的自动化测试模型,或者思想,POM不是一个框架,就是一个解决问题的思想.采用POM的目的,是为了解决前端中UI变 ...

  5. selenium page object model

    Page Object Model (POM) & Page Factory in Selenium: Ultimate Guide 来源:http://www.guru99.com/page ...

  6. selenium 的页面对象模型Page Object

    页面对象模型page object model是selenium中的一种脚本设计模式,它能将页面元素封装起来,与业务操作分隔开, 在页面变化改变时,无需去修改业务逻辑代码,提高脚本维护的效率. 1.p ...

  7. Java&Selenium自动化测试之Page Object Model

    PO是什么: 1.页面对象模型(PO)是一种设计模式,用来管理维护一组web元素的对象库 2.在PO下,应用程序的每一个页面都有一个对应的page class 3.每一个page class维护着该w ...

  8. 基于Python Selenium Unittest PO设计模式详解

    本文章会讲述以下几个内容: 1.什么是PO设计模式(Page Object Model) 2.为什么要使用PO设计模式 3.使用PO设计模式要点 4.PO设计模式实例 1.什么是PO设计模式 (Pag ...

  9. python+selenium自动化软件测试(第7章):Page Object模式

    什么是Page ObjectModel模式Page Objects是selenium的一种测试设计模式,主要将每个页面看作是一个class.class的内容主要包括属性和方法,属性不难理解,就是这个页 ...

随机推荐

  1. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  2. 传播正能量——做一个快乐的程序员

    引子 今天在博客园看到施瓦小辛格的文章我们搞开发的为什么会感觉到累,顿时有感而发.自己本来不擅长写文章,更不擅长写这种非技术性的文章,但是在思绪喷薄之际,还是止不住有很多话要说.针对从客观上说&quo ...

  3. POCO Controller 你这么厉害,ASP.NET vNext 知道吗?

    写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 POJO 与 PO.VO 的区别 POJO 的扩展 POCO VS DTO Controller 是什么? 关于 P ...

  4. 【.net 深呼吸】限制执行代码的权限

    前面好几篇文章,老周都跟大伙伴们聊了跟应用程序域有关的话题,干脆咱们一聊到底吧,做学问就应该这样,有恒心. App Domain的创建新应用程序域的方法中,有一个特殊的重载: public stati ...

  5. Python标准模块--ContextManager

    1 模块简介 在数年前,Python 2.5 加入了一个非常特殊的关键字,就是with.with语句允许开发者创建上下文管理器.什么是上下文管理器?上下文管理器就是允许你可以自动地开始和结束一些事情. ...

  6. mybatis_个人总结

    在使用mybatis框架开发数据访问层的过程中,我在这段时间遇到很多细节问题困住我,在这里我来分享一下我遇到的坑,希望能帮到大家. 一.mybatis动态代理方式开发的规范: 1.注意在mybatis ...

  7. SDWebImage源码解读之SDWebImageCache(下)

    第六篇 前言 我们在SDWebImageCache(上)中了解了这个缓存类大概的功能是什么?那么接下来就要看看这些功能是如何实现的? 再次强调,不管是图片的缓存还是其他各种不同形式的缓存,在原理上都极 ...

  8. Java实现Excel中的NORMSDIST函数和NORMSINV函数

    由于工作中需要将Excel中的此两种函数转换成java函数,从而计算内部评级的资本占用率和资本占用金额.经过多方查阅资料和整理,总结出如下两个转换方法 标准正态分布累计函数NORMSDIST: pub ...

  9. atitit.attilax的软件 架构 理念.docx

    atitit.attilax的软件 架构 理念.docx 1. 预先规划.1 2. 全体系化1 3. 跨平台2 4. 跨语言2 5. Dsl化2 5.1. 界面ui h5化2 6. 跨架构化2 7. ...

  10. PLSql Oracle配置

    1.安装Oracle客户端或者服务端 2.配置环境变量 <1>.一般如果安装了Oracle客户端或者服务端的话,在环境变种的Path中有Oracle的安装路径(计算机-属性-高级系统设置- ...