一. PO模型介绍

在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率
PO模型又叫PO设计模式,是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,将页面定位和业务操作分开,也就是把对象的定位和测试脚本分开,在实际测试中只需要关注业务流程,从而提高可维护性。

优点:
重用,业务和对象分离,代码结构清晰,减少了代码的重复,方便代码维护

缺点:
造成项目结构比较复杂(因为是根据流程进行了模块化处理)

总结:PO模型实现过程是:通过面向对象的方式,对页面定位和页面操作进行分离封装(解耦合,方便后续维护)。

二. PageObject设计模式

三:PO的核心要素

1.在PO模式中抽离封装集成一个BasePage类,该基类应该拥有一个只实现webdriver实例的属性
2.每一个page都继承BasePage,通过driver来管理本page中元素,将page中的操作封装成一个个方法
3.TestCase继承unittest.Testcase类,并依赖page类,从而实现相应的测试步骤

四:代码实现淘宝将手机加入购物车

1.提供一个basepage类


from selenium.webdriver.common.action_chains import ActionChains # 鼠标点击操作
from selenium.webdriver.support.ui import WebDriverWait # 显示等待
from selenium.webdriver.support import expected_conditions as EC # 判断所需要的元素是否已经被加载出来'''BasePage封装所有界面都公用的方法。例如driver,find_element等'''
class BasePage():# 实例化def __init__(self,driver):self.driver=driver# 进入网址def get(self,url):self.driver.get(url)# 元素定位def get_element(self,*locator):return self.driver.find_element(*locator)# 点击def left_click(self,*locator):ActionChains(self.driver).click(self.get_element(*locator)).perform()# 输入def send_text(self,text,*locator):self.driver.find_element(*locator).send_keys(text)#  清除def clear_text(self,*locator):self.driver.find_element(*locator).clear()# 表单切换def switch_iframe(self,*locator):self.driver.switch_to.iframe(self.driver.find_element(*locator))# 窗口切换def switch_window(self,n):self.driver.switch_to.window(self.driver.window_handles[n])# 显示等待def find_element_by_wait(self, *locator):element = WebDriverWait(self.driver, 10, 0.5).until(EC.presence_of_all_elements_located((locator[0], locator[1])))return element

2.提供多个page(界面操作)

page1:在游览器中访问百度

from taobao.basepage.base_page import BasePageclass OpenBDPage(BasePage):# 初始化BsePage类的驱动def __init__(self,driver):BasePage.__init__(self,driver)# 打开百度def open_baidu(self,url):self.get(url)

page2:在百度输入淘宝并点击

from taobao.basepage.base_page import BasePage
from selenium.webdriver.common.by import Byclass SearchBDPage(BasePage):# 初始化BsePage类的驱动def __init__(self,driver):BasePage.__init__(self,driver)# 百度的输入框def input_data(self,text):self.send_text(text,By.ID,'kw')# 点击百度一下def click_baidu(self):self.left_click(By.ID,'su')# 点击 淘 我喜欢def click_taobao(self):self.left_click(By.XPATH,".//*[@id='1']/h3/a[1]")

page3:多标签处理,点击登录扫描二维码

from po.Base.base_page6 import BasePage
from selenium.webdriver.common.by import Byclass WindowBDPage(BasePage):# 初始化BsePage类的驱动def __init__(self,driver):BasePage.__init__(self,driver)# 多标签操作def switch_window_taobao(self,n):self.switch_window(1)# 点击亲,请登录def click_login(self):self.left_click(By.CSS_SELECTOR,"a.h:nth-child(1)")# 点击二维码def click_qrcode(self):self.left_click(By.CSS_SELECTOR,".icon-qrcode")

page4:搜索商品,选择包邮,筛选价格,选择手机

