请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
  • 便民服务
  • 关注我们
  • 社区新手
# 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()

分享至 : QQ空间
收藏

1 个回复

倒序浏览
强中强
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册