系列文章目录

Day01 软件测试基础总结

Day02 测试用例知识点总结(上)

Day03 测试用例知识点总结(下)

Day04 禅道-从安装到卸载

Day05 MySql的基础使用

Day06 MySql知识点总结

Day07 MySql知识点再总结与多表查询

Day08 redis的基础知识

Day08 VMware的安装、Linux系统安装和Linux基础命令

Day09 Linux常用命令总结

Day10 Linux环境部署和项目构建

Day11 shell脚本基础知识

Day12 接口和协议

Day13 Postman的使用

Day13 Windows环境下的JDK安装与Tomcat的启动

Day14 jenkins部署

Day15 jenkins的简单使用

Day16 charles的基本使用

Day17 考试

Day18 考试

Day19 Fiddler的简单使用

Day20 Python基础

Day21 python 语句基础

Day22 Python数据类型(上)

Day23 Python数据类型(下)

Day24 Python函数

Day25 Python的文件操作和异常处理

Day26 Python面向对象

Day27 Python的部分算法

Day28 单元测试 unittest

Day29 单元测试 pytest

Day30 接口测试requests

Day31 Web端自动化基础

Day32 Web自动化进阶

Day33 PO模型


目录

系列文章目录

前言

一、PO模型

1.核心要素

2.组织代码

3.优缺点

二、实际操作

三、持续集成

1.环境准备

2.辅助找文件代码

四、识别图片文字

1.需要的包

2.操作流程

总结


前言

在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率。


一、PO模型

优点:重用,业务和对象分离,代码结构清晰,方便代码维护。

1.核心要素

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

2.组织代码

PO设计模式中的BasePage基类对应案例中的basepage.py文件
PO模式中的pages中的案例显示home_page.py
PO模式设计中TestCase对应案例中的test_jhsj.py

3.优缺点

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

二、实际操作

使用PO模型进行一次自动化测试

场景为使用聚合数据

基类 basepage.py

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains   #鼠标操作
class BasePage():def __init__(self,driver):self.driver = driver#访问项目def get_url(self,url):self.driver.get(url)#元素定位def local_element(self,*kargs):return self.driver.find_element(*kargs)#点击元素def click_element(self,*kargs):# ActionChains(self.driver).click(self.local_element(*kargs)).perform()self.local_element(*kargs).click()#输入数据def input_data(self,text,*kargs):self.local_element(*kargs).send_keys(text)# 表单切换def switch_iframe(self, *locator):self.driver.switch_to.frame(self.driver.find_element(*locator))# 窗口切换def switch_window(self, n):self.driver.switch_to.window(self.driver.window_handles[n])#url断言def assert_result_url(self, url):return self.driver.current_url == url#title断言def assert_result_title(self, titles):return self.driver.title == titles#截图def screenshot(self,name):self.driver.get_screenshot_as_file(name)

页面,每个页面都有一个模块,并且继承基类

