在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个framework文件夹,在文件夹下新建Base_Page.py文件,这是用来写测试基类的文件。在项目下新建screenshots文件件,用来存放截图。项目结构如下。

具体怎么封装还是要看被测试需要什么,只能提供一个大致思路,我项目能用的封装,你项目并不一定能用

测试基类的思路就是把所有能公用的方法全部封装,并加上日志输出。报错截图等。

看下Base_Page.py下具体代码

from Logs.log import log1
from selenium.common.exceptions import NoSuchElementException
import getcwd
import os
import time class BasePage:
"""测试基类""" def __init__(self, driver):
self.driver = driver @staticmethod
def isdisplayed(element):
"""元素是否存在"""
value = element.is_displayed()
return value @staticmethod
def my_sleep(secondes):
"""强制等待"""
time.sleep(secondes)
log1.info('暂停%d秒' % secondes) def get_img(self):
"""截图"""
path = os.path.join(getcwd.get_cwd(), 'screenshots/') # 拼接截图保存路径
rq = time.strftime('%Y%m%d%H%M', time.localtime(time.time())) # 按格式获取当前时间
screen_name = path + rq + '.png' # 拼接截图文件名
# noinspection PyBroadException
try:
self.driver.get_screenshot_as_file(screen_name)
log1.info("截图保存成功")
except BaseException:
log1.error("截图失败", exc_info=1) def find_element(self, selector):
"""定位元素"""
by = selector[0]
value = selector[1]
element = None
if by in ['id', 'name', 'class', 'tag', 'link', 'plink', 'css', 'xpath']:
# noinspection PyBroadException
try:
if by == 'id':
element = self.driver.find_element_by_id(value)
elif by == 'name':
element = self.driver.find_element_by_name(value)
elif by == 'class':
element = self.driver.find_element_by_class_name(value)
elif by == 'tag':
element = self.driver.find_element_by_tag_name(value)
elif by == 'link':
element = self.driver.find_element_by_link_text(value)
elif by == 'plink':
element = self.driver.find_element_by_partial_link_text(value)
elif by == 'css':
element = self.driver.find_element_by_css_selector(value)
elif by == 'xpath':
element = self.driver.find_element_by_xpath(value)
else:
log1.error('没有找到元素')
log1.info('元素定位成功。定位方式:%s,使用的值%s:' % (by, value))
return element
except NoSuchElementException:
log1.error("报错信息:", exc_info=1)
self.get_img() # 调用截图
else:
log1.error('输入的元素定位方式错误') def type(self, selector, value):
"""输入内容"""
element = self.find_element(selector)
element.clear()
log1.info('清空输入内容')
# noinspection PyBroadException
try:
element.send_keys(value)
log1.info('输入的内容:%s' % value)
except BaseException:
log1.error('内容输入报错', exc_info=1)
self.get_img() def click(self, selector):
"""点击元素"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
element.click()
log1.info('点击元素成功')
except BaseException:
display = self.isdisplayed(element)
if display is True:
self.my_sleep(3)
element.click()
log1.info('点击元素成功')
else:
self.get_img()
log1.error('点击元素报错', exc_info=1) def use_js(self, js):
"""调用js"""
# noinspection PyBroadException
try:
self.driver.execute_script(js)
log1.info('js执行成功,js内容为:%s' % js)
except BaseException:
log1.error('js执行报错', exc_info=1) def switch_menue(self, parentelement, secelement, targetelement):
"""三级菜单切换"""
self.my_sleep(3)
# noinspection PyBroadException
try:
self.driver.switch_to_default_content()
self.click(parentelement)
log1.info('成功点击一级菜单:%s' % parentelement)
self.click(secelement)
log1.info('成功点击二级菜单:%s' % secelement)
self.click(targetelement)
log1.info('成功点击三级菜单:%s' % targetelement)
except BaseException:
log1.error('切换菜单报错', exc_info=1) def switch_ifarme(self, selector):
"""切换farm"""
element = self.find_element(selector)
# noinspection PyBroadException
try:
self.driver.switch_to.frame(element)
log1.info('切换frame成功')
except BaseException:
log1.error('切换frame报错', exc_info=1) def get_title(self):
"""获取title"""
title = self.driver.title
log1.info('当前窗口的title是:%s' % title)
return title def my_quit(self):
"""关闭浏览器"""
self.driver.quit()
log1.info('关闭浏览器')

说一下点击的方法为什么要这么封装,有一些时候,元素明明能定位到,但是就是点击不到。这是因为一些渲染和js技术的原因。导致元素没有加载出来,这时候去点击肯定会报错,提示元素不存在。所以这里当报错的时候,强制等待几秒。然后再去点击。

只写了一部分,提供一个思路,还有很多方法可以继续封装来完善框架,比如窗口切换等。

接下来测试一下封装的代码

在test_base.py写如下代码并运行

from selenium import webdriver
from framework.Base_Page import BasePage
dr = webdriver.Firefox()
dr.get('https:www.baidu.com')
s = dr.window_handles
driver = BasePage(dr)
kw = ['id','kw']
driver.type(kw,'selenium+python')
driver.my_sleep(3)
driver.type(kw,'selenium')
su = ['id','su']
driver.click(su)
driver.get_img()
driver.my_sleep(2)
driver.get_title()

python3+selenium框架设计04-封装测试基类的更多相关文章

  1. python3+selenium框架设计02-自动化测试框架需要什么

    什么是自动化测试框架 自动化测试框架能够提供便利给用户高效完成一些事情,比如,结构清晰开发脚本,多种方式.平台执行脚本,良好的日志和报告去跟踪脚本执行结果. 关于自动化测试框架的定义有很多,在我大致理 ...

  2. python3+selenium框架设计06-编写POM测试用例

    之前我们已经把测试基类,配置文件操作,浏览器引擎类封装完成.接下来使用POM的设计思路来创建我们的测试用例.接下来看一个实例,先在项目下新建pageobject文件夹.这个文件夹下放所有要测试的页面类 ...

  3. python3+selenium框架设计05-配置文件和浏览器引擎类

    python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,可以自行百度学习,也可以看Python3学习笔记27-ConfigParser模块 配置文件一般存放着环境信息,比如u ...

  4. python3+selenium框架设计01-Page Object

    页面对象模型Page Object Modal是一种脚本设计模型,将页面元素,业务操作分割,当实际页面发生变化的时候,只需要修改页面元素文件,业务操作不需要修改. 具体实现需要先写一个页面公共类,里面 ...

  5. python3+selenium框架设计03-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  6. python3+selenium框架设计10-发送邮件

    使用python3的email模块和smtplib模块可以实现发送邮件的动能.email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并 ...

  7. python3+selenium框架设计07-unittest单元测试框架

    可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. ​ 在entrance ...

  8. python3+selenium框架设计09-生成测试报告

    使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...

  9. python3+selenium框架设计08-进一步实现POM

    之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...

随机推荐

  1. Kafka权威指南 读书笔记之(四)Kafka 消费者一一从 Kafka读取数据

    KafkaConsumer概念 消费者和消费者群组 Kafka 消费者从属于消费者群组.一个群组里的消费者订阅的是同一个主题,每个消费者接收主题一部分分区的消息. 往群组里增加消费者是横向伸缩消费能力 ...

  2. Git(工作区和暂存区概念)

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 先来看名词解释. 工作区(Working Directory) 就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工 ...

  3. DNSLOG的Payload

    命令执行处 linux curl http://ip.port.b182oj.ceye.io/`whoami` ping `whoami`.ip.port.b182oj.ceye.io windows ...

  4. 【1】【leetcode-79】 单词搜索

    (典型dfs,知道思想写错) 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单 ...

  5. 2018牛客网暑期ACM多校训练营(第九场)A -Circulant Matrix(FWT)

    分析 大佬说看样例就像和卷积有关. 把题目化简成a*x=b,这是个xor的FWT. FWT的讲解请看:https://www.cnblogs.com/cjyyb/p/9065615.html 那么要求 ...

  6. 用jQuery和Json实现Ajax异步请求

    这里有两个例子,一个是关于登录验证的,一个是异步加载数据的 1.regist.jsp <%@ page language="java" import="java.u ...

  7. IL 学习笔记

    先上几篇博客链接: 一步步教你读懂NET中IL(图文详解) C#基础之IL 详解.NET IL代码 C# IL DASM 使用 你必须知道的.NET <C# to IL>.<Expe ...

  8. 三十九、Linux 线程——线程的同步和互斥

    39.1 概念 线程同步 是一个宏观概念,在微观上包含线程的相互排斥和线程先后执行的约束问题 解决同步方式 条件变量 线程信号量 线程互斥 线程执行的相互排斥 解决互斥的方式 互斥锁 读写锁 线程信号 ...

  9. 【python小练】0020

    第 0020 题: 登陆中国联通网上营业厅 后选择「自助服务」 --> 「详单查询」,然后选择你要查询的时间段,点击「查询」按钮,查询结果页面的最下方,点击「导出」,就会生成类似于 2014年1 ...

  10. 前段js的各种弹出框

    artDialog 首页 > 文档与示例 artDialog —— 经典的网页对话框组件,内外皆用心雕琢. 支持普通与 12 方向气泡状对话框 完善的焦点处理,自动焦点附加与回退 支持 ARIA ...