自动化测试框架开发python selenium excel POM
自动化测试框架开发python selenium excel POM
本文主要是采用python selenium excel POM 做UI自动化测试
测试框架选用的是unittest
测试框架用的是POM分层设计
测试数据用的是excel
测试报告用的是excel
测试日志用的是logging模块
分层结构主要分为:base层,page层,data层,case层,logging层
首先是base层:
#!/usr/bin/env python
# -*- coding: utf-8 -*- class Base():
def __init__(self,driver):
self.driver = driver def open_url(self,url):
self.driver.get(url) def click(self,locator):
self.driver.find_element(*locator).click() def input_text(self,locator,text):
self.driver.find_element(*locator).send_keys(text) def element_text(self,locator):
return self.driver.find_element(*locator).text
page层:
from selenium.webdriver.common.by import By
from ui_auto_test001.base import Base class HomePage(Base): goto_login_page = (By.ID, 'xxxxxxx') def __init__(self, driver):
super().__init__(driver) def click_login(self,url):
self.open_url(url)
self.click(self.goto_login_page)
class LoginPage(Base):
input_phoneNumber = (By.ID, 'xxxxxxx')
input_Password = (By.ID, 'xxxxxxx')
login_Button = (By.ID, 'xxxxxxx')
locate_mark = (By.ID, 'xxxxxxx')
login_failed_reason = (By.ID, 'xxxxxxx') def __init__(self, driver):
super().__init__(driver) def input_phone_number(self, phone_number):
self.input_text(self.input_phone_number, phone_number) def input_password(self, password):
self.input_text(self.input_Password, password) def click_login_button(self):
self.click(self.login_Button)
return self.get_actual_login_status() def get_login_failed_reason(self):
return self.element_text(self.login_failed_reason) def get_actual_login_status(self):
if self.is_element_displayed(self.locate_mark):
return self.get_login_failed_reason()
else:
return '登入成功'
case层:
from ui_auto_test001.HomePage import HomePage
from ui_auto_test001.LoginPage import LoginPage
from ui_auto_test001.TestData import GetTestData
from ui_auto_test001.TestResult import TestResult
from ui_auto_test001.baselog import get_logger log = get_logger() get_test_data = GetTestData()
write_test_result = TestResult()
test_data_list = get_test_data.get_test_data @ddt
class TestLogin(unittest.TestCase): def setUp(self):
self.driver = webdriver.Chrome()
self.driver.implicitly_wait(4)
self.driver.maximize_window()
self.home_page = HomePage(self.driver)
self.login_page = LoginPage(self.driver) def tearDown(self):
self.driver.quit() @data(*test_data_list)
@unpack
def test_login_001(self, url, phone_number, password, expext_result):
try:
self.home_page.click_login(url)
self.login_page.input_phone_number(phone_number)
self.login_page.input_password(password)
actual_login_result = self.login_page.click_login_button()
if expext_result.encode('utf-8') == actual_login_result.encode('utf-8'):
write_test_result.write_test_result('Pass')
else:
write_test_result.write_test_result('Fail')
except Exception as e:
log.info(e)
actual_login_result = 'Fail,something wrong'
write_test_result.write_test_result('Fail:{}'.format(actual_login_result))
write_test_result.write_actual_result(actual_login_result)
self.driver.quit() if __name__ == '__main__':
unittest.main()
data层:
class GetTestData(): def __init__(self):
self.excel = xlrd.open_workbook('../test_report/test_report.xlsx')
self.sheet = self.excel.sheet_by_name('test_data')
self.rows = self.sheet.nrows
self.cols = self.sheet.ncols @property
def get_test_data(self):
data_list = []
data = []
for row in range(1 ,self.rows):
for i in self.sheet.row_values(row ,1 ,5):
if type(i) == float:
data.append(int(i))
else:
data.append(i)
data_list.append(data)
data =[] # 移除测试数据
return data_list def test_result(self):
for row in range(1, self.rows):
self.sheet.cell_value(row, 7)
import xlrd
import openpyxl class TestResult():
def __init__(self):
self.excel = openpyxl.load_workbook('../test_report/test_report.xlsx')
self.sheet = self.excel['test_data']
self.num = 2
self.result = 2 def write_actual_result(self,actual_result):
self.sheet.cell(row=self.num,column=6,value=actual_result)
self.num +=1
self.close_excel() def write_test_result(self,test_result):
self.sheet.cell(row=self.result,column=7,value=test_result)
self.result +=1
self.close_excel()
def close_excel(self):
self.excel.save('../test_report/test_report.xlsx')
logging层:
import logging
import os
import sys
import time
from logging.handlers import RotatingFileHandler
try:
iteration_time = os.environ['WEBSERVICE_ITERATION_RUN_TIME']
except KeyError:
iteration_time = time.strftime("%Y-%m-%d_%H_%M_%S") # 如果去掉下面这一句,生成的日志就和testcase处于同一个文件夹下面
ROOT_DIR = os.path.abspath(os.path.curdir) ROOT_DIR = os.path.dirname(ROOT_DIR) # sys.path.append(ROOT_DIR)
logFile = os.path.join(ROOT_DIR, 'logs')
logFile = os.path.join(logFile, iteration_time)
logLevel = 3 _logLevel = {
1: logging.NOTSET,
2: logging.DEBUG,
3: logging.INFO,
4: logging.WARNING,
5: logging.ERROR,
6: logging.CRITICAL
} def get_logger():
funcName = sys._getframe().f_back.f_code.co_filename
script_name = funcName.split(os.sep)[-1].split('.')[0] log_level = logLevel
log_path = logFile
if os.path.exists(log_path):
log_file = os.path.join(log_path, script_name + '.log')
else:
os.makedirs(r'%s' % log_path)
log_file = os.path.join(log_path, script_name + '.log') logger = logging.getLogger()
logger.setLevel(_logLevel[log_level])
if not logger.handlers:
ch = logging.StreamHandler()
ch.setLevel(_logLevel[log_level])
rh = RotatingFileHandler(log_file, maxBytes=10 * 1024 * 1024, backupCount=5, encoding='utf-8')
rh.setLevel(_logLevel[log_level])
formatter = logging.Formatter('%(asctime)s [%(filename)s][line:%(lineno)d][%(name)s][%(levelname)s] %(message)s')
ch.setFormatter(formatter)
rh.setFormatter(formatter)
logger.addHandler(ch)
logger.addHandler(rh)
return logger
自动化测试框架开发python selenium excel POM的更多相关文章
- Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介
前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...
- RobotFramework自动化测试框架-使用Python编写自定义的RobotFramework Lib
使用Python构建Lib工程 可以用来开发Python Lib的IDE工具有很多,常见的有Pycharm,Eclipse with PyDev插件等,而且在RobotFramework官网中也已经提 ...
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)
1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...
- Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- 转 Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- 学会这个,助你升值加薪自动化框架之python+selenium+pytest
1.概述 selenium: 基于JavaScript代码库的自动化测试框架,通过脚本语言,模拟用户行为操作,最接近用户真实场景,实现对web自动测试. Selenium,是目前的最火爆企业最主流的w ...
- 简陋版:基于python的自动化测试框架开发
项目背景: XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员.凭证.现金.账务等来自存款.贷款.会计模块的管理. 手工弊端: 1.项目业务复杂度高,回归测试工作量大2.单个接口功能比 ...
- 自动化测试_Mac安装python+selenium
1.下载安装(参照下文) https://blog.csdn.net/kacylining/article/details/60587484 https://www.zhihu.com/questio ...
- python selenium设计模式POM
POM模式是什么 页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库 在POM模式下,应用程序的每一个页面都有一个对的page class 每一个page class维护着该w ...
随机推荐
- C++笔记(11)工厂模式
建议直接空降至参考文献,点击链接 简单工厂模式 #include<iostream> using namespace std; class BasicCamera { public: vi ...
- 解决 idea web项目没有小蓝点的问题
在idea导入web项目,项目没有显示小蓝点,无法添加 java文件和运行.如下图的springboot-schedule 和 springboot-test 都没有蓝点: 解决方案一: 点击 Fil ...
- 代码审计——基础(JAVAEE)
JAVAEE 目录 JAVAEE 常见框架 Struct2(控制层) Hibernate(持久层(与数据库交互)(不用再写简单的sql语句,但是需要一些列复杂的配置文件))(全ORM模型) Sprin ...
- 使用Vulkan-Loader将ncnn代码改成Dynamic Loader Vulkan的形式
原本你写的程序是静态链接的系统的vulkan-1.dll,如果系统不存在vulkan-1.dll,则会直接崩溃. 关于将ncnn静态链接vulkan改成动态加载vulkan的形式,然后提供这两个函数 ...
- 思迅Pay PC ,WIN7 ,KB3042058
思迅Pay PC ,WIN7, COM , 串口 . 577,驱动. WIN7 SHA256补丁,KB3033929,https://www.microsoft.com/zh-CN/download/ ...
- post请求 restTemplate.postForObject restTemplate.postForEntity java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to xxx POSTpost请求
1.restTemplate调用的两种方式及获取字符串转换对象model的处理,统一按接收字符串,然后gson转换为对象的方式. ResponseData对象包含的属性private String r ...
- GIT 生成变更历史文件清单
脚本搞定git文件版本变化信息,解决部署种变更的审核和统计信息工作复杂问题 git diff --name-status --ignore-cr-at-eol --ignore-space-at-eo ...
- MYSQL中怎么查询LONGBLOB类型数据的大小
在MySQL中,LONGBLOB 是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据.但是,LONGBLOB 数据类型本身并不直接存储数据的大小(长度).它存储的是二进制数据的实际内容. ...
- MoneyPrinterPlus:AI自动短视频生成工具-微软云配置详解
MoneyPrinterPlus可以使用大模型自动生成短视频,我们可以借助Azure提供的语音服务来实现语音合成和语音识别的功能. Azure的语音服务应该是我用过的效果最好的服务了,微软还得是微软. ...
- 处理 3d 视频的简单理论基础
背景 公司产品需要满足一些带有3d功能的应用场景,需要需要懂得如何处理3d信号.之前在调试以前产品的时候,发现处理3d信号的时候,是由2个画面叠加起来的. 导言 3D视频(或3D信号)为什么是两个画面 ...