当前位置: 首页 > news >正文

python+selenium+PO模式

1、目录结构

2、get_data.py

import xlrd
from data.url import *
class Get_data:def data_x(self):  #获取xlsx文件测试用例test_data = []data = xlrd.open_workbook(r'D:\jkcs\pythonbiji\python自动化\selenium自动化框架\Test_unittest\selenium_unittest练习\data\data_xlsx.xlsx')table = data.sheet_by_index(0)  #nrows = table.nrows  #获取行数for i in range(nrows):test_data.append(table.row_values(i))return test_data[1:]def data_url(self):  #获取urlurl=URLreturn urldef element(self):element_data = []delement = xlrd.open_workbook(r'D:\jkcs\pythonbiji\python自动化\selenium自动化框架\Test_unittest\selenium_unittest练习\data\find_elements.xlsx')table2 = delement.sheet_by_index(0)  #nrows = table2.nrows  # 获取行数for i in range(nrows):element_data.append(table2.row_values(i))return element_data[1:]
# x=[Get_data().data_x()[0]]
# print(x)

3、report.py

import logging
import time
import HTMLTestRunner
class Report():def compelet_log(self):#创建记录器logger=logging.getLogger('OATest')logger.setLevel(logging.DEBUG)#创建文件处理器file_handler=logging.FileHandler(r"D:\jkcs\pythonbiji\python自动化\selenium自动化框架\Test_unittest\selenium_unittest练习\log\loginlog.log",encoding="utf-8")file_handler.setLevel(logging.DEBUG)#创建控制台处理器console_handler=logging.StreamHandler()console_handler.setLevel(logging.INFO)#格式化formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')file_handler.setFormatter(formatter)console_handler.setFormatter(formatter)logger.addHandler(file_handler)logger.addHandler(console_handler)return loggerdef take_screenshot(self,name):   #截图函数self.timestamp = time.strftime("%Y%m%d %H%M%S")self.file_path = r"D:/jkcs/pythonbiji/python自动化/selenium自动化框架/Test_unittest/selenium_unittest练习/log/"file_name=self.file_path+f"{name}_{self.timestamp}.png"return file_namedef HTMl_report(self,test_suite):file_path=r'D:\jkcs\pythonbiji\python自动化\selenium自动化框架\Test_unittest\selenium_unittest练习\log\run_result_%s.html'% time.strftime('%Y%m%d%H%M%S')file=open(file_path,'wb')runner=HTMLTestRunner.HTMLTestRunner(stream=file,title='OA登录测试报告',description='测试用例执行结果')runner.run(test_suite)file.close()# print(Report().take_screenshot('jfksj'))

4、base_pages.py

from selenium import webdriver
from common.get_data import *
from common.report import *
import traceback
class BASE_page:def open_url(self,driver):  #打开浏览器self.test_da = Get_data()self.url = self.test_da.data_url()self.driver=driverself.driver.get(self.url)def Find_element(self,method,pwd):  #定位元素ele=self.driver.find_element(method,pwd)return eledef alert_info(self):   #获取弹出框文本信息text_info=self.driver.find_element('xpath','//td[contains(@style,"max-width:440px;")]').textreturn text_infodef close_url(self,driver):    #关闭浏览器self.driver=driverself.driver.quit()#关闭浏览器

5、login_pages.py

from selenium import webdriver
from pages.base_page import BASE_page
from common.get_data import Get_data
from common.report import Report
class Login_Page(BASE_page):def OA_Login(self):    #登录OAself.login=BASE_page()self.driver = webdriver.Firefox()self.login.open_url(self.driver)self.driver.implicitly_wait(20)def  Element(self,username,password):ele=Get_data().element()self.login.Find_element(ele[0][0],ele[0][1]).send_keys(username)self.login.Find_element(ele[1][0],ele[1][1]).send_keys(password)self.login.Find_element(ele[2][0], ele[2][1]).click()def Right_login(self,right,logger):   #登录成功的验证assert self.driver.title==rightif self.driver.title==right:logger.info(f'{self.driver.title}=={right},测试通过')else:logger.info(f'测试失败')def Error_login(self,error,logger):     #登录失败的验证assert self.login.alert_info()==errorif  self.login.alert_info()==error:logger.info(f'{self.login.alert_info()}=={error},测试成功')else:logger.info(f'测试失败')def screenshot(self, name,logger):  # 截图screename = Report().take_screenshot(name)self.driver.save_screenshot(screename)logger.info(f"截图已保存至: {screename}")def OA_close(self):self.login.close_url(self.driver)

8、login_test.py      ——》unittest框架

