selenium自动化之PO模型
目录
一、selenium:
1.定位:
2.加载url
3.输入
4.点击
5.清除
6.获取文本内容
7.获取属性
8.切换/窗口切换
8.1Frame切换
8.2窗口切换:
9.等待
二、logging模块简介
三、什么是PO?
1.简介
2.设计的原则
3.PO模型的实现
四、代码
4.1Logger
4.2Base_Page
4.3报告
在讲解PO模型之前先给大家巩固下selenium与logger,代码附在了最后
一、selenium:
1.定位:
webdriver提供了18种(注意是18种,不是8种)的元素定位方法,前面8种是通过元素的属性来直接定位的,后面的xpath和css定位更加灵活,需要重点掌握其中一个。前八种是大家都熟悉的,经常会用到的:
1.id定位:find_element_by_id(self, id_)
2.name定位:find_element_by_name(self, name)
3.class定位:find_element_by_class_name(self, name)
4.tag定位:find_element_by_tag_name(self, name)
5.link定位:find_element_by_link_text(self, link_text)
6.partial_link定位find_element_by_partial_link_text(self, link_text)
7.xpath定位:find_element_by_xpath(self, xpath)
8.css定位:find_element_by_css_selector(self, css_selector)
9.id复数定位find_elements_by_id(self, id_)
10.name复数定位find_elements_by_name(self, name)
11.class复数定位find_elements_by_class_name(self, name)
12.tag复数定位find_elements_by_tag_name(self, name)
13.link复数定位find_elements_by_link_text(self, text)
14.partial_link复数定位find_elements_by_partial_link_text(self, link_text)
15.xpath复数定位find_elements_by_xpath(self, xpath)
16.css复数定位find_elements_by_css_selector(self, css_selector
17.find_element(self, by='id', value=None)
18.find_elements(self, by='id', value=None)
2.加载url
driver.get(url)
3.输入
find_element(self,loc).send_keys(text)
4.点击
find_element(self,loc).click()
5.清除
find_element(self,loc).clear()
6.获取文本内容
find_element(self,loc).text
7.获取属性
find_element(self,loc).get_attribute(name)
8.切换/窗口切换
8.1Frame切换
切换到frame
wd.switch_to.frame(frame_reference)
切回原来的主html
wd.switch_to.default_content()
8.2窗口切换:
wd.switch_to.window(handle)
9.等待
timd.sleep(固定等待)
implicitly_wait(隐式等待)
WebDriverWait(显示等待)
#等待元素可见
WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.XPATH,loc)))
#等待元素不可见
WebDriverWait(self.driver,timeout,poll_frequency).until_not(EC.visibility_of_element_located((By.XPATH,loc)))
二、logging模块简介
logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:
可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;
尽管可以在Python代码中配置logging,但是这样并不够灵活,最好的方法是使用一个配置文件来配置。在Python 2.7及以后的版本中,可以从字典中加载logging配置,也就意味着可以通过文件加载日志的配置。
然后通过logging.config.fileConfig(filename)来调用写好的配置文件,运行可以看到调用正常
三、什么是PO?
1.简介
在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率,页面对象模型(PO)是一种设计模式,用来管理维护一组页面元素的对象库.在PO下,应用程序的每一个页面都有一个对应的Page类.每一个Page类维护着该页面的元素集和操作这些元素的方法.怎么设计PO?
2.设计的原则
1.抽象每一个页面
2.页面中元素不暴露,仅报错操作元素的方法
3.页面不应该有繁琐的继承关系
4.页面中不是所有元素都需要涉及到,核型业务元素做建模使用
5.把页面划分功能模块,在Page中实现这些功能方法
3.PO模型的实现
专业介绍完毕,但是没接触过的小伙伴看到这些俗不可耐的介绍肯定会头蒙的,下面来跟我一起有效探索PO模型吧,本文不讲基础,只讲解思想与实现,基础还需要各位自己巩固。
我所理解的PO模型就是将一个完整的代码划分模块然后分块管理,我这边主要划分为底层封装(关键),配置文件,数据管理,输出,页面操作相关,测试用例等几个模块
详细划分如下:
下面看下对selenium封装的一个实现,
使用logger进行一个log打印,打印完之后进行元素的查找,查找完毕后打印日志表示查找成功,然后进行输入操作,若操作失败则截图保存到对应路径中,
截图代码如下,
页面操作文件(.py)
四、代码
4.1Logger
#log.conf [loggers] keys=root,file,fileAndConsole [handlers] keys=fileHandler,consoleHandler [formatters] keys=simpleFormatter[logger_root] level=DEBUG handlers=consoleHandler [logger_file] level=DEBUG handlers=fileHandler qualname=file propagate=1 [logger_fileAndConsole] level=DEBUG handlers=fileHandler,consoleHandler qualname=fileAndConsole propagate=0[handler_fileHandler] class=FileHandler args=(".\\OutPuts\\Log\\_log.log",'a','utf-8') level=DEBUG formatter=simpleFormatter[handler_consoleHandler] class=StreamHandler args=(sys.stdout,) level=DEBUG formatter=simpleFormatter[formatter_simpleFormatter] format=%(asctime)s %(filename)s %(levelname)s %(message)s
#define_log.py import logging import logging.config from os import path from BasePage.global_param import conf_log #调用logging 配置文件 并打印log class DefineLog:def setLoger(self):print(conf_log)#读取配置文件中的内容logging.config.fileConfig(conf_log)#选择模式输出到控制台和文件中logger = logging.getLogger('fileAndConsole')return loggerif __name__ == '__main__':de = DefineLog()logger = de.setLoger()#正常输出log信息logger.info('info')logger.debug('debug')
4.2Base_Page
#Base_Page import time from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from BasePage.define_log import DefineLog from BasePage.global_param import img_path#基础页面操作配置 如点击、查找元素、输入。。。 class BasePage:def __init__(self,driver):self.driver = driverself.defineLog = DefineLog()# fileHandler,consoleHandlerself.logger = self.defineLog.setLoger()#打开对应的urldef open_url(self,url):self.driver.get(url)#等待元素可见def wait_element_visible(self,loc,timeout=150,poll_frequency=0.5,model=None):self.logger.info('{}--等待元素可见--{}'.format(model,loc))print(2.2)try:start = time.time()WebDriverWait(self.driver,timeout,poll_frequency).until(EC.visibility_of_element_located((By.XPATH,loc)))end = time.time()print('等待时长:%.2f 秒' % (end - start))except:self.save_webImage(model)raise#等待一个元素不可见def wait_element_no_visible(self,loc,timeout=7,poll_frequency=0.5,model=None):""":param loc: 元素定位表达(定位元素类型,元素定位方法):param timeout: 等待的上限:param poll_frequency: 轮询频率:param model: 等待失败时截图操作:return: None"""print('{}--等待元素不可见:{}'.format(model,loc))try:start = time.time()WebDriverWait(self.driver,timeout,poll_frequency).until_not(EC.visibility_of_element_located((By.XPATH,loc)))end = time.time()print('等待时长:%.2f 秒'%(end-start))except:print('{}等待元素不可见失败:{}'.format(model,loc))#截图self.save_webImage(model)raise#查找一个元素elementdef find_elements(self,loc,model=None):self.logger.info('{}--等待元素可见--{}'.format(model,loc))try:return self.driver.find_element(By.XPATH,*loc)except:print('查找元素失败')#截图self.save_webImage(model)raise#输入操作def input_text(self,loc,text,model=None):#查找元素element = self.driver.find_element(By.XPATH,loc)#打印日志self.logger.info('{}在元素{}中输入文本:{}'.format(model,loc,text))try:#进行输入操作element.send_keys(text)except:print('输入操作失败')#若操作失败后截图self.save_webImage(model)raisedef send_key(self,key):ActionChains(self.driver).send_keys(key).perform()#点击操作def click_element(self,loc,model=None):#先查找元素在点击element = self.driver.find_element(By.XPATH,loc)#点击操作self.logger.info('{}在元素{}中点击'.format(model, loc))try:element.click()except:print('点击操作失败')#截图self.save_webImage(model)raise#清除操作def clean_text(self,loc,model=None):element = self.find_element(By.XPATH,loc)#清除操作self.logger.info('{}在元素{}中清除'.format(model,loc))try:element.clear()except:print('清除失败')#截图self.save_webImage(model)raise# 获取文本内容def get_text(self, loc, model=None):# 先查找元素在获取文本内容ele = self.find_element(By.XPATH,loc)# 获取文本self.logger.info('{} 在元素 {} 中获取文本'.format(model, loc))try:text = ele.textprint('{} 元素 {} 的文本内容为 {}'.format(model, loc, text))return textexcept:print('获取元素 {} 的文本内容失败,报错信息如下:'.format(loc))# 截图self.save_webImgs(model)raise# 获取属性值def get_element_attribute(self, loc, name,model=None):# 先查找元素在去获取属性值ele = self.find_element(By.XPATH,loc)# 获取元素属性值self.logger.info('{} 在元素 {} 中获取属性值'.format(model, loc))try:ele_attribute = ele.get_attribute(name)print('{} 元素 {} 的文本内容为 {}'.format(model, loc, ele_attribute))return ele_attributeexcept:print('获取元素 {} 的属性值失败,报错信息如下:'.format(loc))self.save_webImgs(model)raise#截图def save_webImage(self,model=None):#filepath:图片保存目录/model(页面功能名称)_当前时间到秒.pngfilePath ='{}{}.png'.format(img_path,model)print(filePath)try:self.driver.save_screenshot(filePath)print('截图成功,图片路径为{}'.format(filePath))except:print('截屏失败!')
4.3报告
#run.py import unittest from BasePage.global_param import test_case_path,report_name from HtmlTestRunner import HTMLTestRunner"""运行文件""" if __name__ == '__main__':discover = unittest.defaultTestLoader.discover(r"./",pattern='test*.py')with open(report_name,'w') as f:runner =HTMLTestRunner(stream=f,report_title='test1',report_name='result.html',verbosity=2,descriptions='运行结果')runner.run(discover)
selenium自动化之PO模型相关推荐
- 自动化测试之PO模型
一. PO模型介绍 在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率 二.PO的核心要素 1. ...
- UI自动化的po模型
研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数调用,到重定义函 ...
- python+selenium实战搭建PO模型
设计PO模式的方法: 页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库. 1.基础层base:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等. 2. ...
- Selenium笔记:PO模型
所有用到的页面都定义成一个类,继承自基础的Page类 把页面中用到的元素定义成方法 把页面上一些操作定义成方法 转载于:https://www.cnblogs.com/flyin9/p/9066798 ...
- Python+Selenium WebUI自动化框架 -- 实现特殊PO模型
前言: 设计执行格式,封装PO模型工厂,实现PO模型脱离代码,一套代码执行所有项目的UI自动化,让UI自动化框架脱离高成本.低效率时代,将用例的重用性贯彻到极致,让烦人的PO模型变得无所谓,让一个测试 ...
- Selenium+Python ---- 免登录、等待、unittest单元测试框架、PO模型
1.免登录在进行测试的过程中难免会遇到登录的情况,给测试工作添加了工作量,本文仅提供一些思路供参考解决方式:手动请求中添加cookies.火狐的profile文件记录信息实现.人工介入.万能验证码.去 ...
- Python+Selenium+PO模型实现自动化测试
一. PO模型介绍 在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相 同),通常PO模型可以大大提高测试用例的维护效率 PO模型又叫PO设计模式 ...
- Selenium基于Python web自动化测试框架 —— PO模型
目录 1.前言: 2.PO模型的概念和理解: 3.PO模型的目录结构: 4.PO代码示例: 5.总结 6.重点:配套学习资料和视频教学 1.前言: 关于selenium测试框架首先想到的就是PO模型, ...
- UI自动化框架 基于selenium+pytest和PO分层思想
最近在编写UI自动化框架,现在将一些碎片化东西进行梳理,便于记忆 同时,为了方便于各个模块的独立管理,以及秉承高复用,低耦合的思想,这里是根据PO模型编写,同时将所有的模块进行了独立,页面和元素,以及 ...
最新文章
- 如何找到foreach索引
- xgboost防止过拟合
- Dubbo架构设计详解
- store前台数据过滤
- 【JUnit】BeforeClass、AfterClass、Before与After示例
- 查看linux系统网卡工作模式、速率等ethtool eth0
- 使用TensorFlow 来实现一个简单的验证码识别过程
- Silverlight Blend动画设计系列二:旋转动画(RotateTransform)
- 三分钟带你了解PPT图标
- mysql中自增的关键字_MySQL自增型字段的关键字是auto_increment。
- 2019年系统架构师考试心得
- VMware Workstation中部署VMware vSphere 7.0
- 极客日报:微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD
- Redis集群和应用——02
- [职场、征人、面试]新技术能解决多少问题?....没有标准答案的个人感言
- python数组内运算_Python数组介绍和操作运算详解
- 网络安全----数据库1
- 专享策略02 | 商品股指通用套利策略(一)
- 面试网答题(如老牛网)
- win10配置python虚拟环境的路径
热门文章
- Raspberry Pi 4和 Raspberry Pi 4B的区别_8GB内存的树莓派4来啦!国内售价589元,官方还推出配套64位系统...
- 汇正财经骗局?科创50大涨
- [大忌(。_。)]清明节外出
- 大学里的网络安全专业为什么没多少人就读?
- 服务器文件夹怎么找回来,文件过期了怎么恢复(教你一招找回微信过期文件)...
- 与QQ群中一屌人的聊天记录,颇有感触,贴出来,大家共勉一下哦
- Tsukuru Tazaki and his Years of Pilgrimage
- 《LDAP》LDAP自定义objectclass和属性
- 程序员应该如何做才能更好的实现自我价值?
- 01 Python学习--第一周--开课介绍、数据类型、数据运算、表达式、循环、三元运算、对象基本概念...