目录

一、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模型相关推荐

  1. 自动化测试之PO模型

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

  2. UI自动化的po模型

    研究Selenium + python 自动化测试有近两个月了,不能说非常熟练,起码对selenium自动化的执行有了深入的认识. 从最初无结构的代码,到类的使用,方法封装,从原始函数调用,到重定义函 ...

  3. python+selenium实战搭建PO模型

    设计PO模式的方法: 页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库. 1.基础层base:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等. 2. ...

  4. Selenium笔记:PO模型

    所有用到的页面都定义成一个类,继承自基础的Page类 把页面中用到的元素定义成方法 把页面上一些操作定义成方法 转载于:https://www.cnblogs.com/flyin9/p/9066798 ...

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

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

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

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

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

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

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

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

  9. UI自动化框架 基于selenium+pytest和PO分层思想

    最近在编写UI自动化框架,现在将一些碎片化东西进行梳理,便于记忆 同时,为了方便于各个模块的独立管理,以及秉承高复用,低耦合的思想,这里是根据PO模型编写,同时将所有的模块进行了独立,页面和元素,以及 ...

最新文章

  1. 如何找到foreach索引
  2. xgboost防止过拟合
  3. Dubbo架构设计详解
  4. store前台数据过滤
  5. 【JUnit】BeforeClass、AfterClass、Before与After示例
  6. 查看linux系统网卡工作模式、速率等ethtool eth0
  7. 使用TensorFlow 来实现一个简单的验证码识别过程
  8. Silverlight Blend动画设计系列二:旋转动画(RotateTransform)
  9. 三分钟带你了解PPT图标
  10. mysql中自增的关键字_MySQL自增型字段的关键字是auto_increment。
  11. 2019年系统架构师考试心得
  12. VMware Workstation中部署VMware vSphere 7.0
  13. 极客日报:微信正式宣布开放外部链接;iPhone13预购开启导致苹果官网崩了;特斯拉将向车主提供新版 FSD
  14. Redis集群和应用——02
  15. [职场、征人、面试]新技术能解决多少问题?....没有标准答案的个人感言
  16. python数组内运算_Python数组介绍和操作运算详解
  17. 网络安全----数据库1
  18. 专享策略02 | 商品股指通用套利策略(一)
  19. 面试网答题(如老牛网)
  20. win10配置python虚拟环境的路径

热门文章

  1. Raspberry Pi 4和 Raspberry Pi 4B的区别_8GB内存的树莓派4来啦!国内售价589元,官方还推出配套64位系统...
  2. 汇正财经骗局?科创50大涨
  3. [大忌(。_。)]清明节外出
  4. 大学里的网络安全专业为什么没多少人就读?
  5. 服务器文件夹怎么找回来,文件过期了怎么恢复(教你一招找回微信过期文件)...
  6. 与QQ群中一屌人的聊天记录,颇有感触,贴出来,大家共勉一下哦
  7. Tsukuru Tazaki and his Years of Pilgrimage
  8. 《LDAP》LDAP自定义objectclass和属性
  9. 程序员应该如何做才能更好的实现自我价值?
  10. 01 Python学习--第一周--开课介绍、数据类型、数据运算、表达式、循环、三元运算、对象基本概念...