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. Hadoop_21_MapReduce程序实现Join功能

    1.序列化与Writable接口 1.1.hadoop的序列化格式 序列化和反序列化就是结构化对象和字节流之间的转换,主要用在内部进程的通讯和持久化存储方面 hadoop在节点间的内部通讯使用的是RP ...

  2. set调用add报错:

    Map<String, String> goodsStandMap = new HashMap<>();goodsStandMap.put("key1", ...

  3. Redis入门(一)——安装

    1.下载地址,选择对应版本 https://github.com/dmajkic/redis/downloads 2.下载解压后,进入到文件夹,地址栏cmd,redis-server.exe redi ...

  4. 06—mybatis缓存机制

    MyBatis缓存分为一级缓存和二级缓存 一级缓存MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何 ...

  5. NOI2018 你的名字——SAM+线段树合并

    题目链接在这里洛谷/LOJ 题目大意 有一个串\(S\),每次询问给你一个串\(T\),两个数\(L\)和\(R\),问你\(T\)有多少个本质不同的子串不是\(S[L,R]\)的子串 SOLUTIO ...

  6. Python 字符串 (3) 持续更新

    字符串操作 虽然字符串也是一种序列,但是它和元组一样,不可变的.当你想对它修改时,会引发异常.如 >>> strings = "Let's go">> ...

  7. k8s-应用部署

    该demo主要作为一个dubbo项目通过maven自动化docker打包插件发布到镜像仓库样例工程.该wiki后面同时会提供k8s部署zk,mysql,应用包的整个过程.该项目大体功能:zk作为注册中 ...

  8. C# ado.net 操作存储过程(二)

    调用存储过程 sql IF OBJECT_ID('RegionInsert') IS NULL EXEC (' -- -- Procedure which inserts a region recor ...

  9. C语言--变量

    unsigned int 和 int 对计算机来讲没有区别, 只有在输出的时候, 计算机根据%d 和 %u 判断是否有符号位. %d 输出有符号的整数, %u 输出无符号整数. 无符号的整数比有符号的 ...

  10. closest(expr|object|element)

    closest(expr|object|element) 概述 jQuery 1.3新增.从元素本身开始,逐级向上级元素匹配,并返回最先匹配的元素..大理石平台生产厂 closest会首先检查当前元素 ...