# UI自动化框架设计(此模块是配置项目的路径和每个包的绝对路径,为后面的引用路径提供数据)
import os
# 项目的路径
base_path=os.path.dirname(os.path.dirname(__file__)) #两次查询所在的上一级目录名
# print(base_path) # D:/PycharmProjects/cms_dcs8
# data的路径
data_path=os.path.join(base_path,'data')
# print(data_path)
# public的路径
public_path=os.path.join(base_path,'public')
# print(public_path)
# report的路径
report_path=os.path.join(base_path,'report')
# print(report_path)
# testcase的路径
testcase_path=os.path.join(base_path,'testcase')
# print(testcase_path)
read_ini.py
这个模块是用来封装读取ini文件的工具类
# python当中通过configparser这个模块当中的Configparser类来读取ini文件的
# 需要安装:
# 在dos窗口输入pip install configparser进行安装
# 或者通过python -m pip install configparser
from configparser import ConfigParser # 导入ConfigParser类
from config.config import *
import os
class Read_Ini(ConfigParser):
def __init__(self,filename):
super(Read_Ini,self).__init__()
self.read(filename)
def read_data_ini(self,section,option):
value=self.get(section,option)
return value
file=os.path.join(data_path,'data.ini')
read=Read_Ini(file)
url=read.read_data_ini('test_data','url')
# print(url)
class ReadDataIni:
def __init__(self,fileme):
self.cf=ConfigParser()
self.cf.read(fileme)
def read_data_ini(self,section,option):
value = self.cf.get(section, option)
return value
file=os.path.join(data_path,'data.ini')
read=ReadDataIni(file)
url=read.read_data_ini('test_data','url')
# print((url))
read_excel.py
通过读取excel表格,需要用到xlrd模块,安装pip install xlrd
import xlrd
from config.config import *
import os
class Read_Excel():
def __init__(self,filename,sheet_name):
# 打开一个excel
self.workbook=xlrd.open_workbook(filename)
# 进入到一个 具体的sheet页面
self.sheetname=self.workbook.sheet_by_name(sheet_name)
def get_excel_data(self,row,col):
# 封装了一个通过行和列来获取Excel表格里面数据的方法
valve=self.sheetname.cell(row,col).value
return valve
file=os.path.join(data_path,'data.xls')
excel=Read_Excel(file,'sheet1')
url=excel.get_excel_data(1,0)
print(url)
BasePage.py
# 此模块是封装所有模块的基类,比如元素定位,输入框输入,点击,等待公共的方法
import unittest
from time import sleep
# from selenium import webdriver
# driver=webdriver.Chrome()
class BasePage(unittest.TestCase):
@classmethod
def set_driver(cls,driver): # 把创建好的driver对象传进来,变成BasePage这个类的属性
# 设置单例,保证每个用例用的同一个对象
cls.driver=driver
@classmethod
def get_driver(cls):
return cls.driver
# element=('id','kw')
@classmethod
def find_element(cls,element):
type=element[0]
value=element[1]
if type=='id':
elem=cls.driver.find_element_by_id(value)
elif type=='name':
elem = cls.driver.find_element_by_name(value)
elif type=='class':
elem = cls.driver.find_element_by_class_name(value)
elif type=='xpath':
elem = cls.driver.find_element_by_xpath(value)
elif type=='css':
elem = cls.driver.find_element_by_css_selector(value)
elif type=='link_name':
elem = cls.driver.find_element_by_link_text(value)
elif type=='tag_name':
elem = cls.driver.find_elements_by_tag_name(value)
else:
raise ValueError('please input correct paramter')
return elem
@classmethod
def sendkeys(cls,elem,text):
# 输入的方法
return elem.send_keys(text)
@classmethod
def click(cls,elem):
# 点击的方法
return elem.click()
@classmethod
def implicitly_wait(cls,sec):
# 封装一个隐式等待的方法
return cls.driver.implicitly_wait
@classmethod
def get_text(cls,elem):
# 封装网页元素拿到text文本值,用于断言
return elem.text
@classmethod
def quit(cls):
# 封装一个关闭浏览器的方法
return cls.driver.quit()
@classmethod
def sleep(cls,sec):
# 封装一个休眠的方法
sleep(sec)
# if __name__ == '__main__':
# from selenium import webdriver
# driver = webdriver.Chrome()
# driver.get('http://www.baidu.com')
# driver.maximize_window()
# baidu_input=('id','kw')
# BasePage.sendkeys(BasePage.find_element(baidu_input),'selennium')
test_login.py
from public.pages.BasePage import BasePage
from selenium import webdriver
from public.utils.read_ini import read
import unittest
from public.pages.Page_Element import Page_Element as p
url=read.read_data_ini('test_data','url')
username=read.read_data_ini('test_data','username')
pwd=read.read_data_ini('test_data','pwd')
class Test_Login(BasePage):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Chrome()
BasePage.set_driver(cls.driver) #创建唯一一个driver对象
@classmethod
def tearDownClass(cls):
# 每次跑完用退出
BasePage.sleep(3)
# 回到首页方法
def test_login(self):
driver=BasePage.get_driver()
driver.get(url)
driver.maximize_window()
# 输入账号
# userName=('id','userAccount')
elem=BasePage.find_element(p.userName)
BasePage.sendkeys(elem,username)
# 输入密码
# passWord = ('id','loginPwd')
elem = BasePage.find_element(p.passWord)
BasePage.sendkeys(elem,pwd)
# 登录
# loginBin = ('id', 'loginBtn')
elem = BasePage.find_element(p.loginBin)
BasePage.click(elem)
# 断言
# desktop=('xpath','//*[@id="min_title_list"]/li/span')
BasePage.sleep(2)
elem=BasePage.find_element(p.desktop)
value=BasePage.get_text(elem)
assert value=='我的桌面'
if __name__ == '__main__':
unittest.main()
Page_Element.py
class Page_Element:
# 输入用户名
userName=('id','userAccount')
# 输入密码
passWord = ('id','loginPwd')
# 点击登录
loginBin = ('id','loginBtn')
# 断言
desktop = ('xpath', '//*[@id="min_title_list"]/li/span')
# 点击用户中心
user_center=('class','icon-user')
'''上面这种把页面元素定位进行抽离的思想就称为:po设计模式
po设计模式:page object,页面对象模式
优点:
1、容易维护
2、可以使得元素和用例进行分离,当页面元素发生改变只需要更改当前这个类里面的数据
3、管理和组织用例非常的方便,易于维护自动化用例
'''
test_user_center.py
from public.pages.BasePage import BasePage
from public.pages.Page_Element import Page_Element as p
class User_Center(BasePage):
@classmethod
def setUpClass(cls) -> None:
BasePage.sleep(2)
@classmethod
def tearDownClass(cls) -> None:
BasePage.sleep(2)
def test01_user_center(self):
elem=BasePage.find_element(p.user_center)
BasePage.click(elem)
run_allcase.py
from config.config import *
import unittest
import time
from public.utils.HTMLTestRunner3_New import HTMLTestRunner
from public.utils.mail import SendMail
# 定义生成测试报告的路径及文件名称
now=time.strftime('%Y-%m-%d-%H-%M-%S')
filename=report_path+'\\'+str(now)+'ui_report.html'
def auto_run():
discover=unittest.defaultTestLoader.discover(start_dir=testcase_path,
pattern='test*.py')
f=open(filename,'wb')
runner=HTMLTestRunner(stream=f,
title='cms后台系统UI自动化测试报告',
description='测试用例执行如下:',
tester='多测师工程师')
runner.run(discover)
f.close()
def sendmail():
# 把filename当做邮件内容和附件进行发送
send=SendMail(send_msg=filename,attachment=filename)
send.send_mail()
if __name__ == '__main__':
auto_run()
sendmail()
|
|