from po.Base.base_page6 import BasePage
from selenium.webdriver.common.by import Byclass TaoBaoPage(BasePage):# 初始化BsePage类的驱动def __init__(self,driver):BasePage.__init__(self,driver)# 淘宝内的输入def input_data(self,text):self.send_text(text,By.ID,'q')# 点击搜索def click_search(self):self.left_click(By.CSS_SELECTOR,".btn-search")# 点击包邮def click_baoyou(self):self.left_click(By.CSS_SELECTOR,"a.filter:nth-child(1) > span:nth-child(1)")# 输入最低价格def send_min_price(self,text):self.send_text(text,By.CSS_SELECTOR,"div.inputs:nth-child(1) > div:nth-child(1) > ul:nth-child(1) > li:nth-child(1) > input:nth-child(1)")# 输入最高价格def send_max_price(self,text):self.send_text(text,By.CSS_SELECTOR,"div.inputs:nth-child(1) > div:nth-child(1) > ul:nth-child(1) > li:nth-child(3) > input:nth-child(1)")# 点击确定def click_confirm(self):self.left_click(By.CSS_SELECTOR,".J_SortbarPriceSubmit")# 点击选择手机def click_phone(self):self.left_click(By.CSS_SELECTOR,"#J_Itemlist_Pic_653968396721")

page5:多标签处理,选择颜色,容量,加入购物车并查看

from po.Base.base_page6 import BasePage
from selenium.webdriver.common.by import Byclass WindowTBPage(BasePage):# 初始化BsePage类的驱动def __init__(self, driver):BasePage.__init__(self, driver)# 多标签操作def switch_window_phone(self, n):self.switch_window(2)# 点击机身颜色def click_color(self):self.left_click(By.CSS_SELECTOR,"li.tb-txt:nth-child(15) > a:nth-child(1) > span:nth-child(1)")# 点击存储容量def click_store(self):self.left_click(By.CSS_SELECTOR,"dl.J_Prop:nth-child(3) > dd:nth-child(2) > ul:nth-child(1) > li:nth-child(4) > a:nth-child(1) > span:nth-child(1)")# 点击加入购物车def click_shoping(self):self.left_click(By.CSS_SELECTOR,".J_LinkAdd")# 点击购物车查看def click_shopping_car(self):self.left_click(By.CSS_SELECTOR,"#mc-menu-hd > span:nth-child(2)")

3.单元测试

执行测试用例的前置、后置条件,写测试用例,进行实例化,调用方法

import unittest
from selenium import webdriver
from taobao.pages.page01 import OpenBDPage
from taobao.pages.page02 import SearchBDPage
from taobao.pages.page03 import WindowBDPage
from taobao.pages.page04 import TaoBaoPage
from taobao.pages.page05 import WindowTBPage
import timeclass TaoBaoTest(unittest.TestCase):# 执行测试用例的前置条件@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Firefox()cls.driver.maximize_window()cls.driver.implicitly_wait(30)def test_01(self):p1=OpenBDPage(self.driver)p1.open_baidu('http://www.baidu.com')def test_02(self):p2=SearchBDPage(self.driver)p2.input_data('淘宝官网')p2.click_baidu()p2.click_taobao()def test_03(self):p3=WindowBDPage(self.driver)p3.switch_window_taobao(1)p3.click_login()p3.click_qrcode()def test_04(self):p4=TaoBaoPage(self.driver)p4.input_data('苹果13')p4.click_search()p4.click_baoyou()p4.send_min_price(5000)p4.send_max_price(50000)time.sleep(2)p4.click_confirm()p4.click_phone()def test_05(self):p5=WindowTBPage(self.driver)p5.switch_window_phone(2)p5.click_color()p5.click_store()p5.click_shoping()p5.click_shopping_car()# 执行测试用例的后置条件@classmethoddef tearDownClass(cls) -> None:cls.driver.quit()if __name__ == '__main__':unittest.main()

4.生成html测试报告

import unittest
from taobao.testcase.tbtestcase import TaoBaoTest
from po.data.HTMLTestRunner import HTMLTestRunner
class HtmlClass():def htmlMethod(self):suite = unittest.TestSuite()# 创建测试套件case_list = ["test_01","test_02","test_03","test_04","test_05"]for case in case_list:suite.addTest(TaoBaoTest(case))with open("../report.html","wb") as f:HTMLTestRunner(stream=f,title="淘宝加入购物车",description="测试一期",verbosity=2).run(suite)
htmlclass = HtmlClass()
htmlclass.htmlMethod()

5.测试报告展示

6.组织代码

五:PO模式的优点

1:PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰
2:页面对象与用例分离,使得我们更好的复用对象
3:可复用的页面方法代码会变得更加优化
4:更加有效的命令方式使得我们更加清晰的知道方法所操作的UI元素

