一、简介

  主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性。解决UI变动问题。

  page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过软件客户端都能做到。因此,它应该提供一个易于编程的接口,并隐藏窗口中底层的部件。当访问一个文本框时,应该通过一个访问方法(Access Method)实现字符串的获取与返回,复选框应当使用布尔值,按钮应当被表示为行为导向的方法名。page对象应当把在GUI控件上所有查询和操作数据的行为封装为方法。即使改变具体的元素,page对象的接口也不应当发生变化。通过给页面建模,使其对应用程序的使用者变得有意义。

  Page Object设计模式应遵循的原则:

  • 应该易于使用
  • 有清晰的结构,如PageObjects对应页面对象,PageModules对应页面内容
  • 只写测试内容,不写基础内容
  • 在可能的情况下防止样板代码
  • 不需要自己管理浏览器
  • 在运行时选择浏览器,而不是类级别
  • 不需要直接接触selenium

  Page Object的设计思想是:把元素定位与元素操作进行分层,结果是当元素发生变化时,只需要维护page层的元素定位,而不需要关心在哪些测试用例中使用了这些元素。在编写测试用例时,也不需要关心元素是如何定位的。

二、简单实现

  1.测试代码

     def test_baidu_search_case1(self):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("selenium")
self.driver.find_element_by_id("su").click() def test_baidu_search_case2(self):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("unittest")
self.driver.find_element_by_id("su").click() def test_baidu_search_case3(self):
self.driver.get(self.base_url)
self.driver.find_element_by_id("kw").send_keys("page object")
self.driver.find_element_by_id("su").click()

  这种每次都要定位元素,再对这些元素操作的重复性行为,会带来这样一个问题:就是一旦元素定位发生改变,每条测试用例都要将定位元素的代码加以修改,若是自动化测试项目中存在上百条测试用例,就会提高自动化测试用例的维护成本。

  Page Object的设计思想上是把元素定位与元素操作进行分层,当元素发生变化时,只需要维护page层的元素定位,而不需要关心在哪些测试用例当中使用了这些元素。在编写测试用例时,也不必关心元素是如何定位的。

  创建baidu_page.py文件

 class BaiduPage():

     def __init__(self, driver):
