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. C# Winfrom UI 美化

    Winfrom UI 美化 此处只做演示,未进行页面布局.... 1.CSkin:此处只显示一种样式供参考,可继承其他样式——略 2.MetroFramework.Design 3.Ribbon 4. ...

  2. Pycharm Community 配置 Django 开发环境

    1. 安装数据库可视化工具 Database Navigator 2. 括号匹配高亮工具 HighlightBracketPair (...) Web 开发放弃 Pycharm Community 版 ...

  3. wmware虚拟化的启动问题

    2019-05-09,14点14 vmware出现VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统.但是,无法执行 64 位操作.解决方案 进入bios里面intel 虚拟化技术 先设 ...

  4. CF311B Cats Transport(斜率优化)

    题目描述 Zxr960115 是一个大农场主.他养了m只可爱的猫子,雇佣了p个铲屎官.这里有一条又直又长的道路穿过了农场,有n个山丘坐落在道路周围,编号自左往右从1到n.山丘i与山丘i-1的距离是Di ...

  5. 操作mysql 中文乱码情况

    解决方法  : 在连接字符串中设置charset=utf8  即可正常添加中文字符 <add name="mtgzghEntities" connectionString=& ...

  6. [2019牛客多校第二场][A. Eddy Walker]

    题目链接:https://ac.nowcoder.com/acm/contest/882/A 题目大意:圆上有\(n\)个点,标号从\(0\)到\(n-1\),初始一个人在点\(0\),每次会等概率向 ...

  7. docker管理

    查看容器名 [root@docker ~]# docker inspect -f "{{.Name}}" a2f /u1 停止/启动终止状态的容器 [root@docker ~]# ...

  8. Laravel 多态关联中不能使用 has, whereHas

    ghost commented on Apr 13, 2017 • edited by ghost  i'm currently using this code in my own project m ...

  9. could not load file or assembly "System.Web.Mvc...

    1.一般出现这个错误是因为Web.Config里面的版本号跟project用到的dll版本对应不上 更改webconfig <add assembly="System.Web.Mvc, ...

  10. Hibernate 5 升级后 getProperties 错误

    升级到 Hibernate 5 后,提示有错误: org.hibernate.engine.spi.SessionFactoryImplementor.getProperties()Ljava/uti ...