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)