import unittest
from time import sleep
import traceback
from common.get_data import Get_data
from pages.login_page import Login_Page
from ddt import ddt,data,unpack
from common.report import *
test_right_xlsx = Get_data().data_x()[0]
username=test_right_xlsx[0]
password=test_right_xlsx[1]
excepted=test_right_xlsx[2]
test_error_xlsx=Get_data().data_x()[1:]@ddt
class Testlogin(unittest.TestCase):logger=None@classmethoddef setUpClass(cls) -> None:# 只创建一次loggercls.logger = Report().compelet_log()test_datas = len(Get_data().data_x())cls.logger.info(f"获取到{test_datas}条测试数据")print("测试开始")def setUp(self) -> None:self.start_login=Login_Page()self.start_login.OA_Login()self.logger.info("------------------------开始执行测试用例------------")def tearDown(self) -> None:self.start_login.OA_close()self.logger.info("------------------------测试用例执行结束------------")def test_right_case(self):try:self.start_login.Element(username, password)sleep(2)self.start_login.screenshot(excepted,self.logger)sleep(2)self.start_login.Right_login(excepted,self.logger)self.logger.info("----------登录操作完成------------")except Exception as e:error_log = traceback.format_exc()self.logger.error(f"------------测试失败: {str(e)}\n{error_log}---------------")raise@data(*test_error_xlsx)@unpackdef test_error_case(self,user,pwd,ext):try:self.start_login.Element(user, pwd)sleep(2)self.start_login.screenshot(ext,self.logger)sleep(2)self.start_login.Error_login(ext,self.logger)self.logger.info("----------登录操作完成------------")except Exception as e:error_log = traceback.format_exc()self.logger.error(f"------------测试失败: {str(e)}\n{error_log}---------------")raise@classmethoddef tearDownClass(cls) -> None:print("测试结束")

9、login_test2.py           ——》pytest框架

from time import sleep
import pytest
from pages.login_page import Login_Page
from common.get_data import Get_data
import traceback
from common.report import Report
test_right_xlsx = Get_data().data_x()[0]
test_error_xlsx=Get_data().data_x()[1:]
logger=Report().compelet_log()
@pytest.fixture(scope='function',autouse=True)
def set_start():s_login=Login_Page()s_login.OA_Login()yield s_logins_login.OA_close()class TestLogin2:@pytest.mark.parametrize(argnames=['username','password','expected'],argvalues=[test_right_xlsx])def test_right_case(self,username,password,expected,set_start):try:set_start.Element(username, password)sleep(2)set_start.screenshot(expected,logger)sleep(2)set_start.Right_login(expected,logger)logger.info("----------登录操作完成------------")except Exception as e:error_log = traceback.format_exc()logger.error(f"------------测试失败: {str(e)}\n{error_log}---------------")raise@pytest.mark.parametrize(argnames=['user','pwd','ext'],argvalues=test_error_xlsx)def test_error_case(self,user,pwd,ext,set_start):try:set_start.Element(user, pwd)sleep(2)set_start.screenshot(ext,logger)sleep(2)set_start.Error_login(ext,logger)logger.info("----------登录操作完成------------")except Exception as e:error_log = traceback.format_exc()logger.error(f"------------测试失败: {str(e)}\n{error_log}---------------")raiseif __name__ == '__main__':pytest.main(['-sv', 'login_test2.py'])

10、run.py

from common.report import *
from testcases.login_test import *
from selenium import webdriver
# if __name__ =='__main__':
#     unittest.main()
case_dir = r"D:\jkcs\pythonbiji\python自动化\selenium自动化框架\Test_unittest\selenium_unittest练习\testcases"
test_suite=unittest.defaultTestLoader.discover(case_dir,pattern='login_test*.py')
Report().HTMl_report(test_suite)

http://www.dtcms.com/a/377869.html

相关文章:

  • Excel表格如何制作?【图文详解】表格Excel制作教程?电脑Excel表格制作?
  • 【基于CNN的57类交通标志识别系统】
  • 【深度学习新浪潮】Nano Banana(Gemini 2.5 Flash Image)技术解析与开发者实操指南
  • 【Qt开发】显示类控件(二)-> QLCDNumber
  • 三角孔径衍射误差难分析?OAS 软件深度仿真解难题
  • 鸿蒙Next Web组件生命周期详解:从加载到销毁的全流程掌控
  • 【从0开始学习Java | 第17篇】集合(中-Set部分)
  • 【AI指导】Python实现prophet模型的业绩预测
  • RPA-4.0.0.0_SAAS新版本已上线,Edge扩展自动安装,快速实现RPA流程自动化
  • Server 13 ,CentOS 上使用 Nginx 部署多个前端项目完整指南( 支持多端口与脚本自动化 )
  • Java后端测试
  • Skywork-OR1:昆仑万维开源的数学代码推理系列模型
  • 【Linux】基本指令 · 上
  • OBS插件详细教程:OBS美颜插件下载,OBS美颜插件怎么用?
  • 如何在 Spring Boot 中指定不同的配置文件?
  • spring boot 拦截器增加语言信息
  • leedcode 算法刷题第三十二天
  • CentOS 7 下iscsi存储服务配置验证
  • 求解指定泛函的驻点所满足的偏微分方程及边界条件
  • 股指期货保证金一手需要多少钱?
  • LVS与Keepalived详解(一)负载均衡集群介绍
  • 【Proteus仿真】按键控制系列仿真——LED灯表示按键状态/按键控制LED灯/4*4矩阵键盘控制LED
  • 【前沿技术拓展Trip one】 芯片自动化和具身智能
  • javaEE之线程初步认识
  • `struct iovec`详解
  • python超市购物 2025年6月电子学会python编程等级考试一级真题答案解析
  • 项目模块划分
  • leetcode18(无重复字符的最长子串)
  • HackathonCTF: 1
  • redis cluster(去中心化)