├── case
├── __init__.py
├── login_test.py
├── zhaohui_test.py
├── xiugai_test.py
└── zhuce_test.py
├── data
├── case.xlsx
└── page_data.yaml
├── logco
└── 2018032418.log
├── resultpang
└── login1.png
├── __init__.py
├── suite
├── __init__.py
└── testsuite.py
├── run.py
├── config.py
├── README.md
├── util
├── gettestdata.py
├── log.py
├── selse_feng.py
├── HTMLTestRunner.py
└── BSTestRunner.py
├── bussinses
└── funnicgong.py
├── report
└── 2018-03-24_18_43.html
└── geckodriver.log
/case/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/data/case.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liwanlei/python-selenium/HEAD/data/case.xlsx
--------------------------------------------------------------------------------
/logco/2018032418.log:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liwanlei/python-selenium/HEAD/logco/2018032418.log
--------------------------------------------------------------------------------
/resultpang/login1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/liwanlei/python-selenium/HEAD/resultpang/login1.png
--------------------------------------------------------------------------------
/__init__.py:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 | """
3 | @author: lileilei
4 | @file: __init__.py
5 | @time: 2018/3/24 18:40
6 | """
--------------------------------------------------------------------------------
/suite/__init__.py:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 | """
3 | @author: lileilei
4 | @file: __init__.py.py
5 | @time: 2018/1/21 11:49
6 | """
--------------------------------------------------------------------------------
/run.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # @Date : 2017-08-11 15:34:37
3 | # @Author : lileilei
4 | from suite.testsuite import create_report
5 | if __name__ == '__main__':
6 | create_report()
--------------------------------------------------------------------------------
/config.py:
--------------------------------------------------------------------------------
1 | # encoding: utf-8
2 | """
3 | @author: lileilei
4 | @file: config.py
5 | @time: 2018/3/24 18:39
6 | """
7 | description='测试结果' #测试报告需要的描述
8 | reporttitle='自动化测试报告' #测试报告需要的title
9 | liulanqi='Firefox'#测试所需要的浏览器
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # python+selenium +HTMLTestRunner自动化测试
2 | ## python 3 +selenium3 +HTMLTestRunner(python3版本)
3 | ### 使用的框架是python自带的unittest。使用ddt数据驱动,Excel管理测试用例
4 | ### bussinses 公共的逻辑模块编写
5 | ### data存放测试用例,界面定位元素
6 | ### report存放测试报告
7 | ### case存放测试用例。
8 | ### log 存放测试过程中的测试日志
9 | ### resultpang存放测试过程中的截图
10 | ### suite 测试用例集
11 | ### util 公共模块
12 | ### run.py 执行脚本。
13 | 
14 |
--------------------------------------------------------------------------------
/suite/testsuite.py:
--------------------------------------------------------------------------------
1 | import unittest,time,os
2 | from util import BSTestRunner
3 | from config import description,reporttitle
4 | path=os.getcwd()
5 | case_path=path+'\\case'
6 | def create_report():
7 | test_suit = unittest.TestSuite()
8 | discover = unittest.defaultTestLoader.discover(case_path, pattern='*test.py', top_level_dir=None)
9 | for test in discover:
10 | for test_case in test:
11 | test_suit.addTest(test_case)
12 | now=time.strftime('%Y-%m-%d_%H_%M',time.localtime(time.time()))
13 | report_dir=path+'\\report\\%s.html'%now
14 | re_open= open(report_dir,'wb')
15 | runner=BSTestRunner.BSTestRunner(stream=re_open,title=reporttitle,description=description)
16 | runner.run(test_suit)
17 |
--------------------------------------------------------------------------------
/util/gettestdata.py:
--------------------------------------------------------------------------------
1 | """
2 | @author: lileilei
3 | @file: ddd.py
4 | @time: 2018/1/19 11:43
5 | """
6 | import xlrd
7 | from util import log
8 | logs=log.log_message()
9 | def huoqu_test(filepath,index):
10 | try:
11 | file = xlrd.open_workbook(filepath)
12 | me = file.sheets()[index]
13 | nrows = me.nrows
14 | listdata = []
15 | for i in range(1, nrows):
16 | dict_canshu = {}
17 | dict_canshu['id']=me.cell(i,0).value
18 | dict_canshu.update(eval(me.cell(i,2).value))
19 | dict_canshu.update(eval(me.cell(i,3).value))
20 | listdata.append(dict_canshu)
21 | return listdata
22 | except Exception as e:
23 | logs.error_log('获取测试用例数据失败,原因:%s'%e)
--------------------------------------------------------------------------------
/util/log.py:
--------------------------------------------------------------------------------
1 | import os,time,logging
2 | path=os.getcwd()
3 | class log_message():
4 | def __init__(self):
5 | title = u'注册测试'
6 | day = time.strftime("%Y%m%d%H", time.localtime(time.time()))
7 | pad = os.getcwd()
8 | file_dir = pad + '\\logco'
9 | file = os.path.join(file_dir, (day + '.log'))
10 | self.logger = logging.Logger(title)
11 | self.logger.setLevel(logging.INFO)
12 | self.logfile = logging.FileHandler(file)
13 | self.logfile.setLevel(logging.INFO)
14 | self.control = logging.StreamHandler()
15 | self.control.setLevel(logging.INFO)
16 | self.formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
17 | self.logfile.setFormatter(self.formater)
18 | self.control.setFormatter(self.formater)
19 | self.logger.addHandler(self.logfile)
20 | self.logger.addHandler(self.control)
21 | def debugInfo(self, message):
22 | self.logger.debug(message)
23 | def info_log(self, message):
24 | self.logger.info(message)
25 | def ware_log(self, message):
26 | self.logger.warn(message)
27 | def error_log(self, message):
28 | self.logger.error(message)
--------------------------------------------------------------------------------
/case/login_test.py:
--------------------------------------------------------------------------------
1 | from bussinses.funnicgong import Login_tes
2 | import ddt,unittest,os
3 | from util import log
4 | from selenium import webdriver
5 | from util.gettestdata import huoqu_test
6 | path=os.getcwd()
7 | case_path=path+'\\data\\case.xlsx'
8 | casedata=huoqu_test(case_path,3)
9 | @ddt.ddt
10 | class Testlogin(unittest.TestCase):
11 | def setUp(self):
12 | self.logs=log.log_message()
13 | self.derve=webdriver.Firefox()
14 | self.login_fun=Login_tes(self.derve)
15 | @ddt.data(*casedata)
16 | def test_login1(self,casedata):
17 | self.name=casedata['username']
18 | self.pwd=casedata['pwd']
19 | self.suc=casedata['suc']
20 | self.assert_value = casedata['assert']
21 | self.derve.get_screenshot_as_file(path+'\\resultpang\\%s.png'%casedata)
22 | self.logs.info_log('input data:name:%s,pwd:%s,suc:%s,assert:%s' % (self.name, self.pwd, self.suc, self.assert_value))
23 | self.re_data = self.login_fun.login( self.suc,self.name, self.pwd)
24 | self.assertEqual(self.re_data, self.assert_value)
25 | def tearDown(self):
26 | self.derve.quit()
27 |
--------------------------------------------------------------------------------
/case/zhaohui_test.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # @Author : leizi
3 | from bussinses.funnicgong import Zaohui_tes
4 | import unittest,time,os,ddt
5 | from util import log
6 | from selenium import webdriver
7 | from util.gettestdata import huoqu_test
8 | path=os.getcwd()
9 | case_path=path+'\\data\\case.xlsx'
10 | casedata=huoqu_test(case_path,2)
11 | @ddt.ddt
12 | class Testzhaohui(unittest.TestCase):
13 | def setUp(self):
14 | self.logs = log.log_message()
15 | self.derve=webdriver.Firefox()
16 | self.zhaohui_fun=Zaohui_tes(self.derve)
17 | @ddt.data(*casedata)
18 | def test_zhaohui_1(self,casedata):
19 | self.username=casedata['username']
20 | self.email=casedata['email']
21 | self.suc=casedata['suc']
22 | self.assert_vale=casedata['assert_vale']
23 | self.retu_data=self.zhaohui_fun.zhaohui(self.username,self.email,self.suc)
24 | self.derve.get_screenshot_as_file(path+'\\resultpang\\%s.png'%casedata['id'])
25 | self.logs.info_log('inptut name:%s,email:%s,assert:%s'%(self.username,self.email,self.assert_vale))
26 | time.sleep(1)
27 | self.assertEqual(self.retu_data, self.assert_vale)
28 | def tearDown(self):
29 | self.derve.quit()
--------------------------------------------------------------------------------
/case/xiugai_test.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # @Author : leizi
3 | from bussinses.funnicgong import Xiugai_tes
4 | from selenium import webdriver
5 | import unittest,time,os,ddt
6 | from util import log
7 | from util.gettestdata import huoqu_test
8 | path=os.getcwd()
9 | case_path=path+'\\data\\case.xlsx'
10 | casedata=huoqu_test(case_path,3)
11 | @ddt.ddt
12 | class Test_xiugai(unittest.TestCase):
13 | def setUp(self):
14 | self.logs = log.log_message()
15 | self.derve=webdriver.Fi()
16 | self.xiugai_fun=Xiugai_tes(self.derve)
17 | @ddt.data(*casedata)
18 | def test_xiugai_1(self,casedata):
19 | self.password=casedata['yuanmi']
20 | self.xiugaimi=casedata['xiugaimi']
21 | self.xiugaimi1=casedata['xiugaimi1']
22 | self.suc=casedata['suc']
23 | self.assert_vale=casedata['assert_vale']
24 | self.return_data=self.xiugai_fun.xiugai(self.suc,self.password,self.xiugaimi,self.xiugaimi1)
25 | self.logs.info_log("input: password:%s,xiugaimima:%s,xiugaimima1:%s,assert:%s"%(self.password,self.xiugaimi,self.xiugaimi1,self.assert_vale))
26 | time.sleep(1)
27 | self.assertAlmostEqual(self.return_data,self.assert_vale)
28 | def tearDown(self):
29 | self.derve.quit()
30 |
--------------------------------------------------------------------------------
/case/zhuce_test.py:
--------------------------------------------------------------------------------
1 | # -*- coding: utf-8 -*-
2 | # @Author : leizi
3 | from bussinses.funnicgong import Zhuce_tes
4 | import unittest,time,os,ddt
5 | from util import log
6 | from selenium import webdriver
7 | path=os.getcwd()
8 | from util.gettestdata import huoqu_test
9 | case_path=path+'\\data\\case.xlsx'
10 | casedata=huoqu_test(case_path,1)
11 | @ddt.ddt
12 | class Testzhuce(unittest.TestCase):
13 | def setUp(self):
14 | self.logs = log.log_message()
15 | self.derve=webdriver.Firefox()
16 | self.zhuce_fun=Zhuce_tes(self.derve)
17 | @ddt.data(*casedata)
18 | def test_zhuce_1(self,casedata):
19 | self.name=casedata['username']
20 | self.password=casedata['mima']
21 | self.passwordque=casedata['nima2']
22 | self.shoujihao=casedata['shoujihao']
23 | self.youxiang=casedata['youxiang']
24 | self.suc=casedata['suc']
25 | self.assert_vale=casedata['assert_vale']
26 | self.re_data=self.zhuce_fun.zhuce(self.name,self.password,self.passwordque,self.shoujihao,self.youxiang,self.suc)
27 | self.derve.get_screenshot_as_file(path+'\\resultpang\\%s.png'%casedata[id])
28 | self.logs.info_log("input:name:%s password:%s,passwordque:%s,shoujihao:%s,youxiang:%s ,assert:%s"%(self.name,self.password,self.passwordque,self.shoujihao,self.youxiang,self.assert_vale))
29 | time.sleep(1)
30 | self.assertEqual(self.re_data, self.assert_vale)
31 | def tearDown(self):
32 | self.derve.quit()
--------------------------------------------------------------------------------
/data/page_data.yaml:
--------------------------------------------------------------------------------
1 | login:
2 | url: "http://127.0.0.1:8000/"
3 | denglu: "请登录"
4 | name: "firstname"
5 | password: "inputPassword"
6 | denglu_btm: "denglu"
7 | login_err: "/html/body/form/div[4]/div/h4[2]"
8 | login_suc: "/html/body/nav/div/div[2]/ul/div/ul/li[3]/a/span"
9 | zhuce:
10 | url: "http://127.0.0.1:8000/"
11 | zhuc: "注册"
12 | username: "username" #class
13 | password: "password" #class
14 | querenpass: "password1" #class
15 | shouji: "shouji" #class
16 | youxiang: "email" #class
17 | tijiao_btn: "submit" #class
18 | zhuce_err: "/html/body/form/div[6]/div/h4" #xpath
19 | zhuce_suc: "denglu" #id
20 | zhaohui:
21 | url: "http://127.0.0.1:8000/reset_pwd"
22 | username: 'input[name=\"firstname\"]'
23 | email: 'input[name=\"email\"]'
24 | zhaohui_btn: 'input[type=\"submit\"]'
25 | zhaohui_err: "/html/body/form/div[3]/div/h4" #xpath
26 | zhaohui_suc: 'input[type=\"submit\"]' #css
27 | reset_pwd:
28 | url: "http://127.0.0.1:8000/ret_passord"
29 | email: 'input[name=\"email\"]'
30 | yanzheng: 'input[name=\"yanzhengma\"]'
31 | mima: 'input[name=\"inputPassword\"]'
32 | chongzhimima: 'input[name=\"inputPassword1\"]'
33 | reset_btn: 'input[type=\"submit\"]'
34 | reset_error: "/html/body/form/div[5]/div/h4"
35 | reset_suc: "denglu" #id
36 | xiugai:
37 | url: "http://127.0.0.1:8000/xiugaimima"
38 | yuanmi: 'input[type=\"pass_yuan\"]'
39 | xiugaimi: 'input[type=\"inputPassword\"]'
40 | xiugaimi1: 'input[type=\"inputPassword1\"]'
41 | xiugai_but: "修改密码"
42 | xiu_err: "/html/body/form/div[4]/div/h4"
43 | xiu_suc: "denglu"#id
44 | xiebo:
45 | url: "http://127.0.0.1:8000/xiebo"
46 | biaoti: 'input[type=\"biaoti1\"]'
47 | neirong: "comment_textarea"#classname
48 | fenlei: "jumpMenu" #id
49 | fenlei1: "/html/body/div/div/div[1]/div/div[2]/form/div[4]/select/option[2]" #git xpath
50 | biaoqian: "biaoqian" #id
51 | bianqian1: 'input[value=\"python\"]'
52 | tuijian: 'input[name=\"tuijian\"]'
53 | xiebo_btn: 'input[type=\"submit\"]'
54 | xiebo_err: "/html/body/div/div/div[1]/div/div[2]/form/h4"
55 | xiebo_suc: "/html/body/div/div/div[1]/div/div[3]/h4"
--------------------------------------------------------------------------------
/util/selse_feng.py:
--------------------------------------------------------------------------------
1 | from selenium import webdriver
2 | from selenium.webdriver.support.ui import WebDriverWait
3 | from selenium.webdriver.common.by import By
4 | from selenium.webdriver.support import expected_conditions as EC
5 | from selenium.webdriver.common.action_chains import ActionChains
6 | class PySele():
7 | def __init__(self,brower):#初始化浏览器
8 | if brower =='firefox' or brower =='Firefox' or brower =='f' or brower =='F':
9 | deriver=webdriver.Firefox()
10 | elif brower =='Ie' or brower =='ie' or brower =='i' or brower=='I':
11 | deriver=webdriver.Ie()
12 | elif brower =='Chrome' or brower =='chrome' or brower =='Ch' or brower=='ch':
13 | deriver=webdriver.Chrome()
14 | elif brower =='PhantomJS' or brower =='phantomjs' or brower =='ph' or brower=='phjs':
15 | deriver=webdriver.PhantomJS()
16 | elif brower =='Edge' or brower =='edge' or brower =='Ed' or brower=='ed':
17 | deriver=webdriver.Edge()
18 | elif brower =='Opera' or brower =='opera' or brower =='op' or brower=='OP':
19 | deriver=webdriver.Opera()
20 | elif brower =='Safari' or brower =='safari' or brower =='sa' or brower=='saf':
21 | deriver=webdriver.Safari()
22 | else:
23 | raise NameError('只能输入firefox,Ie,Chrome,PhantomJS,Edge,Opera,Safari')
24 | self.driver=deriver
25 | def element(self,fangfa,dingwei):#定位
26 | if fangfa=='id':
27 | element=self.driver.find_element_by_id(dingwei)
28 | elif fangfa == "name":
29 | element = self.driver.find_element_by_name(dingwei)
30 | elif fangfa == "class":
31 | element = self.driver.find_element_by_class_name(dingwei)
32 | elif fangfa == "link_text":
33 | element = self.driver.find_element_by_link_text(dingwei)
34 | elif fangfa == "xpath":
35 | element = self.driver.find_element_by_xpath(dingwei)
36 | elif fangfa == "tag":
37 | element = self.driver.find_element_by_tag_name(dingwei)
38 | elif fangfa == "css":
39 | element = self.driver.find_element_by_css_selector(dingwei)
40 | else:
41 | raise NameError("Please enter the elements,'id','name','class','link_text','xpath','css','tag'.")
42 | return element
43 | def elements(self,fangfa,dingwei):#组定位
44 | if fangfa=='id':
45 | element=self.driver.find_elements_by_id(dingwei)
46 | elif fangfa == "name":
47 | element = self.driver.find_elements_by_name(dingwei)
48 | elif fangfa == "class":
49 | element = self.driver.find_elements_by_class_name(dingwei)
50 | elif fangfa == "link_text":
51 | element = self.driver.find_elements_by_link_text(dingwei)
52 | elif fangfa == "xpath":
53 | element = self.driver.find_elements_by_xpath(dingwei)
54 | elif fangfa == "tag":
55 | element = self.driver.find_elements_by_tag_name(dingwei)
56 | elif fangfa == "css":
57 | element = self.driver.find_elements_by_css_selector(dingwei)
58 | else:
59 | raise NameError("Please enter the elements,'id','name','class','link_text','xpath','css','tag'.")
60 | return element
61 | def element_wait(self,fangfa,dingwei,wati=6):#等待
62 | if fangfa == "id":
63 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.ID, dingwei)))
64 | elif fangfa == "name":
65 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.NAME, dingwei)))
66 | elif fangfa == "class":
67 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.CLASS_NAME, dingwei)))
68 | elif fangfa == "link_text":
69 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.LINK_TEXT, dingwei)))
70 | elif fangfa == "xpath":
71 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.XPATH, dingwei)))
72 | elif fangfa == "css":
73 | WebDriverWait(self.driver,wati,1).until(EC.presence_of_element_located((By.CSS_SELECTOR, dingwei)))
74 | else:
75 | raise NameError("Please enter the elements,'id','name','class','link_text','xpath','css'.")
76 | def open(self,url):#打开网页
77 | self.driver.get(url)
78 | def make_maxwindow(self):#最大化浏览器
79 | self.driver.maximize_window()
80 | def set_winsize(self,wide,hight):#设置窗口
81 | self.driver.set_window_size(wide,hight)
82 | def send_key(self,fangfa,dingwei,text):#发送内容
83 | self.element(fangfa,dingwei)
84 | e1=self.element(fangfa,dingwei)
85 | e1.clear()
86 | e1.send_keys(text)
87 | def clear(self,fangfa,dingwei):#清空
88 | self.element_wait(fangfa,dingwei)
89 | e1=self.element(fangfa,dingwei)
90 | e1.clear()
91 | def clic(self,fangfa,dingwei):#单击
92 | self.element_wait(fangfa,dingwei)
93 | e1=self.element(fangfa,dingwei)
94 | e1.click()
95 | def right_click(self,fangfa,dingwei):#右击
96 | self.element_wait(fangfa,dingwei)
97 | e1=self.element(fangfa,dingwei)
98 | ActionChains(self.driver).context_click(e1).perform()
99 | def move_element(self,fangfa,dingwei):#移动到
100 | self.element_wait(fangfa,dingwei)
101 | e1=self.element(fangfa,dingwei)
102 | ActionChains(self.driver).move_to_element(e1).perform()
103 | def double_click(self,dingwei,fangfa):#双击
104 | self.element_wait(fangfa,dingwei)
105 | e1=self.element(fangfa,dingwei)
106 | ActionChains(self.driver).double_click(e1).perform()
107 | def drag_and_drop(self,fangfa1,e1,fangfa2,e2):#从e1到e2
108 | self.element_wait(fangfa1,e1)
109 | eme1=self.element(fangfa1,e1)
110 | self.element_wait(fangfa2,e2)
111 | eme2=self.element(fangfa2,e2)
112 | ActionChains(self.driver).drag_and_drop(eme1,eme2).perform()
113 | def click_text(self,text):#点击文字
114 | self.driver.find_element_by_link_text(text).click()
115 | def close(self):#关闭
116 | self.driver.close()
117 | def kill(self):#退出
118 | self.driver.quit()
119 | def sublimit(self,fangfa,dingwei):#提交
120 | self.element_wait(fangfa,dingwei)
121 | e1=self.element(fangfa,dingwei)
122 | e1.sublimit()
123 | def f5(self):#刷新
124 | self.driver.refresh()
125 | def js(self,sprit):#执行js
126 | self.driver.execute_script(sprit)
127 | def get_attribute(self, fangfa,dingwei, attribute):
128 | e1=self.element(fangfa,dingwei)
129 | return e1.get_attribute(attribute)
130 | def get_text(self,fangfa,dingwei):
131 | self.element_wait(fangfa,dingwei)
132 | e1=self.element(fangfa,dingwei)
133 | return e1.text
134 | def get_is_dis(self,fangfa,dingwei):
135 | self.element_wait(fangfa,dingwei)
136 | e1=self.element(fangfa,dingwei)
137 | return e1.is_displayed()
138 | def get_title(self,fangfa,dingwei):#获取title
139 | return self.driver.title
140 | def get_screen(self,file_path):#截屏
141 | self.driver.get_screenshot_as_file(file_path)
142 | def wait(self,fangfa,dingwei):#等待
143 | self.driver.implicitly_wait((fangfa,dingwei))
144 | def accpet(self):#允许
145 | self.driver.switch_to.alert.accept()
146 | def dismiss_alert(self):
147 | self.driver.switch_to.alert.dismiss()
148 | def switch_to_frame(self, fangfa,dingwei):#切换
149 | self.element_wait(fangfa,dingwei)
150 | if1=self.element(fangfa,dingwei)
151 | self.driver.switch_to.frame(if1)
--------------------------------------------------------------------------------
/bussinses/funnicgong.py:
--------------------------------------------------------------------------------
1 | import yaml,os
2 | path=os.getcwd()
3 | from util import log
4 | class Login_tes:#登录模块封装
5 | def __init__(self,driver):#
6 | self.driber=driver
7 | self.logs = log.log_message()
8 | self.file=open(path+"\\data\\page_data.yaml", "r",encoding= "utf-8")
9 | self.data=yaml.load(self.file)
10 | self.file.close()
11 | self.lo_url=self.data['login'].get('url')
12 | self.denglu=self.data['login'].get('denglu')
13 | self.username=self.data['login'].get('name')
14 | self.password=self.data['login'].get('password')
15 | self.sub=self.data['login'].get('denglu_btm')
16 | self.lo_err=self.data['login'].get('login_err')
17 | self.lo_suc=self.data['login'].get('login_suc')
18 | self.driber.get(self.lo_url)
19 | def login(self,suc,name,password):
20 | try:
21 | self.driber.find_element_by_link_text(self.denglu).click()
22 | self.driber.find_element_by_id(self.username).clear()
23 | self.driber.find_element_by_id(self.username).send_keys(name)
24 | self.driber.find_element_by_id(self.password).click()
25 | self.driber.find_element_by_id(self.password).send_keys(password)
26 | self.driber.find_element_by_id(self.sub).click()
27 | if suc=='1':
28 | self.login_su = self.driber.find_element_by_xpath(self.lo_suc).text
29 | return self.login_su
30 | if suc=='0':
31 | self.login_err=self.driber.find_element_by_xpath(self.lo_err).text
32 | except Exception as e:
33 | self.logs.error_log('用例执行失败,原因:%s'%e)
34 | finally:
35 | self.driber.quit()
36 | class Zhuce_tes:#注册模块的封装
37 | def __init__(self,driver):
38 | self.deriver=driver
39 | title = '注册模块'
40 | self.logs = log.log_message()
41 | self.file1=open(path+"\\data\\page_data.yaml", "r",encoding= "utf-8")
42 | self.data=yaml.load(self.file1)
43 | self.file1.close()
44 | self.zhu_url=self.data['zhuce'].get('url')
45 | self.zhu=self.data['zhuce'].get('zhuc')
46 | self.zhu_user=self.data['zhuce'].get('username')
47 | self.zhu_pwd=self.data['zhuce'].get('password')
48 | self.zhu_qpwd=self.data['zhuce'].get('querenpass')
49 | self.zhu_shouji=self.data['zhuce'].get('shouji')
50 | self.zhu_email=self.data['zhuce'].get('youxiang')
51 | self.zhu_butn=self.data['zhuce'].get('tijiao_btn')
52 | self.zhu_suc=self.data['zhuce'].get('zhuce_suc')
53 | self.zhu_err=self.data['zhuce'].get('zhuce_err')
54 | self.deriver.get(self.zhu_url)
55 | def zhuce(self,suc,name,password,password1,shouji,email):
56 | try:
57 | self.deriver.find_element_by_link_text(self.zhu).click()
58 | self.deriver.find_element_by_class_name(self.zhu_user).clear()
59 | self.deriver.find_element_by_class_name(self.zhu_user).send_keys(name)
60 | self.deriver.find_element_by_class_name(self.zhu_pwd).clear()
61 | self.deriver.find_element_by_class_name(self.zhu_pwd).send_keys(password)
62 | self.deriver.find_element_by_class_name(self.zhu_qpwd).clear()
63 | self.deriver.find_element_by_class_name(self.zhu_qpwd).send_keys(password1)
64 | self.deriver.find_element_by_class_name(self.zhu_shouji).clear()
65 | self.deriver.find_element_by_class_name(self.zhu_shouji).send_keys(shouji)
66 | self.deriver.find_element_by_class_name(self.zhu_email).clear()
67 | self.deriver.find_element_by_class_name(self.zhu_email).send_keys(email)
68 | self.deriver.find_element_by_class_name(self.zhu_butn).click()
69 | if suc =="1":
70 | self.zhu_su=self.deriver.find_element_by_id(self.zhu_suc).text
71 | return self.zhu_su
72 | if suc=='0':
73 | self.zhu_e=self.deriver.find_element_by_xpath(self.zhu_err).text
74 | return self.zhu_e
75 | except Exception as e:
76 | self.logs.error_log('用例执行失败,原因:%s' % e)
77 | finally:
78 | self.deriver.quit()
79 | class Zaohui_tes:
80 | def __init__(self,driver):
81 | self.driver=driver
82 | self.logs = log.log_message()
83 | self.file1=open(path+"\\data\\page_data.yaml", "r",encoding= "utf-8")
84 | self.data=yaml.load(self.file1)
85 | self.file1.close()
86 | self.zhao_url=self.data['zhaohui'].get('url')
87 | self.zhao_username=self.data['zhaohui'].get('username')
88 | self.zhao_btn=self.data['zhaohui'].get('zhaohui_btn')
89 | self.zhao_err=self.data['zhaohui'].get('zhaohui_err')
90 | self.zhao_suc=self.data['zhaohui'].get('zhaohui_suc')
91 | self.driver.get(self.zhao_url)
92 | def zhaohui(self,suc,name,eamil):
93 | try:
94 | self.driver.find_element_by_css_selector(self.zhao_username).clear()
95 | self.driver.find_element_by_css_selector(self.zhao_username).sned_keys(name)
96 | self.driver.find_element_by_css_selector(self.zhao_eamil).clear()
97 | self.driver.find_element_by_css_selector(self.zhao_eamil).sned_keys(eamil)
98 | self.driver.find_element_by_css_selector(self.zhao_btn).click()
99 | if suc == '1':
100 | self.zhao_su=self.driver.find_element_by_css_selector(self.zhao_suc).text
101 | return self.zhao_su
102 | if suc =="0":
103 | self.zhao_er=self.driver.find_element_by_xpath(self.zhao_err).text
104 | return self.zhao_er
105 | except Exception as e:
106 | self.logs.error_log('用例执行失败,原因:%s' % e)
107 | finally:
108 | self.driver.quit()
109 | class Rest_tes:
110 | def __init__(self,driver):
111 | self.driver=driver
112 | self.logs = log.log_message()
113 | self.file1=open(path+"\\data\\page_data.yaml", "r",encoding= "utf-8")
114 | self.data=yaml.load(self.file1)
115 | self.file1.close()
116 | self.rest_url=self.data['reset_pwd'].get('url')
117 | self.rest_eamil=self.data['reset_pwd'].get('email')
118 | self.reset_yan=self.data['reset_pwd'].get('yanzheng')
119 | self.reset_mima=self.data['reset_pwd'].get('mima')
120 | self.reset_mimaque=self.data['reset_pwd'].get('chongzhimima')
121 | self.reset_btn=self.data['reset_pwd'].get('reset_btn')
122 | self.reset_error=self.data['reset_pwd'].get('reset_error')
123 | self.reset_suc=self.data['reset_pwd'].get('reset_suc')
124 | self.driver.get(self.rest_url)
125 | def rest(self,suc,yan,eamil,mima,chongzhimima):
126 | try:
127 | self.driver.find_element_by_css_selector(self.rest_eamil).clear()
128 | self.driver.find_element_by_css_selector(self.rest_eamil).sned_keys(eamil)
129 | self.driver.find_element_by_css_selector(self.reset_yan).clear()
130 | self.driver.find_element_by_css_selector(self.reset_yan).sned_keys(yan)
131 | self.driver.find_element_by_css_selector(self.reset_mima).clear()
132 | self.driver.find_element_by_css_selector(self.reset_mima).sned_keys(mima)
133 | self.driver.find_element_by_css_selector(self.reset_mimaque).clear()
134 | self.driver.find_element_by_css_selector(self.reset_mimaque).sned_keys(chongzhimima)
135 | self.driver.find_element_by_css_selector(self.reset_btn).click()
136 | if suc =="1":
137 | self.rest_su=self.driver.find_element_by_id(self.reset_suc).text
138 | return self.rest_su
139 | if suc=='0':
140 | self.rest_err=self.driver.find_element_by_xpath(self.reset_error).text
141 | return self.rest_err
142 | except Exception as e:
143 | self.logs.error_log('用例执行失败,原因:%s' % e)
144 | finally:
145 | self.driver.quit()
146 | class Xiugai_tes:
147 | def __init__(self,driver):
148 | title = '修改模块'
149 | self.logs = log.log_message()
150 | self.driver=driver
151 | self.file1=open(path+"\\data\\page_data.yaml", "r",encoding= "utf-8")
152 | self.data=yaml.load(self.file1)
153 | self.file1.close()
154 | self.xiugai_url=self.data['xiugai'].get('url')
155 | self.xiugai_yuan=self.data['xiugai'].get('yuanmi')
156 | self.xiugai_mima=self.data['xiugai'].get('xiugaimi')
157 | self.xiugai_mimaque=self.data['xiugai'].get('xiugaimi1')
158 | self.xiugai_btn=self.data['xiugai'].get('xiugai_but')
159 | self.xiugai_suc=self.data['xiugai'].get('xiu_suc')
160 | self.xiugai_error=self.data['xiugai'].get('xiu_err')
161 | self.driver.get(self.xiugai_url)
162 | def xiugai(self,suc,yuanmima,mima,querenmima):
163 | try:
164 | self.driver.find_element_by_css_selector(self.xiugai_yuan).clear()
165 | self.driver.find_element_by_css_selector(self.xiugai_yuan).sned_keys(yuanmima)
166 | self.driver.find_element_by_css_selector(self.xiugai_mima).clear()
167 | self.driver.find_element_by_css_selector(self.xiugai_mima).sned_keys(mima)
168 | self.driver.find_element_by_css_selector(self.xiugai_mimaque).clear()
169 | self.driver.find_element_by_css_selector(self.xiugai_mimaque).sned_keys(querenmima)
170 | self.driver.find_element_by_link_text(self.xiugai_btn).click()
171 | if suc=='1':
172 | self.xiugai_su = self.driver.find_element_by_id(self.xiugai_suc).text
173 | return self.xiugai_su
174 | if suc=='0':
175 | self.xiugai_erro=self.driver.find_element_by_xpath(self.xiugai_error).text
176 | return self.xiugai_erro
177 | except Exception as e:
178 | self.logs.error_log('用例执行失败,原因:%s' % e)
179 | finally:
180 | self.driver.quit()
--------------------------------------------------------------------------------
/util/HTMLTestRunner.py:
--------------------------------------------------------------------------------
1 | """
2 | A TestRunner for use with the Python unit testing framework. It
3 | generates a HTML report to show the result at a glance.
4 |
5 | The simplest way to use this is to invoke its main method. E.g.
6 |
7 | import unittest
8 | import HTMLTestRunner
9 |
10 | ... define your tests ...
11 |
12 | if __name__ == '__main__':
13 | HTMLTestRunner.main()
14 |
15 |
16 | For more customization options, instantiates a HTMLTestRunner object.
17 | HTMLTestRunner is a counterpart to unittest's TextTestRunner. E.g.
18 |
19 | # output to a file
20 | fp = file('my_report.html', 'wb')
21 | runner = HTMLTestRunner.HTMLTestRunner(
22 | stream=fp,
23 | title='My unit test',
24 | description='This demonstrates the report output by HTMLTestRunner.'
25 | )
26 |
27 | # Use an external stylesheet.
28 | # See the Template_mixin class for more customizable options
29 | runner.STYLESHEET_TMPL = ''
30 |
31 | # run the test
32 | runner.run(my_test_suite)
33 |
34 |
35 | ------------------------------------------------------------------------
36 | Copyright (c) 2004-2007, Wai Yip Tung
37 | All rights reserved.
38 |
39 | Redistribution and use in source and binary forms, with or without
40 | modification, are permitted provided that the following conditions are
41 | met:
42 |
43 | * Redistributions of source code must retain the above copyright notice,
44 | this list of conditions and the following disclaimer.
45 | * Redistributions in binary form must reproduce the above copyright
46 | notice, this list of conditions and the following disclaimer in the
47 | documentation and/or other materials provided with the distribution.
48 | * Neither the name Wai Yip Tung nor the names of its contributors may be
49 | used to endorse or promote products derived from this software without
50 | specific prior written permission.
51 |
52 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
53 | IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
54 | TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
55 | PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
56 | OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
57 | EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
58 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
59 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
60 | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
61 | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
62 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
63 | """
64 |
65 | # URL: http://tungwaiyip.info/software/HTMLTestRunner.html
66 |
67 | __author__ = "Wai Yip Tung"
68 | __version__ = "0.8.2"
69 |
70 |
71 | """
72 | Change History
73 |
74 | Version 0.8.2
75 | * Show output inline instead of popup window (Viorel Lupu).
76 |
77 | Version in 0.8.1
78 | * Validated XHTML (Wolfgang Borgert).
79 | * Added description of test classes and test cases.
80 |
81 | Version in 0.8.0
82 | * Define Template_mixin class for customization.
83 | * Workaround a IE 6 bug that it does not treat
290 |
291 | %(heading)s
292 | %(report)s
293 | %(ending)s
294 |
295 |