Python+Selenium+PO模型实现自动化测试相关推荐

  1. Python+Selenium PO模式Web自动化测试实战

    1.项目结构 2.BASE层封装代码 # -- coding: UTF-8 -- import datetime import os from selenium.webdriver.support.s ...

  2. python写web自动化_使用Python+selenium实现第一个自动化测试脚本

    原标题:使用Python+selenium实现第一个自动化测试脚本 最近在学web自动化,记录一下学习过程. 此处我选用python3.6+selenium3.0,均用最新版本,以适应未来需求. 环境 ...

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

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

  4. 使用po模型进行自动化测试

    编写公用的父类方法 from selenium import webdriver from selenium.webdriver.common.action_chains import ActionC ...

  5. Python+Selenium简单实现Web自动化测试

    这篇文章是入门级别的应用Python + Selenium进行自动化测试,包括环境搭建及简单的实例.基本思想是用Firefox Selenium IDE插件录制脚本并生成Python代码,用Pytho ...

  6. Python Web自动化测试学习-PO模型在自动化测试中的应用(2)

    公共方法篇 用例生成 页面封装 test pages basePage.py 基础页面封装 # -*-coding:utf-8-*- import os from time import sleep ...

  7. python selenium po模式_Python+Selenium+Unittest实现PO模式web自动化框架

    1)效率高 :PO模式的逻辑层方法有具体定义,元素发生变化修改逻辑层,业务层不变.这样看来结构简单清晰,舒服更符合人类习惯, 普通方式就是继续堆case. 2) 复用多收益大: 同样这里如果逻辑复用越 ...

  8. python selenium 验证码识别_Pythonseleniumtesseract自动化测试随机码、验证码(Captcha)的OCR识别解决方案参考...

    在自动化测试或者安全渗透测试中,Captcha验证码的问题经常困扰我们,还好现在OCR和AI逐渐发展起来,在这块解决上越来越支撑到位. 我推荐的几种方式,一种是对于简单的验证码,用开源的一些OCR图片 ...

  9. python+selenium+EcShop 学习UI自动化测试和感受自动化测试的魅力(UI自动化)

    哈喽!小伙伴们好,你们的朋友像疯一样!又来了,这次分享的是学习UI自动化测试环境和让小伙伴们感受到自动化测试的魅力,实现计算机控制网站.学习路上虽有困难,但是我们一起向前,加油!与前一期一样,文末会有 ...

最新文章

  1. python psycopg2_Ubuntu 安装 PostgreSQL 和 python-psycopg2基础教程(以及错误解决)
  2. C语言函数strcmp()(比较两个字符串)
  3. 网页内置html5游戏,爽爆HTML5网页游戏!教你怎么精选浏览器
  4. 【计算机网络】——流量控制与可靠传输机制
  5. leetcode - 494. 目标和
  6. 太阳能光伏发电行业将重入佳境
  7. 计算机窗口的基本组成部分组成部分,windows7窗口的主要组成部分有哪些
  8. Bootstrap练习:百度登录框
  9. 金融理财产品后台原型|Axure原型
  10. You should consider upgrading via the
  11. gb2312的字符串(包括中午)转16进制字符串以及反转义原始字符
  12. java minma_Java Core.minMaxLoc方法代码示例
  13. linux查询当前目录剩余空间,如何在linux下查看目录的剩余空间大小
  14. HTTP上传数据 :表单,二进制数据(multipart/form-data application/octet-stream boundary)...
  15. python预测糖尿病_实战 | 糖尿病预测项目
  16. Visio 中插入的Excel 如何只显示数据部分?
  17. Arduino物联网开发实例教程
  18. 【POJ3093】Margaritas on the River Walk【01背包变种】
  19. 关于ie下阻止ActiveX控件
  20. 上海汉得校园招聘面试经历

热门文章

  1. P3812 【模板】线性基
  2. Linux之磁盘概述
  3. Spring boot定制错误页面
  4. 一个Github项目搞定微信、QQ、支付宝等第三方登录
  5. linux下安装java环境(ubuntu和centos)
  6. “面试不败计划”:垃圾垃圾回收
  7. Windows的cmd ping不通vmware的linux系统ip
  8. springmvc教程--注解开发基础详解
  9. 图片按钮ImageButton
  10. javascript的window.open()详解