主页 home_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import By
class HomePageClass(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#访问聚合数据def request_URL(self,url):self.get_url(url)#点击登录按钮def click_Login(self):self.click_element(By.XPATH,'/html/body/header/div/div[2]/div[2]/a[1]')

登录页面 login_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import By
class LoginPageClass(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#输入账号def input_account(self,text):self.input_data(text,By.ID,'username')#输入密码def input_password(self,text):self.input_data(text,By.ID,'password-o')#点击登录def click_login(self):self.click_element(By.XPATH,'/html/body/div[1]/div[2]/div/form/input[2]')

登录成功后进入的页面 personal_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import By
class PersonalPageClass(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#点击个人中心def click_personal(self):self.click_element(By.XPATH,'/html/body/header/div/div[2]/div[2]/a[1]')

个人中心页面与图片提取文字操作(适用于简单的验证码) personalcenter_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import By
from PIL import Image #图片操作
import pytesseract #识别图片文字/规则的,不规则的识别不了,需要花钱
class PersonalCenterPageClass(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#点击数据中心def click_dataceter(self):self.click_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[3]/div[2]/div[1]/span')#点击我的APIdef click_myAPI(self):self.click_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[3]/div[2]/div[2]/div[1]/div')#截图def screen(self):self.screenshot('p1.png')#定位图片,在图片上截取需要的部分def local_picture(self):p=self.local_element(By.XPATH,'/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[3]/div[1]/div[1]/div[2]/div[1]/dl/dt/span')# left=p.location['x']# top=p.location['y']# right=left+p.size['width']# bottom=top+p.size['height']img1 = Image.open('p1.png')# img2 = img1.crop((left,top,right,bottom))img2 = img1.crop((570,390,900,415))img2.save('p2.png')#识别图片def p_t(self):img=Image.open(r'p2.png')pt=pytesseract.image_to_string(img)print(pt)return ptfrom basepage.basepage import BasePage
from selenium.webdriver.common.by import By
from PIL import Image #图片操作
import pytesseract #识别图片文字/规则的,不规则的识别不了,需要花钱
class PersonalCenterPageClass(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#点击数据中心def click_dataceter(self):self.click_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[3]/div[2]/div[1]/span')#点击我的APIdef click_myAPI(self):self.click_element(By.XPATH,'//*[@id="app"]/div/div[1]/div[3]/div[2]/div[2]/div[1]/div')#截图def screen(self):self.screenshot('p1.png')#定位图片,在图片上截取需要的部分def local_picture(self):p=self.local_element(By.XPATH,'/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[3]/div[1]/div[1]/div[2]/div[1]/dl/dt/span')# left=p.location['x']# top=p.location['y']# right=left+p.size['width']# bottom=top+p.size['height']img1 = Image.open('p1.png')# img2 = img1.crop((left,top,right,bottom))img2 = img1.crop((570,390,900,415))img2.save('p2.png')#识别图片def p_t(self):img=Image.open(r'p2.png')pt=pytesseract.image_to_string(img)print(pt)return pt

开通VIP vip_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import Byclass Vip(BasePage):def __int__(self,driver):BasePage.__init__(self,driver)#点击开通会员def click_vip(self):self.click_element(By.XPATH,'//*[@id="app"]/div/div[2]/div[2]/div/div/div[3]/div[1]/div[1]/div[2]/div[3]/a')

跳转页面与退出 vipcenter_page.py

from basepage.basepage import BasePage
from selenium.webdriver.common.by import Byclass VipCenter(BasePage):def __init__(self,driver):BasePage.__init__(self,driver)#跳转页面def switch_window_page(self):self.switch_window(1)#点击退出def click_quit(self):self.click_element(By.XPATH,'//*[@id="logout"]')

测试用例与断言 test_jhsj.py

import sys,os,unittest,time
curPath = os.path.abspath(os.path.dirname(__file__))
rootpath = os.path.split(curPath)[0]
sys.path.append(rootpath)
from selenium import webdriver
from pages.home_page import HomePageClass
from pages.login_page import LoginPageClass
from pages.personal_page import PersonalPageClass
from pages.personalcenter_page import PersonalCenterPageClass
from pages.vip import Vip
from pages.vipcenter_page import VipCenterclass TestJHSJ(unittest.TestCase):@classmethoddef setUpClass(cls) -> None:cls.driver=webdriver.Edge()cls.driver.implicitly_wait(30)cls.driver.maximize_window()def test_homepage(self):page=HomePageClass(self.driver)page.request_URL('https://www.juhe.cn/')page.click_Login()#设置断言page.assert_result_title('聚合数据-登录')def test_login(self):page=LoginPageClass(self.driver)page.input_account('sunlife_jing')page.input_password('01478523690x')page.click_login()#设置断言page.assert_result_title('API-API接口-数据服务专家-「聚合数据」')def test_personal(self):page=PersonalPageClass(self.driver)page.click_personal()# 设置断言page.assert_result_title('聚合数据-个人中心')def test_personalcenter(self):page=PersonalCenterPageClass(self.driver)page.click_dataceter()page.click_myAPI()time.sleep(2)page.screen()page.local_picture()page.p_t()#设置断言page.assert_result_url('https://dashboard.juhe.cn/data/index/my')def test_vip(self):page=Vip(self.driver)page.click_vip()# 设置断言page.assert_result_url('https://www.juhe.cn/vipCenter')def test_vipcenter(self):page=VipCenter(self.driver)page.switch_window_page()page.click_quit()@classmethoddef tearDownClass(cls) -> None:time.sleep(2)cls.driver.quit()if __name__ == '__main__':unittest.main()

三、持续集成

使用jenkins控制,执行DOS命令,使程序定时执行等

1.环境准备

需要tomcat,jenkins等

参照jdk与tomcat的安装与postman+newman+jenkins的安装 进行环境的配置与安装

2.辅助找文件代码

持续集成操作,本质上是使用jenkins控制,执行DOS命令,但是一个项目有许多文件与包,所以需要下面的代码才能使DOS命令正常执行

import sys,os
curPath = os.path.abspath(os.path.dirname(__file__))
rootpath = os.path.split(curPath)[0]
sys.path.append(rootpath)

注意:识别图片的包不能在DOS中执行,所以需要注释掉

四、识别图片文字

图片识别文字多用于验证码

1.需要的包

from PIL import Image #图片操作
import pytesseract #识别图片文字/规则的,不规则的识别不了,需要花钱

pytesseract 的使用还需要安装tesseract.exe程序,

并且将  项目的\venv\Lib\site-packages\pytesseract\pytesseract.py  中的

tesseract_cmd = 'tesseract'修改为你的tesseract程序的安装位置

tesseract_cmd = r'安装位置'

2.操作流程

1.截取整个页面的图片

2.定位验证码的位置,获得验证码图片的大小(位置与大小的值皆为字典)

3.通过步骤2所得数据,计算出验证码图片的左、上、右、下的值

4.使用crop方法放入元组(left,top,right,bottom)获得验证码图片并保存

5.使用pytesseract.image_to_string('验证码图片名')方法提取图片文字

    #截图def screen(self):self.screenshot('p1.png')#定位图片,在图片上截取需要的部分def local_picture(self):p=self.local_element(By.XPATH,'xpath') #获取需要截取图片的位置p,p是字典 left=p.location['x'] #取得x值为左top=p.location['y'] #取得y值为上right=left+p.size['width'] #x值加宽为右(size取得的值也是字典)bottom=top+p.size['height'] #y值加高为下(size取得的值也是字典)img1 = Image.open('p1.png') #打开页面截图img2 = img1.crop((left,top,right,bottom)) #在页面截图上截取需要的部分图片img2.save('p2.png') #保存新截取的图片#识别图片def p_t(self):img=Image.open(r'p2.png') #打开需要识别的图片pt=pytesseract.image_to_string(img) #识别图片内容print(pt)return pt

实例中的图片文字提取直接使用数值,是因为我提取的不是一个图片,导致无法使用,只能通过工具直接定位得到数值,输入到crop中截取需要的图片。


总结

po模型
    梳理业务,业务中的界面进行拆分
    在basepage模块中封装公共方法
    有多少个界面创建多个page页,继承basepage,调用里面的方法,实现自己的业务
    在测试用例中导入unittesst模块,导入page页,有多个的page设计多个测试用例,在测试用例中设置断言
    导入htmltestrunner.py模块,生成测试报告

Day33 PO模型相关推荐

  1. Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型

    1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...

  2. Python+Selenium+PO模型实现自动化测试

    一. PO模型介绍 在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率 PO模型又叫PO设计模式 ...

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

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

  4. Selenium基于Python web自动化测试框架 —— PO模型

    目录 1.前言: 2.PO模型的概念和理解: 3.PO模型的目录结构: 4.PO代码示例: 5.总结 6.重点:配套学习资料和视频教学 1.前言: 关于selenium测试框架首先想到的就是PO模型, ...

  5. po模型+unittest测试

    po模型 一.PO模型介绍 二.PO的核心 三.非op模型实现 四.op模型实现 1.包含内容 2.代码实现(多页面) 一.PO模型介绍 在自动化中,Selenium自动化测试中有一个名字经常被提及P ...

  6. selenium自动化之PO模型

    目录 一.selenium: 1.定位: 2.加载url 3.输入 4.点击 5.清除 6.获取文本内容 7.获取属性 8.切换/窗口切换 8.1Frame切换 8.2窗口切换: 9.等待 二.log ...

  7. PO模型(设计模式)

    文章目录 什么是PO模型 PO优点: PO的核心 实例 什么是PO模型 PO模型全称:Page Object(思想与面向对象的特征相同),也叫PO设计模式.他的出现主要是为了解决自动化测试中代码量增加 ...

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

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

  9. Python+Selenium WebUI自动化框架 -- 实现特殊PO模型

    前言: 设计执行格式,封装PO模型工厂,实现PO模型脱离代码,一套代码执行所有项目的UI自动化,让UI自动化框架脱离高成本.低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试 ...

最新文章

  1. Lync前端服务器的卸载
  2. python绘制双Y轴折线图以及单Y轴双变量柱状图
  3. android view xml,如何将View添加到XML布局android
  4. Linux内核Socket参数调优
  5. 有关 VS Code 的五大谣言,背后的真相到底是如何的?
  6. C++ Primer(第五版)第七章 类 部分答案
  7. python批处理栅格转点_python获取栅格点和面值的实现
  8. iOS:图片相关(19-05-09更)
  9. java从外部得到数据_java – 如何实现Observer以从侦听器获取数据?
  10. KCdoes NetUSB 严重漏洞影响多家厂商的数百万台路由器
  11. 组态王opc_组态王做 OPC Cilent
  12. 2018-2019-1 20165309 《信息安全系统设计基础》第一周学习总结
  13. 浅谈Redis基本数据类型底层编码(含C源码)
  14. 计算机视觉应用培训心得体会,三维计算机视觉学习感想
  15. 360安全浏览器极速模式怎么设置
  16. AndroidImageSlider三分钟快速集成酷炫自动轮播广告
  17. codeblocks编译运行后出现无效的16位应用程序,不兼容64位windows
  18. f7功能键使用计算机,F1到F12都代表什么 电脑键盘上F1-F12键的用法
  19. 你还不知道钉钉服务端API全局错误码吗?
  20. html中table整体缩小,html-如何缩小表格样式中的间隙?

热门文章

  1. 世界杯开幕,boss直聘被骂惨
  2. Faster-Rcnn给Proposals分配标签
  3. 第十一课:树莓派语音控制空调
  4. 实战练习----原生js实现闹钟
  5. BrainTumorSeg
  6. Android 中选项菜单(Option menu)的用法
  7. LINUX文件管理与编辑命令2
  8. 微软出品免费待办事项管理工具Microsoft To-Do for Mac
  9. 裂变增长如何一路升级打怪
  10. 微信小程序开发中的相关记录