Page Object设计模式

Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装。

1.认识page object
优点如下:
1.减少代码的重复
2.提高测试用例的可读性
3.提高测试用例的可维护性,特别是针对UI频繁变化的项目。

2.page object实例
下面以登录新浪邮箱为例,通过page object设计模式来实现。

#po_model.py

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
import time class Page(object):
'''基础类,用于页面对象类的继承''' login_url='https://ui.ptlogin2.qq.com/cgi-bin/login' def __init__(self,selenium_driver,base_url=login_url):
self.base_url=base_url
self.driver=selenium_driver
self.timeout=30 def on_page(self):
return self.driver.current_url==(self.base_url+self.url) def _open(self,url):
url=self.base_url+url
self.driver.get(url)
assert self.on_page(),"Did not land on %s" % url def open(self):
self._open(self.url) def find_element(self,*loc):
return self.driver.find_element(*loc) class LoginPage(Page):
'''新浪邮箱登录页面模型'''
url='/' #定位器
username_loc=(By.ID,"u")
password_loc=(By.ID,"p")
submint_loc=(By.ID,"go") #Action
def type_username(self,username):
self.find_element(*self.username_loc).send_keys(username) def type_password(self,password):
self.find_element(*self.password_loc).send_keys(password) def submit(self):
self.find_element(*self.submint_loc).click() def test_user_login(driver,username,password):
"""测试获取的用户名/密码是否可以登录"""
login_page=LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.submit() def main():
try:
driver=webdriver.Chrome()
username='xxxxxxxx'
password='xxxxxxxxxx'
test_user_login(driver,username,password)
time.sleep(10)
text=driver.find_element_by_class_name("qm_toolbarTitle").text
assert(text == u'xxxxxxx - 退出'),u"用户名称不匹配,登录失败!"
finally:
#关闭浏览器窗口
driver.close() if __name__=='__main__':
main()

  

Page object设计模式的实现方法显然使结构变得复杂了很多,下面对其逐段分析,来体会这样设计的好处。

1.创建page类

class Page(object):
'''基础类,用于页面对象类的继承''' login_url='xxxxx' def __init__(self,selenium_driver,base_url=login_url):
self.base_url=base_url
self.driver=selenium_driver
self.timeout=30 def on_page(self):
return self.driver.current_url==(self.base_url+self.url) def _open(self,url):
url=self.base_url+url
self.driver.get(url)
assert self.on_page(),"Did not land on %s" % url def open(self):
self._open(self.url) def find_element(self,*loc):
return self.driver.find_element(*loc)

首先创建一个基础类Page,在初始化方法__init__()中定义驱动(driver)、基本的URL(base_url)和超时时间(timeout)等。
定义open()方法用于打开URL网站,但它本身并未做这件事情,而是交给_open()方法来实现。关于URL地址的断言部分,则交给on_page()方法来实现,而find_element()方法用于元素的定位。

2.创建LoginPage()类

Page类中定义的这些方法都是页面操作的基本方法,下面根据登录页的特点再创建LoginPage类并继承Page类,这也是Page Object设计模式中最重要的对象层。

class LoginPage(Page):
'''新浪邮箱登录页面模型'''
url='/' #定位器
username_loc=(By.ID,"u")
password_loc=(By.ID,"p")
submint_loc=(By.ID,"go") #Action
def type_username(self,username):
self.find_element(*self.username_loc).send_keys(username) def type_password(self,password):
self.find_element(*self.password_loc).send_keys(password) def submit(self):
self.find_element(*self.submint_loc).click()

LoginPage类中主要对登录页面上的元素进行封装,使其成为更具体的操作方法。例如:用户名、密码和登录按钮都被封装成了方法。

3.创建test_user_login()函数

def test_user_login(driver,username,password):
"""测试获取的用户名/密码是否可以登录"""
login_page=LoginPage(driver)
login_page.open()
login_page.type_username(username)
login_page.type_password(password)
login_page.submit()

test_user_login()函数将单个的元素操作组成一个完整的动作,而这个动作包含了打开浏览器、输入用户名/密码,点击登录等单步操作。在使用该函数时需要将driver、username、password等信息作为函数的入参、这样该函数具有极强的可重用性。

4.创建main()函数

def main():
try:
driver=webdriver.Chrome()
username='xxxxx'
password='xxxxx'
test_user_login(driver,username,password)
time.sleep(10)
text=driver.find_element_by_class_name("qm_toolbarTitle").text
assert(text == u'xxxxx - 退出'),u"用户名称不匹配,登录失败!"
finally:
#关闭浏览器窗口
driver.close() if __name__=='__main__':
main()

