自动化测试框架开发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. redis RDB AOF数据持久化

    目录 redis RDB持久化[手工持久化]: redis RDB持久化条件配置[适合用于备份]redis rdb持久化策略 redis AOF持久化 redis AOF持久化配置 redis RDB ...

  2. 震惊!docker镜像还有这些知识,你都知道吗?----镜像(二)

    镜像查看 查看镜像 [root@hmm-docker ~]# docker images REPOSITORY#镜像仓库 TAG #标签 IMAGE ID#镜像id CREATED #创建时间 SIZ ...

  3. idea mapper xml 文件报红

    在使用 idea 打开 mapper 文件,出现一下报红错误: 可以看到数据表和字段都是红色的. 解决方案 打开设置,window版本是打开Settings: 找到 Languages & F ...

  4. 分布式定理--CAP定理

    cap定理指的是,在一个分布式系统中,只能满足cap中的两项. C consistency 一致性 A availability 可用性 P partition tolerance 分区可容错性 -- ...

  5. Java实现延迟执行代码

    Java实现延迟执行代码对于Java程序在它们的操作中添加延迟或暂停是比较常见的.这对于任务暂停直到另外任务完成执行场景比较有用.本文我们提供两类方法实现延迟执行. 1. 基于线程(Thread)方法 ...

  6. work07

    day08作业: 必做题:============================================================ 第一题: 定义一个字符串s = "Hell ...

  7. .NET周刊【6月第2期 2024-06-09】

    国内文章 C#开源实用的工具类库,集成超过1000多种扩展方法 https://www.cnblogs.com/Can-daydayup/p/18230586 文章介绍了一个免费的C#工具类库Z.Ex ...

  8. java8 多条件的filter过滤

    java8 多条件的filter过滤 package com.example.core.mydemo.java; import java.io.Serializable; import java.ti ...

  9. Excel poi 设置单元格格式 发现不可读内容 已修复的记录: /xl/worksheets/sheet1.xml 部分的问题(巨坑)

    Excel poi 设置单元格格式 发现不可读内容 已修复的记录: /xl/worksheets/sheet1.xml 部分的问题(巨坑) 1.先设置值,后设置样式. 正确的是:先设置样式,后设置值. ...

  10. Linux chmod -bash: ./xx.sh: Permission denied的解决方案

    Linux -bash: ./xx.sh: Permission denied的解决方案启动tomcat命令:./startup.sh之后提示-bash: ./startup.sh: Permissi ...