self.driver = driver def search_input(self, search_key):
self.driver.find_element_by_id("kw").send_keys(search_key) def search_button(self):
self.driver.find_element_by_id("su").click()

  创建BaiduPage类,分别封装输入搜索内容和点击确定搜索按钮的search_input()和search_button()方法,这里的封装只针对一个页面中可能会操作到的元素,原则是一个元素封装成一个方法。当元素的定位方法发生改变时,只需要维护这里的方法即可,而不必关心这个方法被哪个测试用例使用了。

 from files.PO.baidu_page import BaiduPage

 def test_baidu_search_case1(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input("selenium")
bd.search_button() def test_baidu_search_case2(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input("unittest")
bd.search_button() def test_baidu_search_case3(self):
self.driver.get(self.base_url)
bd = BaiduPage(self.driver)
bd.search_input("page object")
bd.search_button(

首先在测试中导入BaiduPage类,然后在每个测试用例中为BaiduPage类传入驱动,以便轻松地使用它封装的方法来设计具体的测试用例了。

2.改进Page Object封装

  创建base.py文件,内容如下:

 class BasePage:
"""
基础Page层,封装一些常用的方法
""" def __init__(self, driver):
self.driver = driver # 打开页面
def open(self, url=None):
if url is None:
self.driver.get(self.url)
else:
self.driver.get(url) # id定位
def by_id(self, id_):
return self.driver.find_element_by_id(id_) # name定位
def by_name(self, name_):
return self.driver.find_element_by_name(name_) # class定位
def by_class(self, class_name):
return self.driver.find_element_by_class(class_name) # Xpath定位
def by_xpath(self, xpath):
return self.driver.find_element_by_xpath(xpath) # CSS定位
def by_css(self, css):
return self.driver.find_element_by_css_selector(css) # 获取title
def get_title(self):
return self.driver.title # 获取页面text,仅使用XPath定位
def get_text(self, xpath):
return self.by_xpath(xpath).text # 执行JavaScript脚本
def js(self, script):
self.driver.execute_script(script)

创建BasePage类作为所有Page类的基类,在BasePage类中封装一些方法

  • open()方法用于打开网页,它接收一个url参数,默认为None。如果url参数为None,则默认打开子类中定义的url
  • by_id()和by_name()方法。由于Selenium提供的元素定位方法很长,这里做了简化,为的是在子类中使用更加简便
  • get_title()和get_text()方法。需要注意的是,get_text()方法需要接收元素定位,这里默认为xpath定位。

  修改后的baidu_page.py文件

 from files.PO.base import BasePage

 class BaiduPage(BasePage):
"""百度Page层,百度页面封装操作到的元素"""
url = "http://www.baidu.com" def search_input(self, search_key):
self.by_id("kw").send_keys(search_key) def search_button(self):
self.by_id("su").click()

创建BaiduPage.py类继承BasePage类,定义url变量,供父类中的open()方法使用。在测试用例中,使用BaiduPage类及它所继承的父类中的方法

 from selenium import webdriver
import unittest
from time import sleep
from files.PO.baidu_page import BaiduPage class TestBaiduSearch(unittest.TestCase): @classmethod
def setUpClass(cls):
cls.driver = webdriver.Chrome()
cls.base_url = "https://www.baidu.com" def test_baidu_search_case(self):
page = BaiduPage(self.driver)
page.open()
page.search_input("selenium")
page.search_button()
sleep(2)
self.assertEqual(page.get_title(), "selenium_百度搜索") @classmethod
def tearDownClass(cls):
cls.driver.quit() if __name__ == '__main__':
unittest.main(verbosity=2)

Page Object设计模式(一)的更多相关文章

  1. Page Object设计模式实践

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

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

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

  3. Page Object 设计模式介绍

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

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

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

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

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

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

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

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

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

  8. Selenium 2自动化测试实战39(Page Object设计模式)

    Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...

  9. 18、Page Object 设计模式

    Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...

随机推荐

  1. show processlist详解

    摘自:https://blog.csdn.net/sunqingzhong44/article/details/70570728?utm_source=copy 如果您有root权限,您可以看到所有线 ...

  2. 实现一个简易的RPC

    之前写了一些关于RPC原理的文章,但是觉得还得要实现一个.之前看到一句话觉得非常有道理,与大家共勉.不是“不要重复造轮子”,而是“不要发明轮子”,所以能造轮子还是需要造的. 如果大家还有不了解原理的, ...

  3. C++ 类模板详解(一):概念和基本使用方式

    与函数模板类似地(C++函数模板详解(一):概念和特性) ,类也可以被一种或多种类型参数化.例如,容器类就是一个具有这种特性的典型例子,它通常被用于管理某种特定类型的元素.只要使用类模板,我们就可以实 ...

  4. c++引用深入探讨

    (偶然翻起自己的旧博,忽然发现大三的时候写的这篇文章,仔细看看觉得写的还是那么回事,所以赶紧搭救出来) 引用的声明:   基本格式:引用类型 &引用名=被引用对象 &运算符:声明运算符 ...

  5. Linux基础与搭建

    1 学习目标 了解Linux的简介与安装 掌握Linux常用的命令 掌握Linux系统上JDK.Mysql.Tomcat的安装 2  Linux简介 2.1 Unix简介 Unix是一个强大的多用户. ...

  6. shell命令之一天一见:grep

    一. 简介 grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来 ...

  7. 行人重识别和车辆重识别(ReID)中的评测指标——mAP和Rank-k

    1.mAP mAP的全称是mean Average Precision,意为平均精度均值(如果按照原来的顺利翻译就是平均均值精度).这个指标是多目标检测和多标签图像分类中长常用的评测指标,因为这类任务 ...

  8. 异步并发利器:实际项目中使用CompletionService提升系统性能的一次实践

    场景 随着互联网应用的深入,很多传统行业也都需要接入到互联网.我们公司也是这样,保险核心需要和很多保险中介对接,比如阿里.京东等等.这些公司对于接口服务的性能有些比较高的要求,传统的核心无法满足要求, ...

  9. 能否不同udp socket绑定到同一IP地址和port

    http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-4.html http ...

  10. Linux中awk抽取包含某字段的整行日志

    命令示例:awk '{if($0~"listAuths") print}'   xxx.log 解释说明:抽取xxx.log整个日志文件中,包含“listAuths”的行,打印输出