自动化测试框架开发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的更多相关文章

  1. Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介

    前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...

  2. RobotFramework自动化测试框架-使用Python编写自定义的RobotFramework Lib

    使用Python构建Lib工程 可以用来开发Python Lib的IDE工具有很多,常见的有Pycharm,Eclipse with PyDev插件等,而且在RobotFramework官网中也已经提 ...

  3. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  4. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  5. Python Selenium设计模式-POM

    前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...

  6. 转 Python Selenium设计模式-POM

    前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...

  7. 学会这个,助你升值加薪自动化框架之python+selenium+pytest

    1.概述 selenium: 基于JavaScript代码库的自动化测试框架,通过脚本语言,模拟用户行为操作,最接近用户真实场景,实现对web自动测试. Selenium,是目前的最火爆企业最主流的w ...

  8. 简陋版:基于python的自动化测试框架开发

    项目背景: XXXX银行项目采用的是B/S架构,主要是为了解决银行业务中的柜员.凭证.现金.账务等来自存款.贷款.会计模块的管理. 手工弊端: 1.项目业务复杂度高,回归测试工作量大2.单个接口功能比 ...

  9. 自动化测试_Mac安装python+selenium

    1.下载安装(参照下文) https://blog.csdn.net/kacylining/article/details/60587484 https://www.zhihu.com/questio ...

  10. python selenium设计模式POM

    POM模式是什么 页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库 在POM模式下,应用程序的每一个页面都有一个对的page class 每一个page class维护着该w ...

随机推荐

  1. Xcode 自动化构建问题梳理

    一.Xcode Xcode是mac OS平台上面开发的官方IDE,可以用来开发iOS应用和mac应用.随着iOS系统的升级,Xcode也会更新,而且是强制更新. Xcode每次版本更新稳定性很差,经常 ...

  2. 8.16考试总结(NOIP模拟41)[你相信引力吗·marshland·party?·半夜]

    美丽的不是这个世界,而是看世界的你的眼神. T1 你相信引力吗 解题思路 好像只有我一个人没有看出来这个题是单调栈(现在一看区间问题就是双指针,线段树) 维护一个单调递减的栈. 我们把最大值放到左端点 ...

  3. 【Effective C++】设计与声明——reference篇

    以pass-by-reference-to-const替换pass-by-value 缺省情况下C++以by value方式传递对象至(或来自)函数.除非你另外指定,否则函数参数都是以实际实参的复件( ...

  4. js随机数 比较运算符

       // 生成一个随机数 1 - 100 范围内的随机数         // 大家先记住 JavaScript 生成随机数值的 公式         // 如果要 生成 a - b  范围内的数值 ...

  5. 剑指Offer-64.滑动窗口的最大值(C++/Java)

    题目: 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6, ...

  6. mysql8 windows 数据库名 表名 大小写

    由于Apollo的SQL 脚本是大小写的.mysql8 默认又是纯小写的. 解决方法: 方法1.卸载MYSQL,重新安装MYSQL时,高级选项中指定区分大写小.这种会清空所有库和数据.不建议. 方法2 ...

  7. cent os docker yum源

    国外镜像一般很难访问,建议配置阿里云镜像.yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/ ...

  8. 架构与思维:了解Http 和 Https的区别(图文详解)

    1 介绍 随着 HTTPS 的不断普及和使用成本的下降,现阶段大部分的系统都已经开始用上 HTTPS 协议. HTTPS 与 HTTP 相比, 主打的就是安全概念,相关的知识如 SSL .非对称加密. ...

  9. kafka集群

    对于运维需要掌握的kafka基础操作,读写管理掌握后,下一步就是集群部署搭建了. 1. kafka天然支持集群 2. kafka将集群状态写入zookeeper. 集群部署 1. 确保zk启动 [de ...

  10. (六)基于Scrapy爬取网易新闻中的新闻数据

    需求:爬取这国内.国际.军事.航空.无人机模块下的新闻信息 1.找到这五个板块对应的url  2.进入每个模块请求新闻信息 我们可以明显发现''加载中'',因此我们判断新闻数据是动态加载出来的. 3. ...