main()函数更接近与用户的操作行为。对用户来说,要进行邮箱的登录,需要关心的就是通过哪个浏览器打开邮箱地址、登录的用户名和密码是什么,至于输入框、按钮是如何定位的,则不需要关心。

这样分层的好处:不同的层关心不同的问题,页面对象层只关心元素的定位问题,测试用例只关心测试的数据。

章小结:
介绍了三个知识点:利用HTMLTestRunner生成测试报告、集成自动发邮件功能和page object设计模式,虽然他们之间没有直接的联系,但是合理化的运行到自动化测试项目中将有助于自动化测试项目的开展。

Selenium 2自动化测试实战39(Page Object设计模式)的更多相关文章

  1. Selenium+java - Page Object设计模式

    前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...

  2. Python+selenium之Page Object设计模式

    Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...

  3. Selenium(十九):unittest单元测试框架(五) Page Object设计模式

    1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...

  4. selenium+Python(Page Object 设计模式实例)

    以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...

  5. web端自动化——selenium Page Object设计模式

    Page Object设计模式的优点如下: ①    减少代码的重复. ②    提高测试用例的可读性. ③    提高测试用例的可维护性,特别是针对UI频繁变化的项目. 当为Web页面编写测试时,需 ...

  6. Selenium 与自动化测试 —— 《Selenium 2 自动化测试实战》读书笔记

    背景 最近在弄 appium,然后顺便发现了 Selenium 框架和这本书,恰好这本书也介绍了一些软件测试&自动化测试的理论知识,遂拿过来学习学习.所以本文几乎没有实践内容,大多都是概念和工 ...

  7. Page Object 设计模式介绍

    Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...

  8. Page Object设计模式(一)

    一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...

  9. Page Object设计模式实践

    Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...

随机推荐

  1. Linux/Unix/Cygwin 常用命令

    以下只说明各指令的基本用法,若需详细说明,请用man去读详细的manual.[Cygwin通常没有安装 man相关的文件,所以没有man功能] 1.关于文件/目录处理的指令: 1.1 ls 这是最基本 ...

  2. Linux上jdk,mysql,tomcat安装

    一:RPM(红帽软件包管理器):相当于windows的添加/卸载程序(控制面板),进行程序的安装.更新.卸载.查看: 本地程序安装:rpm -ivh 程序名 本地程序查看:rpm -qa 本地程序卸载 ...

  3. C#中设置double类型数据的小数长度

    如果double A=1.5321654:需要将其转换为3位小数,字符串的话A.tostring(".###")就可以,输出的是1.532: 也可以用A.ToString(&quo ...

  4. 基于递归的BFS(Level-order)

    上篇中学习了二叉树的DFS深度优先搜索算法,这次学习另外一种二叉树的搜索算法:BFS,下面看一下它的概念: 有些抽象是不?下面看下整个的遍历过程的动画演示就晓得是咋回事啦: 了解其概念之后,下面看下如 ...

  5. jemeter正则

    关联 jmeter关联用正则表达式           引用名称:随便取 正则表达式: 模板:$1$(这是固定的) 匹配数字:1 缺省值:默认不成功传的值       正则表达式在相应数据里面找 把变 ...

  6. vue.js 父子组件间 props 数据同步处理

    常见的场景: 在一个vue组件A中,使用另外一个组件B.A将自己的数据通过B组件的Props属性(propX)传递到B组件实例内部,B组件内部会修改该Props属性(propX)的值,此时在A组件内部 ...

  7. python之global用法

    如果需要在函数内部改变函数外部的变量,就可以通过在函数内部声明变量为global变量.这样当程序运行至global变量便会替换外部的同名变量. 例1: # -*- coding:utf-8 -*- n ...

  8. 07—mybatis注解配置一

    常用注解Select:映射查询的sql语句.SelectProvider:Select语句的动态sql映射.允许指定一个类名和一个方法在执行时返回运行的查询语句.有两个属性:type和mehtod,t ...

  9. 请求出现Referrer Policy: no-referrer-when-downgrade

    请求出现Referrer Policy: no-referrer-when-downgrade,一直请求不成功,原因是请求连接出现问题,我这里的问题是api前少了/,导致字段和域名拼接起来,所以请求U ...

  10. NodeList对象的特点

    nodeList对象的特点1,nodeList是一种类数组对象,用于保存一组有序的节点.2,通过方括号来访问nodeList的值,有item方法与length属性.3,它并不是Array的实例,没有数 ...