天天看點

第二個python&selenium自動化測試實戰項目

第二個python&selenium自動化測試實戰項目

一.前言:

之前的文章說過, 要寫一篇自動化實戰的文章, 這段時間比較忙再加回家過11一直沒有更新部落格,今天整理一下實戰項目的代碼共大家學習。(注:項目是針對我們公司内部系統的測試,隻能内部網絡通路,外部網絡無法通路)問:1.外部網絡無法通路,代碼也無法運作,那還看這個項目有啥用2.如何學習本項目

3.如何學習自動化測試(python+selenium)

前言

之前的文章說過, 要寫一篇自動化實戰的文章, 這段時間比較忙再加回家過11一直沒有更新部落格,今天整理一下實戰項目的代碼共大家學習。(注:項目是針對我們公司内部系統的測試,隻能内部網絡通路,外部網絡無法通路)

問:

1.外部網絡無法通路,代碼也無法運作,那還看這個項目有啥用

2.如何學習本項目

3.如何學習自動化測試(python+selenium)

答:

1.其實代碼并不重要,希望大家完完整整的看完這個項目後,自己會有思路有想法,學會這個項目的架構結構和設計思想,把這些能應用到自己的項目中,那麼目的就達到了(項目中涉及到的一些公共方法是可以單獨運作的,大家可以拿來執行用到自己的項目中)

2.首先希望大家帶着目标來學習這個項目1. 項目的目錄結構(每個目錄中存放什麼東西)2.項目如何使用架構(本項目使用的是unittest架構)3.設計模式是如何應用在本項目中的(本項目應用page object設計模式)

3.個人而言

1)如果你沒有任何的程式設計基礎,建議先學習一門程式設計語言,包括環境的搭建,自己動手寫代碼,遇到問題多想多琢磨,這樣一定會加深自己的印象。如果你有一定的程式設計基礎那麼直接看看python的基礎文法和selenium就ok(我的自動化測試經驗也有限,可能給不了大家太多的建議 ,當然會的越多越好 呵!)

2)自己動手搭個架構,手寫一個實戰的項目,這時候你會發現你還有好多東西不會,那麼線路就來了,哪裡不會就去學哪裡,邊學邊寫,直到你的項目完成,再次回味就會發現你會了好多,當然不會的東西更多了因為你的思路慢慢的擴寬了,你會想到無人值守,內建等等的想法

3)可以參加教育訓練機構的教育訓練,說實話現在的教育訓練機構越來越多,個人認為有些機構的老師确實是沒什麼水準的,因為他們教的是基礎沒有太多的拔高内容,但是有一點是好了,你可以很系統的學習一系列的自動化知識

ok 說了很多廢話,大家不要介意!直接上項目

項目簡介

項目名稱:**公司電子零售會員系統

項目目的:實作電子零售會員系統項目自動化測試執行

項目版本:v1.0

項目目錄

Retail_TestPro
    Docs# 存放項目的相關文檔        
        01測試計劃
        02測試大綱
        03測試用例
        04測試報告
        05測試進度
        06技術文檔
        07測試申請
    Package# 存放第三方插件
        HTMLTestRunner.py
    Retail            
        Config
            __init__.py
            Conf.py# 讀配置檔案擷取項目跟目錄路徑 并擷取所有欲使用的目錄檔案的路徑
            Config.ini# 存放項目跟目錄的路徑
        Data
            TestData
                __init__.py
                elementDate.xlsx# 存放項目中所有的元素資訊及測試資料
                Email_receiver.txt# 存放郵件的接受者資訊
        Report# 測試報告
            Image
                Fail# 存放用例執行失敗時的截圖
                Pass# 存放用例執行成功時的截圖
            Log# 存放用例執行過程中的log資訊
            TestReport# 存放測試用例執行完成後生成的測試報告
        Test_case# 測試用例資訊
            Models # 存放一些公共方法
                Doconfini.py# 讀配置檔案
                Doexcel.py# 讀excel檔案
                Driver.py# 存放driver
                Log.py# 生成log
                Myunit.py# 繼承unittest.Testcase
                Sendmail.py# 發送郵件
                Strhandle.py# 字元串處理
                Tcinfo.py# 測試用例基本資訊
                Testreport.py# 測試報告
            Page_obj# 測試子產品
                Activerule_page.py
                Base_page.py
                Company_page.py
                Createrule_page.py
                Memberquery_page.py
                Modifypw_page.py
                Pointquery_page.py
                ActiveRuleTc.py
                CompanyQueryTc.py
                CreateRuleTc.py
                LoginTc.py
                MemberQueryTc.py
                ModifyPwTc.py
                PointQueryTc.py
        runTc.py# 執行測試用例                                  
第二個python&selenium自動化測試實戰項目

項目環境

本版

python 36

pip insatll selenium

PyCharm 2017.2.4

Windows 10 10.0

HTMLTestRunner.py

項目架構

unittest單元測試架構

pageobject 設計模式

UI對象庫思想

項目設計

1.一個子產品(被測項目的頁面)對應一個py檔案及一個測試類(測試檔案)

2.每一個測試頁面(系統的頁面)中存儲頁面元素及此頁面中涉及到的功能

3.每一個用例組合在一個測試類裡面生成一個py檔案

項目目标

我們在寫自動化測試項目的時候一定要想好你的腳本都要哪些功能,頁面元素平凡改動的時候是否需要大批量的修改腳本,及測試不同資料時是否也要修改腳本,那麼能想到這些我們的初始目标差不多就有了

1. 生成測試用例執行結果報告

2.生成測試用例執行日志

3.用例執行失敗或者執行完成後自動發送郵件報告

4. 用例執行失敗或者成功時截取圖檔

5.資料驅動(讀取測試資料,減少腳本維護成本)

項目代碼

config.ini # 存放項目跟路徑

[project]
project_path = D:\Petrochina_Retail_Test_Project
      
1 \'\'\'
 2 Code description:read config.ini, get path
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 import os
 7 import sys
 8 from retail.test_case.models.doconfIni import DoConfIni
 9 
10 # 擷取目前路徑
11 currPath= \
12     os.path.split(os.path.realpath(__file__))[0]
13 
14 # 讀配置檔案擷取項目路徑
15 readConfig = \
16     DoConfIni()
17 proPath = \
18     readConfig.getConfValue(os.path.join(currPath,\'config.ini\'),\'project\',\'project_path\')
19 
20 # 擷取日志路徑
21 logPath= \
22     os.path.join(proPath,\'retail\',\'report\',\'Log\')
23 
24 # 測試用例路徑
25 tcPath = \
26     os.path.join(proPath,\'retail\',\'test_case\')
27 
28 # 擷取報告路徑
29 reportPath= \
30     os.path.join(proPath,\'retail\',\'report\',\'TestReport\')
31 
32 # 擷取測試資料路徑
33 dataPath= \
34     os.path.join(proPath,\'retail\',\'data\',\'TestData\')
35 
36 # 儲存截圖路徑
37 # 錯誤截圖
38 failImagePath = os.path.join(proPath, \'retail\', \'report\', \'image\',\'fail\')
39 # 成功截圖
40 passImagePath = os.path.join(proPath, \'retail\', \'report\', \'image\',\'pass\')
41 
42 # 被調函數名稱
43 funcName = sys._getframe().f_code.co_name
44 # 被調函數所在行号
45 funcNo = sys._getframe().f_back.f_lineno
46 
47 # 被調函數所在檔案名稱
48 funcFile= sys._getframe().f_code.co_filename      

conf.py

elementData.xlsx # 存放所有的測試資料及元素

一個excel檔案,不友善貼裡面内容(先過,别管裡面是啥了  哈哈 後面再找吧)

mail_receiver.txt# 存放郵件接收者的賬号 , 可以添加多個賬号以‘,’号分割

**@qq.com       

公共方法models下面的檔案:

doconfini.py

1 \'\'\'
 2 Code description:read conf file
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 import logging
 8 import configparser
 9 from retail.config.conf import *
10 from retail.test_case.models.log import Logger
11 
12 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
13 class DoConfIni(object):
14 
15     def __init__(self):
16         """
17 
18         :param filename:
19         """
20         self.cf = configparser.ConfigParser()
21     
22     # 從ini檔案中讀資料
23     def getConfValue(self,filename,section,name):
24         """
25 
26         :param config:
27         :param name:
28         :return:
29         """
30         try:
31             self.cf.read(filename)
32             value = self.cf.get(section,name)
33         except Exception as e:
34             log.logger.exception(\'read file [%s] for [%s] failed , did not get the value\' %(filename,section))
35             raise e
36         else:
37             log.logger.info(\'read excel value [%s] successed! \' %value)
38             return value
39     # 向ini檔案中寫資料
40     def writeConfValue(self,filename, section, name, value):
41         """
42 
43         :param section: section
44         :param name: value name
45         :param value:  value
46         :return: none
47         """
48         try:
49             self.cf.add_section(section)
50             self.cf.set(section, name, value)
51             self.cf.write(open(filename, \'w\'))
52         except Exception :
53             log.logger.exception(\'section %s has been exist!\' %section)
54             raise configparser.DuplicateSectionError(section)
55         else:
56             log.logger.info(\'write section\'+section+\'with value \'+value+\' successed!\')
57 
58 if __name__ == \'__main__\':
59     file_path = currPath
60     print(file_path)
61     read_config = DoConfIni()
62 
63     value = read_config.getConfValue(os.path.join(currPath,\'config.ini\'),\'project\',\'project_path\')
64     print(value)
65 
66     read_config.writeConfValue(os.path.join(currPath,\'config.ini\'),\'tesesection\', \'name\', \'hello word\')      

doexcel.py

1 \'\'\'
 2 Code description:read excel.xlsx, get values
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 import xlrd
 8 import os
 9 import logging
10 from retail.config import conf
11 from retail.test_case.models.log import Logger
12 
13 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
14 
15 class ReadExcel(object):
16 
17     def __init__(self,fileName=\'elementDate.xlsx\',sheetName=\'elementsInfo\'):
18         """
19 
20         :param fileName:
21         :param sheetName:
22         """
23         try:
24             self.dataFile = os.path.join(conf.dataPath, fileName)
25             self.workBook = xlrd.open_workbook(self.dataFile)
26             self.sheetName = self.workBook.sheet_by_name(sheetName)
27         except Exception:
28             log.logger.exception(\'init class ReadExcel fail\', exc_info=True)
29             raise
30         else:
31             log.logger.info(\'initing class ReadExcel\')
32     # 讀excel中的資料
33     def readExcel(self,rownum,colnum):
34         """
35 
36         :param rownum:
37         :param colnum:
38         :return:
39         """
40         try:
41             value = self.sheetName.cell(rownum,colnum).value
42         except Exception:
43             log.logger.exception(\'read value from excel file fail\', exc_info=True)
44             raise
45         else:
46             log.logger.info(\'reading value [%s] from excel file [%s] completed\' %(value, self.dataFile))
47             return value
48 
49 if __name__ == \'__main__\':
50     cellValue = ReadExcel().readExcel(1,3)
51     print((cellValue))      

log.py

1 \'\'\'
 2 Code description:log info
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 import logging
 8 import time
 9 
10 
11 class Logger(object):
12     def __init__(self, logger, CmdLevel=logging.INFO, FileLevel=logging.INFO):
13         """
14 
15         :param logger:
16         :param CmdLevel:
17         :param FileLevel:
18         """
19         self.logger = logging.getLogger(logger)
20         self.logger.setLevel(logging.DEBUG)  # 設定日志輸出的預設級别
21         # 日志輸出格式
22         fmt = logging.Formatter(\'%(asctime)s - %(filename)s:[%(lineno)s] - [%(levelname)s] - %(message)s\')
23         # 日志檔案名稱
24         # self.LogFileName = os.path.join(conf.log_path, "{0}.log".format(time.strftime("%Y-%m-%d")))# %H_%M_%S
25         currTime = time.strftime("%Y-%m-%d")
26         self.LogFileName = r\'D:\Petrochina_Retail_Test_Project\retail\report\Log\log\'+currTime+\'.log\'
27         # 設定控制台輸出
28         # sh = logging.StreamHandler()
29         # sh.setFormatter(fmt)
30         # sh.setLevel(CmdLevel)# 日志級别
31 
32         # 設定檔案輸出
33         fh = logging.FileHandler(self.LogFileName)
34         fh.setFormatter(fmt)
35         fh.setLevel(FileLevel)# 日志級别
36 
37         # self.logger.addHandler(sh)
38         self.logger.addHandler(fh)
39 
40     # def debug(self, message):
41     #     """
42     #
43     #     :param message:
44     #     :return:
45     #     """
46     #     self.logger.debug(message)
47     #
48     # def info(self,message):
49     #     """
50     #
51     #     :param message:
52     #     :return:
53     #     """
54     #     self.logger.info(message)
55     #
56     # def warn(self,message):
57     #     """
58     #
59     #     :param message:
60     #     :return:
61     #     """
62     #     self.logger.warning(message)
63     #
64     # def error(self,message):
65     #     """
66     #
67     #     :param message:
68     #     :return:
69     #     """
70     #     self.logger.error(message)
71     #
72     # def criti(self,message):
73     #     """
74     #
75     #     :param message:
76     #     :return:
77     #     """
78     #     self.logger.critical(message)
79 
80 if __name__ == \'__main__\':
81     logger = Logger("fox",CmdLevel=logging.DEBUG, FileLevel=logging.DEBUG)
82     logger.logger.debug("debug")
83     logger.logger.log(logging.ERROR,\'%(module)s %(info)s\',{\'module\':\'log日志\',\'info\':\'error\'}) #ERROR,log日志 error      

sendmail.py

1 \'\'\'
  2 Code description:send email
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 
  7 import smtplib
  8 from email.mime.text import MIMEText
  9 from email.header import Header
 10 import os
 11 from retail.config import conf
 12 from retail.test_case.models.log import Logger
 13 
 14 log = Logger(__name__)
 15 #   郵件發送接口
 16 class SendMail(object):
 17     \'\'\'
 18     郵件配置資訊
 19     \'\'\'
 20     def __init__(self,
 21                  receiver,
 22                  subject=\'Retail 系統測試報告\',
 23                  server=\'smtp.qq.com\',
 24                  fromuser=\'[email protected]\',
 25                  frompassword=\'gifhhsbgqyovbhhc\',
 26                  sender=\'[email protected]\'):
 27         """
 28 
 29         :param receiver:
 30         :param subject:
 31         :param server:
 32         :param fromuser:
 33         :param frompassword:
 34         :param sender:
 35         """
 36 
 37         self._server = server
 38         self._fromuser = fromuser
 39         self._frompassword = frompassword
 40         self._sender = sender
 41         self._receiver = receiver
 42         self._subject = subject
 43 
 44     def sendEmail(self, fileName):
 45         """
 46 
 47         :param filename:
 48         :return:
 49         """
 50         #   打開報告檔案讀取檔案内容
 51         try:
 52             f = open(os.path.join(conf.reportPath, fileName), \'rb\')
 53             fileMsg = f.read()
 54         except Exception:
 55             log.logger.exception(\'open or read file [%s] failed,No such file or directory: %s\' %(fileName, conf.reportPath))
 56             log.logger.info(\'open and read file [%s] successed!\' %fileName)
 57         else:
 58             f.close()
 59             #   郵件主題
 60             subject = \'Python test report\' #
 61             #   郵件設定
 62             msg = MIMEText(fileMsg, \'html\', \'utf-8\')
 63             msg[\'subject\'] = Header(subject, \'utf-8\')
 64             msg[\'from\'] = self._sender
 65         #   連接配接伺服器,登入伺服器,發送郵件
 66             try:
 67                 smtp = smtplib.SMTP()
 68                 smtp.connect(self._server)
 69                 smtp.login(self._fromuser, self._frompassword)
 70             except Exception:
 71                 log.logger.exception(\'connect [%s] server failed or username and password incorrect!\' %smtp)
 72             else:
 73                 log.logger.info(\'email server [%s] login success!\' %smtp)
 74                 try:
 75                     smtp.sendmail(self._sender, self._receiver, msg.as_string())
 76                 except Exception:
 77                     log.logger.exception(\'send email failed!\')
 78                 else:
 79                     log.logger.info(\'send email successed!\')
 80 
 81 
 82 #   從檔案中讀取郵件接收人資訊
 83 def getReceiverInfo(fileName):
 84     \'\'\'
 85     :param filename: 讀取接收郵件人資訊
 86     :return: 接收郵件人資訊
 87     \'\'\'
 88     try:
 89         openFile = open(os.path.join(conf.dataPath, fileName))
 90     except Exception:
 91         log.logger.exception(\'open or read file [%s] failed,No such file or directory: %s\' %(fileName, conf.dataPath))
 92     else:
 93         log.logger.info(\'open file [%s] successed!\' %fileName)
 94         for line in openFile:
 95             msg = [i.strip() for i in line.split(\',\')]
 96             log.logger.info(\'reading [%s] and got receiver value is [%s]\' %(fileName, msg))
 97             return msg
 98 
 99 if __name__ == \'__main__\':
100     readMsg=getReceiverInfo(\'mail_receiver.txt\')
101     sendmail = SendMail(readMsg)
102     sendmail.sendEmail(\'2018-09-21 17_44_04.html\')      

strhandle.py

1 \'\'\'
 2 Code description: string handle
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 import logging
 8 from retail.test_case.models.log import Logger
 9 
10 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
11 def strhandle(str):
12     """
13 
14     :param str:
15     :return:
16     """
17     #初始化字元、數字、空格、特殊字元的計數
18     try:
19         lowerCase = 0
20         upperCase = 0
21         number = 0
22         other = 0
23         for stritem in str:
24          #如果在字元串中有小寫字母,那麼小寫字母的數量+1
25             if stritem.islower():
26                 lowerCase += 1
27             #如果在字元串中有數字,那麼數字的數量+1
28             elif stritem.isdigit():
29                 number += 1
30             elif stritem.isupper():# 大寫字母
31                 upperCase +=1
32             #如果在字元串中有空格,那麼空格的數量+1
33             else:
34                 other += 1
35         return lowerCase, upperCase, number, other
36     except Exception as e:
37         log.logger.exception(\'string handle error , please check!\', exc_info=True)
38         raise e
39 
40 
41 if __name__==\'__main__\':
42     list = [\'qwert\',\'erwer\']
43     lowercase, uppercase, number, other = strhandle(list[0])
44     print ("該字元串中的小寫字母有:%d" %lowercase)
45     print ("該字元串中的大寫寫字母有:%d" %uppercase)
46     print ("該字元串中的數字有:%d" %number)
47     print ("該字元串中的特殊字元有:%d" %other)      

testreport.py

1 \'\'\'
 2 Code description:test report
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 
 8 import time
 9 import logging
10 import unittest
11 from BeautifulReport import BeautifulReport
12 import HTMLTestRunner
13 from retail.config import conf
14 from retail.test_case.models.log import Logger
15 
16 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
17 # 用HTMLTestRunner 實作的測試報告
18 def testreport():
19     """
20 
21     :return:
22     """
23     currTime = time.strftime(\'%Y-%m-%d %H_%M_%S\')
24     fileName = conf.reportPath + r\'\report\' + currTime + \'.html\'
25     try:
26         fp = open(fileName, \'wb\')
27     except Exception :
28         log.logger.exception(\'[%s] open error cause Failed to generate test report\' %fileName)
29     else:
30         runner = HTMLTestRunner.HTMLTestRunner\
31             (stream=fp, title=\'Retail sys測試報告\',
32                                                description=\'處理器:Intel(R) Core(TM) \'
33                                                            \'i5-6200U CPU @ 2030GHz 2.40 GHz \'
34                                                 \'記憶體:8G 系統類型: 64位 版本: windows 10 家庭中文版\')
35         log.logger.info(\'successed to generate test report [%s]\' %fileName)
36         return runner, fp, fileName
37 #
38 def addTc(TCpath = conf.tcPath, rule = \'*TC.py\'):
39     """
40 
41     :param TCpath: 測試用例存放路徑
42     :param rule: 比對的測試用例檔案
43     :return:  測試套件
44     """
45     discover = unittest.defaultTestLoader.discover(TCpath, rule)
46 
47     return discover
48 # 用BeautifulReport子產品實作測試報告
49 def runTc(discover):
50     """
51 
52     :param discover: 測試套件
53     :return:
54     """
55     currTime = time.strftime(\'%Y-%m-%d %H_%M_%S\')
56     fileName = currTime+\'.html\'
57     try:
58         result = BeautifulReport(discover)
59         result.report(filename=fileName, description=\'測試報告\', log_path=conf.reportPath)
60     except Exception:
61         log.logger.exception(\'Failed to generate test report\', exc_info=True)
62     else:
63         log.logger.info(\'successed to generate test report [%s]\' % fileName)
64         return fileName
65 
66 if __name__ == \'__main__\':
67     testreport()
68     suite = addTc(rule = \'*TC.py\')
69     runTc(suite)      

driver.py

1 \'\'\'
 2 Code description:save all driver info
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 from selenium import webdriver
 8 import logging
 9 import sys
10 from retail.test_case.models.log import Logger
11 
12 
13 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
14 class WDriver(object):
15 
16     # Firefox driver
17     def fireFoxDriver(self):
18         """
19 
20         :return:
21         """
22         try:
23             self.driver = webdriver.Firefox()
24         except Exception as e:
25             log.logger.exception(\'FireFoxDriverServer.exe executable needs to be in PATH. Please download!\', exc_info=True)
26             raise e
27         else:
28             log.logger.info(\'%s:found the Firefox driver [%s] successed !\' %(sys._getframe().f_code.co_name,self.driver))
29             return self.driver
30 
31     # chrom driver
32     def chromeDriver(self):
33         """
34 
35         :return:
36         """
37         try:
38             # option = webdriver.ChromeOptions()# 實作不打開浏覽器 執行web自動化測試腳本
39             # option.add_argument(\'headless\')#
40             # self.driver = webdriver.Chrome(chrome_options=option)
41             self.driver = webdriver.Chrome()
42         except Exception as e:
43             log.logger.exception(\'ChromeDriverServer.exe executable needs to be in PATH. Please download!\',
44                                  exc_info=True)
45             raise e
46         else:
47             log.logger.info(\'%s:found the chrome driver [%s] successed !\' % (sys._getframe().f_code.co_name, self.driver))
48             return self.driver
49 
50 
51     # Ie driver
52     def ieDriver(self):
53         """
54 
55         :return:
56         """
57         try:
58             self.driver = webdriver.Ie()
59         except Exception as e:
60             log.logger.exception(\'IEDriverServer.exe executable needs to be in PATH. Please download!\',
61                                  exc_info=True)
62             raise e
63         else:
64             log.logger.info(\'%s:found the IE driver [%s] successed !\' % (sys._getframe().f_code.co_name, self.driver))
65             return self.driver
66 
67 
68 if __name__ == \'__main__\':
69     WDrive=WDriver()
70     WDrive.fireFoxDriver()      

myunittest.py

1 \'\'\'
 2 Code description:unittest framwork
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 from retail.test_case.models.driver import WDriver
 8 import logging
 9 import unittest
10 from retail.test_case.page_obj.login_page import LoginPage
11 from retail.test_case.models.log import Logger
12 from selenium import webdriver
13 
14 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
15 class MyunitTest(unittest.TestCase):
16     """
17 
18     """
19 
20     # add by xuechao at 2018.09.19
21     @classmethod
22     def setUpClass(cls): # 一個測試類(檔案)執行一次打開浏覽器, 節約每個用例打開一次浏覽器的時間
23 
24         #cls.driver = WDriver().fireFoxDriver()
25         cls.driver = WDriver().chromeDriver()
26         cls.driver.maximize_window()
27         log.logger.info(\'opened the browser successed!\')
28     # ----------------------------
29 
30     def setUp(self):
31         """
32 
33         :return:
34         """
35         self.login = LoginPage(self.driver)
36         self.login.open()
37         log.logger.info(\'************************starting run test cases************************\')
38 
39     def tearDown(self):
40         """
41 
42         :return:
43         """
44         self.driver.refresh()
45         log.logger.info(\'************************test case run completed************************\')
46 
47     # add by linuxchao at 2018.09.19
48     @classmethod
49     def tearDownClass(cls):
50         cls.driver.quit()
51         log.logger.info(\'quit the browser success!\')
52     #----------------------------
53 if __name__ == \'__main__\':
54     unittest.main()      

目前為止,我需要的所有的公共方法都編寫完了, 後期再需要别的方法可以加,下面我們就開始編寫我們的測試用例,由于我們使用的是PageObject模式,那麼我們需要設計一個basepage頁面,所有的頁面或者說子產品全部繼承這個basepage,basepage主要編寫所有頁面的公共方法

1 \'\'\'
  2 Code description: base page 封裝一些公共方法
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 from selenium.webdriver.support.wait import WebDriverWait
  7 from selenium.webdriver.support import expected_conditions as EC
  8 from selenium.webdriver.common.by import By
  9 import os
 10 import logging
 11 import sys
 12 from retail.test_case.models.log import Logger
 13 from retail.config import conf
 14 from retail.test_case.models.doexcel import ReadExcel
 15 
 16 eleData = ReadExcel() # 存儲系統所有的元素資料
 17 testLoginData = ReadExcel(\'elementDate.xlsx\', \'userNamePw\') # 登入子產品測試資料
 18 modifyPwData = ReadExcel(\'elementDate.xlsx\', \'modifyPw\') # 修改密碼子產品測試資料
 19 queryData = ReadExcel(\'elementDate.xlsx\', \'queryData\')
 20 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
 21 
 22 class BasePage(object):
 23 
 24     """主菜單"""
 25     menuList = \
 26         [(By.LINK_TEXT, eleData.readExcel(7, 3)), # 權限管理
 27         (By.LINK_TEXT, eleData.readExcel(8, 3)), # 會員檔案
 28         (By.LINK_TEXT, eleData.readExcel(9, 3)), # 積分消費查詢
 29         (By.LINK_TEXT, eleData.readExcel(10, 3)), # 功能示範
 30         (By.LINK_TEXT, eleData.readExcel(11, 3)), # 待辦工作
 31         (By.LINK_TEXT, eleData.readExcel(12, 3)), # 報表
 32         (By.LINK_TEXT, eleData.readExcel(13, 3)), # 積分規則/活動查詢
 33         (By.LINK_TEXT, eleData.readExcel(14, 3))] # 積分規則/活動申請
 34 
 35     def __init__(self, driver,url=\'http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp\'):
 36         """
 37 
 38         :param driver:
 39         :param url:
 40         """
 41         self.driver = driver
 42         self.base_url = url
 43     def _open(self,url):
 44         """
 45 
 46         :param url:
 47         :return:
 48         """
 49         try:
 50             self.driver.get(url)
 51             self.driver.implicitly_wait(10)
 52         except Exception as e:
 53             log.logger.exception(e, exc_info=True)
 54             raise ValueError(\'%s address access error, please check!\' %url)
 55         else:
 56             log.logger.info(\'%s is accessing address %s at line[46]\' %(sys._getframe().f_code.co_name,url))
 57 
 58     def open(self):
 59         """
 60 
 61         :return:
 62         """
 63 
 64         self._open(self.base_url)
 65         log.logger.info(\'%s loading successed!\' %self.base_url)
 66         return self.base_url
 67 
 68     # *loc 代表任意數量的位置參數
 69     def findElement(self, *loc):
 70         """
 71         查找單一進制素
 72         :param loc:
 73         :return:
 74         """
 75         try:
 76             WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
 77             # log.logger.info(\'The page of %s had already find the element %s\'%(self,loc))
 78             # return self.driver.find_element(*loc)
 79         except Exception as e:
 80             log.logger.exception(\'finding element timeout!, details\' ,exc_info=True)
 81             raise e
 82         else:
 83             log.logger.info(\'The page of %s had already find the element %s\' % (self, loc))
 84             return self.driver.find_element(*loc)
 85 
 86     def findElements(self, *loc):
 87         """
 88         查找一組元素
 89         :param loc:
 90         :return:
 91         """
 92         try:
 93             WebDriverWait(self.driver,10).until(EC.visibility_of_element_located(loc))
 94             # log.logger.info(\'The page of %s had already find the element %s\' % (self, loc))
 95             # return self.driver.find_elements(*loc)
 96         except Exception as e:
 97             log.logger.exception(\'finding element timeout!, details\', exc_info=True)
 98             raise e
 99         else:
100             log.logger.info(\'The page of %s had already find the element %s\' % (self, loc))
101             return self.driver.find_elements(*loc)
102 
103     def inputValue(self, inputBox, value):
104         """
105         後期修改其他頁面直接調用這個函數
106         :param inputBox:
107         :param value:
108         :return:
109         """
110         inputB = self.findElement(*inputBox)
111         try:
112             inputB.clear()
113             inputB.send_keys(value)
114         except Exception as e:
115             log.logger.exception(\'typing value error!\', exc_info=True)
116             raise e
117         else:
118             log.logger.info(\'inputValue:[%s] is receiveing value [%s]\' % (inputBox, value))
119 
120     # 擷取元素資料
121     def getValue(self, *loc):
122         """
123 
124         :param loc:
125         :return:
126         """
127         element = self.findElement(*loc)
128         try:
129             value = element.text
130             #return value
131         except Exception:
132             #element = self.find_element_re(*loc) # 2018.09.21 for log
133             value = element.get_attribute(\'value\')
134             log.logger.info(\'reading the element [%s] value [%s]\' % (loc, value))
135             return value
136         except:
137             log.logger.exception(\'read value failed\', exc_info=True)
138             raise Exception
139         else:
140             log.logger.info(\'reading the element [%s] value [%s]\' % (loc,value))
141             return value
142 
143     def getValues(self, *loc):
144         """
145 
146         :param loc:
147         :return:
148         """
149         value_list = []
150         try:
151             for element in self.findElements(*loc):
152                 value = element.text
153                 value_list.append(value)
154         except Exception as e:
155             log.logger.exception(\'read value failed\', exc_info=True)
156             raise e
157         else:
158             log.logger.info(\'reading the element [%s] value [%s]\'% (loc,value_list))
159             return value_list
160 
161     # 執行js腳本
162     def jScript(self,src):
163         """
164 
165         :param src:
166         :return:
167         """
168         try:
169             self.driver.excute_script(src)
170         except Exception as e:
171             log.logger.exception(\'execute js script [%s] failed \' %src)
172             raise e
173         else:
174             log.logger.info(\'execute js script [%s] successed \' %src)
175 
176 
177     # 判斷元素是否存在
178     def isElementExist(self, element):
179         """
180 
181         :param element:
182         :return:
183         """
184         try:
185             WebDriverWait(self.driver, 10).until(EC.visibility_of_element_located(element))
186         except:
187             # log.logger.exception(\'The element [%s] not exist\', exc_info=True)
188             return False
189         else:
190             # log.logger.info(\'The element [%s] have existed!\' %element)
191             return True
192     # 截圖
193     def saveScreenShot(self, filename):
194         """
195 
196         :param filename:
197         :return:
198         """
199         list_value = []
200 
201         list = filename.split(\'.\')
202         for value in list:
203             list_value.append(value)
204         if list_value[1] == \'png\' or list_value[1] == \'jpg\' or list_value[1] == \'PNG\' or list_value[1] == \'JPG\':
205             if \'fail\' in list_value[0].split(\'_\'):
206                 try:
207                     self.driver.save_screenshot(os.path.join(conf.failImagePath, filename))
208                 except Exception:
209                     log.logger.exception(\'save screenshot failed !\', exc_info=True)
210                 else:
211                     log.logger.info(\'the file [%s]  save screenshot successed under [%s]\' % (filename, conf.failImagePath))
212             elif \'pass\' in list_value[0]:
213                 try:
214                     self.driver.save_screenshot(os.path.join(conf.passImagePath, filename))
215                 except Exception:
216                     log.logger.exception(\'save screenshot failed !\', exc_info=True)
217                 else:
218                     log.logger.info(
219                         \'the file [%s]  save screenshot successed under [%s]\' % (filename, conf.passImagePath))
220             else:
221                 log.logger.info(\'save screenshot failed due to [%s] format incorrect\' %filename)
222         else:
223             log.logger.info(\'the file name of [%s] format incorrect cause save screenshot failed, please check!\' % filename)
224 
225     # 接受錯誤提示框
226     def accept(self, *loc):
227         """
228 
229         :return:
230         """
231         self.findElement(*loc).click()
232         log.logger.info(\'closed the error information fram successed!\')
233 
234 if __name__ == \'__main__\':
235     pass      

base_page.py

#登入頁面

1 \'\'\'
 2 Code description: login page
 3 Create time:
 4 Developer:
 5 \'\'\'
 6 
 7 from selenium.webdriver.common.by import By
 8 import logging
 9 import sys
10 from retail.test_case.page_obj.base_page import BasePage, eleData, testLoginData
11 from retail.test_case.models.log import Logger
12 
13 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
14 
15 
16 class LoginPage(BasePage):
17 
18     """使用者名,密碼,登入按鈕,儲存資訊,錯誤提示"""
19     userNameEle = (By.ID, eleData.readExcel(1, 3))
20     passWordEle = (By.ID, eleData.readExcel(2, 3))
21     loginBtnEle = (By.ID, eleData.readExcel(3, 3))
22     saveInfoEle = (By.NAME, eleData.readExcel(4, 3))
23     errorMessage = (By.ID, eleData.readExcel(5, 3))
24     quitBtn = (By.ID, eleData.readExcel(6, 3))
25 
26     # 使用者名和密碼
27     unpwData = \
28         [[testLoginData.readExcel(1, 0), testLoginData.readExcel(1, 1)],# 正确的使用者名和正确的密碼
29          [testLoginData.readExcel(2, 0), testLoginData.readExcel(2, 1)],# 錯誤的使用者名和正确的密碼
30          [testLoginData.readExcel(3, 0), testLoginData.readExcel(3, 1)],# 空的使用者名和正确的密碼
31          [testLoginData.readExcel(4, 0), testLoginData.readExcel(4, 1)],# 錯誤的使用者名和錯誤的密碼
32          [testLoginData.readExcel(5, 0), testLoginData.readExcel(5, 1)],# 正确的使用者名和空密碼
33          [testLoginData.readExcel(6, 0), testLoginData.readExcel(6, 1)],# 正确的使用者名和錯誤的密碼
34          [testLoginData.readExcel(7, 0), testLoginData.readExcel(7, 1)]]# 空使用者名和空密碼
35 
36 
37     # 登入按鈕
38     def clickLoginBtn(self):
39         """
40 
41         :return:
42         """
43         element = self.findElement(*self.loginBtnEle)
44         element.click()
45         log.logger.info(\'%s ,logining....!\' % sys._getframe().f_code.co_name)
46     # 登入失敗時提示
47     def getFailedText(self):
48         """
49 
50         :return:
51         """
52         info = self.findElement(*self.errorMessage).text
53         log.logger.info(\'login failed : %s\' %info)
54         return info
55 
56     # 登入失敗時彈出的alert
57     def handleAlert(self):
58         """
59 
60         :return:
61         """
62         try:
63             alert = self.driver.switch_to_alert()
64             text = alert.text
65             alert.accept()
66         except Exception:
67             log.logger.exception(\'handle alert failed, please check the details\' ,exc_info=True)
68             raise
69         else:
70             log.logger.info(\'login failed ,%s handle alert successed alert info: %s!\' %(sys._getframe().f_code.co_name, text))
71             return text
72 
73     # 統一登入函數
74     def loginFunc(self, username=\'rmln\', password=\'qwert1234!@#\'):
75         """
76         :param username:
77         :param password:
78         :return:
79         """
80         self.inputValue(self.userNameEle, username)
81         self.inputValue(self.passWordEle, password)
82         self.clickLoginBtn()
83 
84     # 清空輸入框資料
85     def clearValue(self, element):
86 
87         empty = self.findElement(*element)
88         empty.clear()
89         log.logger.info(\'emptying value.......\')
90 
91 
92     # 推出
93     def quit(self):
94         self.findElement(*self.quitBtn).click()
95         log.logger.info(\'quit\')
96 
97 if __name__ == \'__main__\':
98     pass      

login_page.py

# 登入測試用例

1 """
  2 Code description:login testcase
  3 Create time:
  4 Developer:
  5 """
  6 
  7 import unittest
  8 import time
  9 import logging
 10 import sys
 11 from retail.test_case.models.myunit import MyunitTest
 12 from retail.test_case.models.log import Logger
 13 
 14 
 15 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
 16 
 17 class Login_TC(MyunitTest):
 18 
 19     """登入子產品測試用例"""
 20 
 21     def test_login_success_correct_username_password(self):
 22         """使用者名正确,密碼正确,登入成功"""
 23         self.login.loginFunc()
 24         currUrl = self.driver.current_url # 擷取目前的url位址
 25         try:
 26             self.assertIn(\'main\', currUrl, \'main not in current url!\')
 27         except Exception:
 28             self.login.saveScreenShot(\'correct_username_password_fail.png\')
 29             raise
 30         else:
 31             self.login.saveScreenShot(\'correct_username_password_pass.png\')
 32             log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 33 
 34     def test_login_failed_incorrect_username(self):
 35         """使用者名錯誤,密碼正确,登入失敗"""
 36 
 37         self.login.loginFunc(self.login.unpwData[1][0], self.login.unpwData[1][1])
 38         failText = self.login.getFailedText()
 39         self.assertEqual(\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'提示資訊錯誤\')
 40         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 41 
 42     def test_login_failed_incorrect_password(self):
 43 
 44         """使用者名正确,密碼錯誤,登入失敗"""
 45 
 46         self.login.loginFunc(self.login.unpwData[5][0], self.login.unpwData[5][1])
 47         failText = self.login.getFailedText()
 48         self.assertEqual(\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'提示資訊錯誤\')
 49         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 50 
 51     def test_login_failed_username_password_blank(self):
 52         """使用者名為空,密碼為空,登入失敗"""
 53 
 54         self.login.loginFunc(self.login.unpwData[6][0], self.login.unpwData[6][1])
 55         failText = self.login.handleAlert() # 擷取alert的提示資訊
 56         self.assertEqual(\'請填寫使用者名\', failText, \'提示資訊錯誤\')
 57         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 58 
 59     def test_login_failed_password_blank(self):
 60         """使用者名正确,密碼為空,登入失敗"""
 61 
 62         self.login.loginFunc(self.login.unpwData[4][0], self.login.unpwData[4][1])
 63         failText = self.login.handleAlert() # 擷取alert的提示資訊
 64         self.assertEqual(\'請填寫使用者密碼\', failText, \'提示資訊錯誤\')
 65         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 66 
 67     def test_login_failed_unpw_incorrect(self):
 68         """使用者名錯誤,密碼錯誤,登入失敗"""
 69         # try:
 70         self.login.loginFunc(self.login.unpwData[3][0], self.login.unpwData[4][0])
 71         failText = self.login.getFailedText()
 72         self.assertEqual (\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'failed\')
 73         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
 74 
 75     def test_login(self):
 76         """循環測試登入功能"""
 77         for listitem in self.login.unpwData:
 78             self.login.inputValue(self.login.userNameEle,listitem[0])
 79             time.sleep(2)
 80             self.login.inputValue(self.login.passWordEle,listitem[1])
 81             time.sleep(2)
 82             self.login.clickLoginBtn()
 83             time.sleep(2)
 84             if listitem[0] ==\'rmln\' and listitem[1] == \'qwert1234!@#\':
 85                 currUrl = self.driver.current_url
 86                 self.assertIn (\'main\' , currUrl)
 87                 self.login.quit()
 88             elif listitem[0] == \'rmln\' and listitem[1] != \'qwert1234!@#\':
 89                 if listitem[1] == \'\':
 90                     failText = self.login.handleAlert()  # 擷取alert的提示資訊
 91                     self.assertEqual(\'請填寫使用者密碼\', failText, \'提示資訊錯誤\')
 92                 else:
 93                     failText = self.login.getFailedText()
 94                     self.assertEqual(\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'提示資訊錯誤\')
 95             elif listitem[0] != \'rmln\' and listitem[1] == \'qwert1234!@#\':
 96                 if listitem[0]==\'\':
 97                     failText = self.login.handleAlert()  # 擷取alert的提示資訊
 98                     self.assertEqual(\'請填寫使用者名\', failText, \'提示資訊錯誤\')
 99                 else:
100                     failText = self.login.getFailedText()
101                     self.assertEqual(\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'提示資訊錯誤\')
102             elif listitem[0] == listitem[1] == \'\':
103                 failText = self.login.handleAlert()  # 擷取alert的提示資訊
104                 self.assertEqual(\'請填寫使用者名\', failText, \'提示資訊錯誤\')
105             else:
106                 failText = self.login.getFailedText()
107                 self.assertEqual(\'輸入的使用者名或密碼錯誤,請重新輸入!\', failText, \'提示資訊錯誤\')
108         log.logger.info(\'%s->run completed! please check the test report\' % (sys._getframe().f_code.co_name))
109 
110 if __name__ == \'__main__\':
111     unittest.main()      

LoginTc.py

# 修改密碼頁面

1 \'\'\'
  2 Code description:modify password page
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 
  7 import logging
  8 import time
  9 from selenium.webdriver.common.by import By
 10 from selenium.webdriver.common.action_chains import ActionChains
 11 from retail.test_case.page_obj.base_page import BasePage, eleData, modifyPwData
 12 from retail.test_case.models.log import Logger
 13 
 14 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
 15 class PrimaryMenu(BasePage):
 16 
 17     """密碼資料"""
 18     pwdList = \
 19         [[modifyPwData.readExcel(1, 0), modifyPwData.readExcel(1, 1), modifyPwData.readExcel(1, 2)],
 20          [modifyPwData.readExcel(2, 0), modifyPwData.readExcel(2, 1), modifyPwData.readExcel(2, 2)],
 21          [modifyPwData.readExcel(3, 0), modifyPwData.readExcel(3, 1), modifyPwData.readExcel(3, 2)],
 22          [modifyPwData.readExcel(4, 0), modifyPwData.readExcel(4, 1), modifyPwData.readExcel(4, 2)],
 23          [modifyPwData.readExcel(5, 0), modifyPwData.readExcel(5, 1), modifyPwData.readExcel(5, 2)]]
 24 
 25     """權限管理下拉菜單"""
 26     menuPersonal = (By.LINK_TEXT, eleData.readExcel(15, 3))
 27     menuModifyPwd = (By.LINK_TEXT, eleData.readExcel(16, 3))
 28 
 29     """密碼修改"""
 30     oldPwd = (By.ID, eleData.readExcel(17, 3))
 31     newPwd = (By.ID, eleData.readExcel(18, 3))
 32     commitPwd = (By.ID, eleData.readExcel(19, 3))
 33 
 34     """錯誤提示框及确定"""
 35     errMessage = (By.XPATH, eleData.readExcel(20, 3))
 36     closeBtn = (By.CSS_SELECTOR, eleData.readExcel(21, 3))
 37 
 38     """密碼說明"""
 39     readMe = (By.ID, eleData.readExcel(22, 3))
 40 
 41     """儲存"""
 42     saveBtn = (By.XPATH, eleData.readExcel(23, 3))
 43 
 44     #   主菜單
 45     def findMenu(self,*menuList):
 46         """
 47 
 48         :param menu_list:
 49         :return:
 50         """
 51         return self.findElement(*menuList)
 52 
 53     #   舊密碼輸入框
 54     def inputOldPw(self, oldPwd=\'\'):
 55         """"""
 56         try:
 57             self.findElement(*self.oldPwd).clear()
 58             self.findElement(*self.oldPwd).send_keys(oldPwd)
 59         except Exception:
 60             log.logger.exception(\'input Pw [%s] for oldPw [%s] fail\' %(oldPwd, self.oldPwd))
 61             raise
 62         else:
 63             log.logger.info(\'inputing Pw [%s] for oldPw [%s] \' % (oldPwd, self.oldPwd))
 64     #   新密碼輸入框
 65     def inputNewPw(self, newPwd=\'\'):
 66         """
 67 
 68         :param newPwd:
 69         :return:
 70         """
 71         try:
 72             self.findElement(*self.newPwd).clear()
 73             self.findElement(*self.newPwd).send_keys(newPwd)
 74         except Exception:
 75             log.logger.exception(\'input Pw [%s] for newPw [%s] fail\' % (newPwd, self.newPwd))
 76             raise
 77         else:
 78             log.logger.info(\'inputing Pw [%s] for newPw [%s] \' % (newPwd, self.newPwd))
 79     #   确認密碼輸入框
 80     def inputConfirmPw(self, confirmPwd=\'\'):
 81         """
 82 
 83         :param confirmPwd:
 84         :return:
 85         """
 86         try:
 87             self.findElement(*self.commitPwd).clear()
 88             self.findElement(*self.commitPwd).send_keys(confirmPwd)
 89         except Exception:
 90             log.logger.exception(\'input Pw [%s] for commitPw [%s] fail\' %(confirmPwd, self.commitPwd))
 91             raise
 92         else:
 93             log.logger.info(\'inputing Pw [%s] for commitPw [%s] \' %(confirmPwd, self.commitPwd))
 94     #   儲存
 95     def saveButton(self):
 96         """
 97 
 98         :return:
 99         """
100         try:
101             self.driver.implicitly_wait(5)
102             clickbutton = self.findElement(*self.saveBtn)
103             time.sleep(1)
104             clickbutton.click()
105         except Exception:
106             log.logger.exception(\'click save button fail\')
107             raise
108         else:
109             log.logger.info(\'clciking the button\')
110 
111     #   修改密碼功能菜單
112     def modifyPwMenu(self):
113         """
114 
115         :return:
116         """
117         try:
118             self.findElement(*self.menuList[0]).click()
119             self.findElement(*self.menuPersonal).click()
120             self.findElement(*self.menuModifyPwd).click()
121         except Exception:
122             log.logger.exception(\'not found menu [%s]-[%s]-[%s]\' %(self.menuList[0], self.menuPersonal, self.menuModifyPwd))
123             raise
124         else:
125             log.logger.info(\'finding menu [%s]-[%s]-[%s]\' %(self.menuList[0], self.menuPersonal, self.menuModifyPwd))
126             self.driver.implicitly_wait(2)
127 
128     #   修改密碼
129     def modifyPw(self, list):
130         """
131 
132         :param list:
133         :return:
134         """
135         try:
136             self.inputOldPw(list[0])
137             self.inputNewPw(list[1])
138             self.inputConfirmPw(list[2])
139             self.saveButton()
140         except Exception:
141             log.logger.exception(\'input oldpw/newpw/commitpw [%s]/[%s]/[%s] fail\' %(list[0], list[1], list[2]))
142             raise
143         else:
144             log.logger.info(\'modifing pw [%s]/[%s]/[%s]\' %(list[0], list[1], list[2]))
145 
146     #   錯誤提示框
147     def errorDialog(self, commit_btn = (By.ID,\'unieap_form_Button_1_unieap_input\')):
148         """
149         :type commit_btn: 元祖
150         """
151 
152         try:
153             messages_frame = self.findElement(*self.errMessage)
154             text = messages_frame.text
155             element = self.findElement(*commit_btn)
156             time.sleep(2)
157             action = ActionChains(self.driver)
158             action.move_to_element(element).perform()
159             time.sleep(2)
160             element.click()
161             action.reset_actions() # 釋放滑鼠
162         except Exception:
163             log.logger.exception(\'close errMsgFram [%s] or get text [%s]fail\' %(self.errMessage))
164             raise
165         else:
166             log.logger.info(\'close errMsgFram [%s] and get text [%s] success\' %(self.errMessage, text))
167             return text
168 
169     # 關閉提示框
170     def closeErrMsg(self, element):
171         try:
172             ele = self.findElement(*element)
173             action = ActionChains(self.driver)
174             action.move_to_element(ele).perform()
175             time.sleep(2)
176             ele.click()
177             action.reset_actions()
178         except Exception:
179             log.logger.exception(\'close the err msg ifram fail\', exc_info=True)
180             raise
181         else:
182             log.logger.info(\'closing the err msg ifram success!\')
183 
184 if __name__ == \'__main__\':
185     pass      

modifypw_page.py

# 修改密碼測試用例

1 \'\'\'
  2 Code description:權限管理/個人設定/密碼修改 testcase
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 
  7 import time
  8 from retail.test_case.models.myunit import MyunitTest
  9 from retail.test_case.page_obj.modifypw_page import PrimaryMenu
 10 from retail.test_case.models.strhandle import strhandle
 11 
 12 class ModifyPw_TC(MyunitTest):
 13 
 14     """權限管理/個人設定/密碼修改子產品測試用例"""
 15 
 16     def test_menu_is_display(self):
 17         """主菜單校驗"""
 18         self.login.loginFunc()
 19         menu = PrimaryMenu(self.driver)
 20         time.sleep(4)
 21         num = 0
 22         for menu_item in menu.menuList: # 循環周遊并斷言菜單是否正确
 23             self.assertEqual(menu.menuList[num][1],(menu.findMenu(*menu_item).text),\'菜單不存在\')
 24             num=num+1
 25 
 26     def test_modify_password_len(self):
 27         """舊密碼非空,新密碼長度小于4位,确認密碼非空,修改密碼失敗,彈窗提示"""
 28         self.login.loginFunc()
 29         menu = PrimaryMenu(self.driver)
 30         menu.modifyPwMenu() # 查找修改密碼頁面
 31         menu.modifyPw(menu.pwdList[0]) # 修改密碼
 32         text = menu.errorDialog(menu.closeBtn)
 33         self.assertIn(\'密碼長度至少 4 位!\', text, \'提示資訊錯誤\') # 密碼長度不滿足時斷言提示資訊
 34 
 35     def test_modify_password_strebgth(self):
 36         """舊密碼非空,新密碼長度大于4且強度不夠,确認密碼非空,修改密碼失敗,彈窗提示"""
 37         self.login.loginFunc()
 38         menu = PrimaryMenu(self.driver)
 39         menu.modifyPwMenu() # 查找修改密碼頁面
 40         menu.modifyPw(menu.pwdList[1]) # 修改密碼
 41         text = menu.errorDialog(menu.closeBtn)
 42         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\') # 密碼強度不滿足時斷言提示資訊
 43 
 44     def test_modify_password_incorrect(self):
 45         """舊密碼不正确非空,新密碼等于确認密碼且滿足條件,修改密碼失敗,彈窗提示"""
 46         self.login.loginFunc()
 47         menu = PrimaryMenu(self.driver)
 48         menu.modifyPwMenu() # 查找修改密碼頁面
 49         menu.modifyPw(menu.pwdList[2]) # 修改密碼
 50         text = menu.errorDialog(menu.closeBtn)
 51         self.assertIn(\'舊密碼輸入錯誤!\', text, \'舊密碼輸入錯誤!\') # 新密碼和确認碼不同時斷言提示資訊
 52 
 53     def test_modify_password_difference(self):
 54         """舊密碼非空,新密碼不等于确認密碼且新密碼滿足條件,修改密碼失敗,彈窗提示"""
 55         self.login.loginFunc()
 56         menu = PrimaryMenu(self.driver)
 57         menu.modifyPwMenu() # 查找修改密碼頁面
 58         menu.modifyPw(menu.pwdList[3]) # 修改密碼
 59         text = menu.errorDialog(menu.closeBtn)
 60         self.assertIn(\'兩次輸入的新密碼不同!\', text, \'兩次輸入的新密碼不同!\') # 新密碼和确認碼不同時斷言提示資訊
 61 
 62     def test_modify_password_all_blank(self):
 63         """舊密碼,新密碼,确認密碼任意為空,修改密碼失敗,彈窗提示"""
 64         self.login.loginFunc()
 65         menu = PrimaryMenu(self.driver)
 66         menu.modifyPwMenu() # 查找修改密碼頁面
 67         menu.modifyPw(menu.pwdList[4]) # 修改密碼
 68         text = menu.errorDialog(menu.closeBtn)
 69         self.assertIn(\'該輸入項的值不能為空!\', text, \' 該輸入項的值不能為空!\') # 所有密碼均為空時斷言提示資訊
 70 
 71     def test_modify_password(self):
 72         """循環校驗提示資訊"""
 73         self.login.loginFunc()
 74         menu = PrimaryMenu(self.driver)
 75         menu.modifyPwMenu() # 查找修改密碼頁面
 76         error_list = []
 77         for list in range(len(menu.pwdList)):
 78             menu.modifyPw(menu.pwdList[list])
 79             if menu.isElementExist(menu.errMessage):
 80                 text = menu.errorDialog(menu.closeBtn) # 這裡隻判斷是否有提示框彈出,如有說明修改失敗,沒有或者其他提示框預設為修改成功
 81                 error_list.append(text)
 82             else:
 83                 self.assertTrue(menu.isElementExist(*menu.errMessage), \'error fram not exist, please open bug\')
 84         self.assertEqual(\'密碼長度至少 4 位!\',error_list[0],\'log infomation error!\')
 85         self.assertEqual(\'密碼強度不夠,請重新輸入密碼!\', error_list[1], \'log infomation error!\')
 86         self.assertEqual(\'舊密碼輸入錯誤!\', error_list[2], \'log infomation error!\')
 87         self.assertEqual(\'兩次輸入的新密碼不同!\', error_list[3], \'log infomation error!\')
 88         self.assertEqual(\'該輸入項的值不能為空!\', error_list[4], \'log infomation error!\')
 89 
 90     def test_modifypw(self):
 91         """循環測試修改密碼功能"""
 92         self.login.loginFunc()# 登入
 93         menu = PrimaryMenu(self.driver)
 94         menu.modifyPwMenu()  # 查找修改密碼頁面
 95         for item in menu.pwdList:
 96             menu.modifyPw(item)
 97             if menu.isElementExist(menu.errMessage):  # 如果存在提示框 再斷言提示資訊是否正确
 98                 if item[0] != \'\' and len(item[1]) < 4  and item[2] !=\'\': # 新密碼長度校驗
 99                     text = menu.errorDialog(menu.closeBtn)
100                     try:
101                         self.assertEqual(\'密碼長度至少 4 位!\',text,\'the message incorrect!\')
102                     except Exception:
103                         menu.saveScreenShot(\'fail_密碼長度.png\')
104                         raise
105                 elif item[0] != \'\' and len(item[1]) >= 4 and item[2] !=\'\': # 新密碼強度校驗 [\'a\', \'qwert\', \'qwert\'],
106                     lowercase, uppercase, number, other=strhandle(item[1])
107                     if lowercase > 0 and uppercase > 0 and number == 0 and other == 0: # 小寫 大寫
108                         text = menu.errorDialog(menu.closeBtn)
109                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
110                     elif uppercase > 0 and other > 0 and number == 0 and lowercase == 0: # 大寫 特殊字元
111                         text = menu.errorDialog(menu.closeBtn)
112                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
113                     elif lowercase >0 and other > 0 and number == 0 and uppercase == 0: # 小寫 特殊字元
114                         text = menu.errorDialog(menu.closeBtn)
115                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
116                     elif lowercase == 0 and other == 0 and number > 0 and uppercase > 0:  # 大寫 數字
117                         text = menu.errorDialog(menu.closeBtn)
118                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
119                     elif lowercase > 0 and other == 0 and number > 0 and uppercase == 0:  # 小寫 數字
120                         text = menu.errorDialog(menu.closeBtn)
121                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
122                     elif lowercase > 0 and other == 0 and number == 0 and uppercase == 0:
123                         text = menu.errorDialog(menu.closeBtn)
124                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
125                     elif lowercase == 0 and other > 0 and number == 0 and uppercase == 0:
126                         text = menu.errorDialog(menu.closeBtn)
127                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
128                     elif lowercase == 0 and other == 0 and number > 0 and uppercase == 0:
129                         text = menu.errorDialog(menu.closeBtn)
130                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
131                     elif lowercase == 0 and other == 0 and number == 0 and uppercase > 0:
132                         text = menu.errorDialog(menu.closeBtn)
133                         self.assertIn(\'密碼強度不夠,請重新輸入密碼!\', text, \' 密碼強度不夠,請重新輸入密碼!\')
134                     elif item[0] != \'qwert1234!@#\' and item[1] == item[2]:# >= 4
135                         lowercase, uppercase, number, other = strhandle(item[1])
136                         if (lowercase > 0 and uppercase > 0 and number > 0) or (
137                                     lowercase > 0 and uppercase > 0 and other > 0) or (
138                                     number > 0 and other > 0 and lowercase > 0) or (
139                                     number > 0 and other > 0 and uppercase > 0):
140                             text = menu.errorDialog(menu.closeBtn)
141                             self.assertIn(\'舊密碼輸入錯誤!\', text, \'舊密碼輸入錯誤!\')  # 新密碼和确認碼不同時斷言提示資訊
142                     elif item[0] == \'qwert1234!@#$\' and item[1] != item[2]:# and item[1] >= 4:
143                         lowercase, uppercase, number, other = strhandle(item[1])
144                         if (lowercase > 0 and uppercase > 0 and number > 0) or (
145                                             lowercase > 0 and uppercase > 0 and other > 0) or (
146                                             number > 0 and other > 0 and lowercase > 0) or (
147                                             number > 0 and other > 0 and uppercase > 0):
148                             text = menu.errorDialog(menu.closeBtn)
149                             self.assertIn(\'兩次輸入的新密碼不同!\', text, \' 兩次輸入的新密碼不同!\')
150                     else:
151                         print(\'test value incorrect! please check it\')
152                 elif item[0] == \'\' or item[1] ==\'\' or item[2] ==\'\': # 輸入項為空校驗
153                     text = menu.errorDialog(menu.closeBtn)
154                     self.assertIn(\'該輸入項的值不能為空!\', text, \' 該輸入項的值不能為空!\')  # 所有密碼均為空時斷言提示資訊
155             else:
156                 self.assertTrue(menu.isElementExist(menu.errMessage), \'error fram not exist, please check the test value or file bug\')
157 
158 if __name__==\'__main__\':
159     pass      

ModifyPw.py

# 會員檔案查詢頁面

1 \'\'\'
  2 Code description:會員檔案查詢 page
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 
  7 from retail.test_case.page_obj.base_page import queryData
  8 import time
  9 from selenium.webdriver.common.by import By
 10 import logging
 11 import sys
 12 from retail.test_case.page_obj.modifypw_page import PrimaryMenu, eleData
 13 from retail.test_case.models.log import Logger
 14 
 15 log = Logger(__name__, CmdLevel=logging.INFO, FileLevel=logging.INFO)
 16 
 17 
 18 class MemberQuery(PrimaryMenu):
 19     """
 20 
 21     """
 22     # 測試資料: 會員編碼, 會員姓名, 手機号碼
 23     valuesList = [queryData.readExcel(1, 1), int(queryData.readExcel(2, 1)), queryData.readExcel(3, 1)]
 24 
 25     # 會員檔案下拉菜單
 26     memberMenu = (By.LINK_TEXT, eleData.readExcel(24, 3))
 27 
 28     # 會員查詢頁面的3個清單(查詢條件,會員資訊明細,積分變化明細)
 29     uiElements = (By.XPATH, eleData.readExcel(25, 3))
 30     # 會員類型
 31     memberTypeBtn = (By.ID, eleData.readExcel(26, 3))
 32     # 會員類型下拉選項
 33     memberTypeNum = [(By.XPATH, eleData.readExcel(27, 3)), (By.XPATH, eleData.readExcel(28, 3)),
 34                      (By.XPATH, eleData.readExcel(29, 3))]
 35 
 36     # 會員級别
 37     memberLevelBtn = (By.ID, eleData.readExcel(30, 3))
 38     # 會員級别下拉選項
 39     memberLevelNum = [(By.XPATH, eleData.readExcel(31, 3)), (By.XPATH, eleData.readExcel(32, 3)),
 40                       (By.XPATH, eleData.readExcel(33, 3)), (By.XPATH, eleData.readExcel(34, 3))]
 41 
 42     # 會員編号,會員姓名,手機号碼
 43     memberNumNamePhone = [(By.ID, eleData.readExcel(35, 3)), (By.ID, eleData.readExcel(36, 3)),
 44                           (By.ID, eleData.readExcel(37, 3))]
 45     # 查詢異常提示框
 46     qFailerr = (By.XPATH, eleData.readExcel(38, 3))  # 查詢失敗彈出的錯誤提示框
 47 
 48     confirmBtn = (By.XPATH, eleData.readExcel(39, 3))
 49 
 50     # 查詢與重置
 51     queryResetBtn = [(By.ID, eleData.readExcel(40, 3)), (By.ID, eleData.readExcel(41, 3))]
 52 
 53     # 點選會員類型
 54     def selectMemberType(self):
 55         """
 56 
 57         :return:
 58         """
 59         try:
 60             self.findElement(*self.memberTypeBtn).click()
 61             self.driver.implicitly_wait(2)
 62         except Exception:
 63             log.logger.exception(\'selecting member type fail \')
 64             raise
 65         else:
 66             log.logger.info(\'---selecting member type \')
 67 
 68     # 點選會員級别
 69     def selectMemberLevel(self):
 70         """
 71 
 72         :return:
 73         """
 74         try:
 75             self.findElement(*self.memberLevelBtn).click()
 76             self.driver.implicitly_wait(2)
 77         except Exception:
 78             log.logger.exception(\'selecting member level fail \')
 79             raise
 80         else:
 81             log.logger.info(\'---selecting member level \')
 82 
 83     # 查找會員檔案查詢菜單
 84     def memberQueryMenu(self):
 85         """
 86 
 87         :return:
 88         """
 89         self.findElement(*self.menuList[1]).click()
 90         self.findElement(*self.memberMenu).click()
 91         time.sleep(4)
 92         log.logger.info(\'page [%s] :found the menu [%s] and [%s]\' % (
 93             sys._getframe().f_code.co_name, self.menuList[1], self.memberMenu))
 94 
 95     # 會員類型/會員級别下拉選項
 96     def memberTypeLevelOption(self, *xpathList):
 97         """
 98 
 99         :param xpath_list:
100         :return:
101         """
102         try:
103             member_type_level = self.findElement(*xpathList)
104             text = member_type_level.text
105         except Exception:
106             log.logger.exception(\'get element member type/level item text fail\', exc_info=True)
107             raise
108         else:
109             log.logger.info(\'get element [%s] member type/level item text [%s] fail\' % (xpathList, text))
110             return text, member_type_level
111 
112     # 點選查詢和重置按鈕
113     def cQueryResetBtn(self, *queryResetBtn):
114         """
115 
116         :param query_reset_btn:
117         :return:
118         """
119         try:
120             self.findElement(*queryResetBtn).click()
121         except Exception:
122             log.logger.exception(\'query/reset button not click\', exc_info=True)
123             raise
124         else:
125             log.logger.info(\'clicking query/reset button \')
126 
127     # 輸入查詢條件
128     def iQueryCondition(self, numNamePhone, value):
129         """
130 
131         :param numNamePhone:
132         :param value:
133         :return:
134         """
135         number_name_phone = self.findElement(*numNamePhone)
136         try:
137             number_name_phone.clear()
138             number_name_phone.send_keys(value)
139         except Exception:
140             log.logger.exception(\'input value error\', exc_info=True)
141             raise
142         else:
143             log.logger.info(\'[%s] is typing value [%s] \' % (numNamePhone, value))
144 
145     # 擷取條件輸入框的内容
146     def getInputboxValue(self, *memberNumNamePhone):
147         """
148 
149         :param memberNumNamePhone:
150         :return:
151         """
152         try:
153             get_member_number_name_phone_text = self.findElement(*memberNumNamePhone)
154             text = get_member_number_name_phone_text.get_attribute(\'value\')
155         except Exception:
156             log.logger.exception(\'get value of element fail\', exc_info=True)
157             raise
158         else:
159             log.logger.info(\'get value [%s] of element [%s] success\' % (memberNumNamePhone, text))
160             return text
161 
162     # 重置功能的重寫
163     def reset(self):
164         """
165 
166         :return:
167         """
168         try:
169             self.findElement(*self.memberNumNamePhone[0]).clear()
170             self.findElement(*self.memberNumNamePhone[1]).clear()
171             self.findElement(*self.memberNumNamePhone[2]).clear()
172         except Exception:
173             log.logger.exception(\'reset fail\', exc_info=True)
174             raise
175         else:
176             log.logger.info(\'reset [%s]-[%s]-[%s] success\' % (
177                 self.memberNumNamePhone[0], self.memberNumNamePhone[1], self.memberNumNamePhone[2]))
178 
179 
180 if __name__ == \'__main__\':
181     pass      

memberquery_page.py

# 會員檔案查詢用例

1 \'\'\'
  2 Code description:會員檔案查詢 testcase
  3 Create time:
  4 Developer:
  5 \'\'\'
  6 
  7 import random
  8 import time
  9 from selenium.webdriver.common.action_chains import ActionChains
 10 from retail.test_case.models.myunit import MyunitTest
 11 from retail.test_case.page_obj.memeberquery_page import MemberQuery
 12 
 13 class MemberQuery_TC(MyunitTest):
 14 
 15     """會員檔案查詢子產品測試用例"""
 16 
 17     #@unittest.skip(\'dont run the test case\')
 18     def test_member_check_ui(self):
 19         """會員檔案查詢頁面顯示正确"""
 20         menu = MemberQuery(self.driver) # 執行個體化會員查詢頁面
 21         self.login.loginFunc()
 22         menu.memberQueryMenu()  # 查找會員檔案查詢菜單
 23         elements = menu.findElements(*menu.uiElements)
 24         ele_list = []
 25         for eles in elements:
 26             if eles.text !=\'\':
 27                 ele_list.append(eles.text)
 28         self.assertEqual(\'查詢條件\', ele_list[0])
 29         self.assertEqual(\'會員資訊明細\', ele_list[1])
 30         self.assertEqual(\'積分變化明細\', ele_list[2])
 31 
 32 
 33     def test_member_type(self):
 34         """會員類型下拉清單項正确"""
 35         menu = MemberQuery(self.driver)  # 執行個體化會員查詢頁面
 36         self.login.loginFunc()# 登入
 37         menu.memberQueryMenu()  # 查找會員檔案查詢菜單
 38         menu.selectMemberType()
 39         list_type = []
 40         for member_type in menu.memberTypeNum:  # 循環周遊會員類型下拉清單
 41             text, memeber_type_level = menu.memberTypeLevelOption(*member_type)
 42             list_type.append(text)
 43         self.assertEqual(\'個人會員\', list_type[0])
 44         self.assertEqual(\'企業會員\', list_type[1])
 45         self.assertEqual(\'其它\', list_type[2])
 46 
 47     def test_member_level(self):
 48         """會員級别下拉清單項正确"""
 49         menu = MemberQuery(self.driver)  # 執行個體化會員查詢頁面
 50         self.login.loginFunc()  # 登入
 51         menu.memberQueryMenu() # 查找會員檔案查詢菜單
 52         menu.selectMemberLevel()
 53         list_level = []
 54         for member_level in menu.memberLevelNum: # 循環周遊會員級别下拉清單
 55             text, memeber_type_level = menu.memberTypeLevelOption(*member_level)
 56             list_level.append(text)
 57         self.assertEqual(\'标準會員\', list_level[0])
 58         self.assertEqual(\'黃金會員\', list_level[1])
 59         self.assertEqual(\'鉑金會員\', list_level[2])
 60         self.assertEqual(\'鑽石會員\', list_level[3])
 61 
 62     # ............................................................................................#
 63     # 對頁面的條件進行組合後單擊查詢按鈕。這是一個大資料量的操作,是以不對傳回資料做校驗,隻看本次組合的條件在頁面是否可正常使用。
 64     # 如果查詢失敗,系統會有彈出框提示失敗原因,這個應該很好了解的。
 65     # 我們抓取這個框是否在一定的時間内出現,如果出現則判定本次查詢失敗,記錄用例結果。
 66     # ............................................................................................#
 67 
 68     def test_member_query_failed(self):
 69         """預設條件查詢成功"""
 70         menu = MemberQuery(self.driver)  # 執行個體化會員檔案查詢頁面
 71         self.login.loginFunc()  # 登入
 72         menu.memberQueryMenu()  # 找到會員查詢頁面
 73         menu.cQueryResetBtn(*menu.queryResetBtn[0])  # 點選[查詢]
 74         flag = menu.isElementExist(menu.qFailerr)  # 斷言錯誤提示框
 75         self.assertFalse(flag, msg=\'查詢失敗\')  # flag為false時,斷言成功, 無提示框,說明預設查詢成功
 76 
 77     def test_alone_query_1(self):
 78         """按會員編号,會員姓名,手機号碼單一條件查詢"""
 79         menu = MemberQuery(self.driver)  # 執行個體化會員檔案查詢頁面
 80         self.login.loginFunc()  # 登入
 81         menu.memberQueryMenu()  # 找到會員檔案查詢頁面
 82         for num_name_phone in menu.memberNumNamePhone:
 83             menu.reset()  # 重置
 84             for value in menu.valuesList:
 85                 menu.iQueryCondition(num_name_phone,value)
 86                 menu.cQueryResetBtn(*menu.queryResetBtn[0]) # 點選[查詢]
 87                 time.sleep(3)
 88                 flag = menu.isElementExist(menu.qFailerr)
 89                 if flag:
 90                     self.assertTrue(flag, \'提示框不存在,查詢成功\')
 91                     menu.accept(*menu.confirmBtn)
 92                 else:
 93                     self.assertFalse(flag, \'提示框存在,查詢失敗\')
 94 
 95     def test_alone_query_2(self):
 96         """按會員類型單一查詢"""
 97         menu = MemberQuery(self.driver) # 執行個體化會員檔案查詢頁面
 98         self.login.loginFunc() # 登入
 99         menu.memberQueryMenu() # 找到會員檔案查詢頁面
100         for me_type in menu.memberTypeNum:
101             menu.selectMemberType() # 點選[會員類型]
102             text, member_type_level = menu.memberTypeLevelOption(*me_type) # 周遊每一個下拉選項
103             ActionChains(self.driver).move_to_element(member_type_level).perform() # 滑鼠移動到下拉選項上
104             member_type_level.click() # 選中下拉選項
105             menu.cQueryResetBtn(*menu.queryResetBtn[0])  # 點選[查詢]
106             time.sleep(3)
107             flag = menu.isElementExist(menu.qFailerr) # 判斷查詢成功
108             self.assertFalse(flag, \'提示框存在,查詢失敗\')
109 
110     def test_alone_query_3(self):
111         """按會員級别單一查詢"""
112         menu = MemberQuery(self.driver)  # 執行個體化會員檔案查詢頁面
113         self.login.loginFunc()  # 登入
114         menu.memberQueryMenu()  # 找到會員檔案查詢頁面
115         for me_level in menu.memberLevelNum:
116             menu.selectMemberLevel() # 點選[會員級别]
117             text, member_level = menu.memberTypeLevelOption(*me_level)  # 周遊每一個下拉選項
118             ActionChains(self.driver).move_to_element(member_level).perform()  # 滑鼠移動到下拉選項上
119             member_level.click()  # 選中下拉選項
120             menu.cQueryResetBtn(*menu.queryResetBtn[0])  # 點選[查詢]
121             time.sleep(3)
122             flag = menu.isElementExist(menu.qFailerr)  # 判斷查詢成功
123             self.assertFalse(flag, \'提示框存在,查詢成功\')
124 
125     def test_reset(self):
126         """重置功能校驗"""
127         menu = MemberQuery(self.driver) # 執行個體化會員檔案查詢頁面
128         self.login.loginFunc() # 登入
129         menu.memberQueryMenu() # 找到會員檔案查詢頁面
130         # 3個條件輸入框随機輸入資料
131         for inputBox in menu.memberNumNamePhone:
132             menu.iQueryCondition(inputBox,random.choice(menu.valuesList))
133         #會員類型下拉清單中随機選擇一項
134         menu.selectMemberType()
135         text_type, member_type = menu.memberTypeLevelOption(*(random.choice(menu.memberTypeNum)))
136         ActionChains(self.driver).move_to_element(member_type).perform()  # 滑鼠移動到下拉選項上
137         member_type.click()
138 
139         # menu.selectMemberLevel()
140         # text_level, member_level = menu.memberTypeLevelOption(*(random.choice(menu.member_level_num)))
141         # #ActionChains(self.driver).move_to_element(member_level).perform()
142         # member_level.click()
143 
144 
145         # 點選【重置】
146         menu.cQueryResetBtn(*menu.queryResetBtn[1])
147         # 擷取前3個輸入框的内容
148         text_list = []
149         for input_box in menu.memberNumNamePhone:
150             text = menu.getInputboxValue(*input_box)
151             text_list.append(text)
152         # 擷取會員類型
153         type_type_text = menu.getInputboxValue(*menu.memberTypeBtn)
154         text_list.append(type_type_text)
155 
156         # type_level_text = menu.getInputboxValue(*menu.member_level_btn)
157         # text_list.append(type_level_text)
158 
159         # 斷言每一個條件框是否為空 為空就通過
160         for get_attr in text_list:
161             self.assertEqual(\'\',get_attr)
162 
163 if __name__ == \'__main__\':
164     pass      

MemberQueryTc.py

# 執行測試用例

1 #! user/bin/python
 2 
 3 \'\'\'                                                           
 4 Code description:auto run test case
 5 Create time:
 6 Developer:
 7 \'\'\'
 8 
 9 import unittest
10 import time
11 from BeautifulReport import BeautifulReport
12 from retail.config.conf import *
13 from retail.test_case.models.testreport import testreport
14 
15 # TODO : will be use jenkins continuous intergration teachnology manage the auto project
16 if __name__ == \'__main__\':
17 
18     # currTime = time.strftime(\'%Y-%m-%d %H_%M_%S\')
19     # filename = currTime + \'.html\'
20     # # 第一種測試報告
21     # test_suite = unittest.defaultTestLoader.discover(tcPath, pattern=\'*Tc.py\')
22     # result = BeautifulReport(test_suite)
23     # result.report(filename= filename, description=\'test report\', log_path=reportPath)
24 
25     # # 第二種測試報告
26     runner, fp, fileName = testreport()
27     test_suite = unittest.defaultTestLoader.discover(tcPath, pattern=\'LoginTc.py\')
28     runner.run(test_suite)
29     fp.close()      

RunTc.py

from BeautifulReport import BeautifulReport 這個報告需要自己網上找一下(很多類似的測試報告源碼,不一定非使用本案例中的報告模闆)

報告展示

有付出才有彙報,接下來看下們的成果

1.截圖:

建立規則失敗時截圖

第二個python&amp;selenium自動化測試實戰項目

登入成功截圖

第二個python&amp;selenium自動化測試實戰項目

用例執行日志:

2018-10-12 15:39:17,916 - doconfIni.py:[36] - [INFO] - read excel value [D:\Petrochina_Retail_Test_Project] successed! 
2018-10-12 15:39:19,119 - testreport.py:[35] - [INFO] - successed to generate test report [D:\Petrochina_Retail_Test_Project\retail\report\TestReport\report2018-10-12 15_39_19.html]
2018-10-12 15:39:21,469 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:39:21,481 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:39:21,493 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:39:21,504 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:39:21,505 - doexcel.py:[46] - [INFO] - reading value [權限管理] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,538 - doexcel.py:[46] - [INFO] - reading value [會員檔案] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,538 - doexcel.py:[46] - [INFO] - reading value [積分消費查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,539 - doexcel.py:[46] - [INFO] - reading value [功能示範] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,539 - doexcel.py:[46] - [INFO] - reading value [待辦工作] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,539 - doexcel.py:[46] - [INFO] - reading value [報表] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,539 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,540 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動申請] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,540 - doexcel.py:[46] - [INFO] - reading value [username] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,540 - doexcel.py:[46] - [INFO] - reading value [password] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,541 - doexcel.py:[46] - [INFO] - reading value [loginSubmitButton] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,541 - doexcel.py:[46] - [INFO] - reading value [checkcookie] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,541 - doexcel.py:[46] - [INFO] - reading value [inputTdRight] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,541 - doexcel.py:[46] - [INFO] - reading value [logout] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,541 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [rmlv] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [rml] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,542 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,543 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,543 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,543 - doexcel.py:[46] - [INFO] - reading value [quert1234] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,543 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:21,543 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:39:41,168 - driver.py:[27] - [INFO] - fireFoxDriver:found the Firefox driver [<selenium.webdriver.firefox.webdriver.WebDriver (session="d446da40-ae28-4fff-bfd3-2c9045a5c4cc")>] successed !
2018-10-12 15:39:44,832 - myunit.py:[25] - [INFO] - opened the browser successed!
2018-10-12 15:39:45,541 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:39:45,541 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:39:45,542 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:39:45,594 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:39:45,719 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:39:47,798 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:39:47,866 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:39:49,923 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:39:51,173 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:39:53,227 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'logout\')
2018-10-12 15:39:53,624 - login_page.py:[95] - [INFO] - quit
2018-10-12 15:39:53,674 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:39:53,726 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 15:39:55,785 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:39:55,846 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:39:57,906 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:39:58,103 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:00,143 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:00,189 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:00,213 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:40:00,248 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:40:02,291 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:40:02,339 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:40:04,364 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:04,439 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:06,484 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:40:06,525 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:40:06,565 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 15:40:08,611 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:40:08,659 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@]
2018-10-12 15:40:10,708 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:10,878 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:12,958 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:12,982 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:13,006 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:40:13,048 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:40:15,116 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:40:15,148 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:40:17,200 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:17,248 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:19,313 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 15:40:19,351 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:40:19,392 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:40:21,445 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:40:21,506 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 15:40:23,555 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:23,718 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:25,810 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:25,847 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:25,872 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'username\')
2018-10-12 15:40:25,906 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:40:27,968 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'password\')
2018-10-12 15:40:28,009 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:40:30,044 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:30,079 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:32,140 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:40:32,140 - LoginTc.py:[108] - [INFO] - test_login->run completed! please check the test report
2018-10-12 15:40:32,599 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:32,838 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:32,838 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:32,838 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:32,881 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE7B8> had already find the element (\'id\', \'username\')
2018-10-12 15:40:32,923 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:40:32,947 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE7B8> had already find the element (\'id\', \'password\')
2018-10-12 15:40:32,990 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 15:40:33,012 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE7B8> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:33,204 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:33,238 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDE7B8> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:33,265 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:33,265 - LoginTc.py:[49] - [INFO] - test_login_failed_incorrect_password->run completed! please check the test report
2018-10-12 15:40:33,714 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:33,945 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:33,945 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:33,946 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:33,976 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEEF0> had already find the element (\'id\', \'username\')
2018-10-12 15:40:34,020 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 15:40:34,044 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEEF0> had already find the element (\'id\', \'password\')
2018-10-12 15:40:34,084 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:40:34,106 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEEF0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:34,270 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:34,307 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEEF0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:34,336 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:34,336 - LoginTc.py:[40] - [INFO] - test_login_failed_incorrect_username->run completed! please check the test report
2018-10-12 15:40:34,872 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:35,114 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:35,114 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:35,114 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:35,146 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE48> had already find the element (\'id\', \'username\')
2018-10-12 15:40:35,187 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:40:35,210 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE48> had already find the element (\'id\', \'password\')
2018-10-12 15:40:35,240 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:40:35,261 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE48> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:35,288 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:35,325 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 15:40:35,325 - LoginTc.py:[65] - [INFO] - test_login_failed_password_blank->run completed! please check the test report
2018-10-12 15:40:35,756 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:35,988 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:35,988 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:35,988 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:36,017 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEFD0> had already find the element (\'id\', \'username\')
2018-10-12 15:40:36,062 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 15:40:36,095 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEFD0> had already find the element (\'id\', \'password\')
2018-10-12 15:40:36,130 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [rmln]
2018-10-12 15:40:36,156 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEFD0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:36,336 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:36,370 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEFD0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:40:36,397 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:40:36,397 - LoginTc.py:[73] - [INFO] - test_login_failed_unpw_incorrect->run completed! please check the test report
2018-10-12 15:40:36,869 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:37,103 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:37,103 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:37,103 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:37,142 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19D9C6A0> had already find the element (\'id\', \'username\')
2018-10-12 15:40:37,180 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:40:37,211 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19D9C6A0> had already find the element (\'id\', \'password\')
2018-10-12 15:40:37,245 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:40:37,268 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19D9C6A0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:37,297 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:37,328 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:40:37,328 - LoginTc.py:[57] - [INFO] - test_login_failed_username_password_blank->run completed! please check the test report
2018-10-12 15:40:37,789 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:38,034 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:40:38,035 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:40:38,035 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:40:38,070 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE10> had already find the element (\'id\', \'username\')
2018-10-12 15:40:38,113 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:40:38,135 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE10> had already find the element (\'id\', \'password\')
2018-10-12 15:40:38,170 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:40:38,192 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000022A19CDEE10> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:40:38,718 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:40:38,867 - base_page.py:[219] - [INFO] - the file [correct_username_password_pass.png]  save screenshot successed under [D:\Petrochina_Retail_Test_Project\retail\report\image\pass]
2018-10-12 15:40:38,867 - LoginTc.py:[32] - [INFO] - test_login_success_correct_username_password->run completed! please check the test report
2018-10-12 15:40:39,853 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:40:40,741 - myunit.py:[49] - [INFO] - quit the browser success!
2018-10-12 15:55:32,579 - doconfIni.py:[36] - [INFO] - read excel value [D:\Petrochina_Retail_Test_Project] successed! 
2018-10-12 15:55:32,650 - testreport.py:[35] - [INFO] - successed to generate test report [D:\Petrochina_Retail_Test_Project\retail\report\TestReport\report2018-10-12 15_55_32.html]
2018-10-12 15:55:32,799 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:55:32,809 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:55:32,823 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:55:32,834 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [權限管理] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [會員檔案] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [積分消費查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [功能示範] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [待辦工作] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [報表] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,834 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動申請] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [username] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [password] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [loginSubmitButton] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [checkcookie] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [inputTdRight] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [logout] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [rmlv] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,835 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [rml] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [quert1234] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:32,836 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:55:42,284 - driver.py:[27] - [INFO] - fireFoxDriver:found the Firefox driver [<selenium.webdriver.firefox.webdriver.WebDriver (session="a6069969-6dab-45c0-a732-2c2f0efa4ca1")>] successed !
2018-10-12 15:55:45,801 - myunit.py:[25] - [INFO] - opened the browser successed!
2018-10-12 15:55:46,436 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:55:46,436 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:55:46,436 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:55:46,502 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:55:46,553 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:55:48,591 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:55:48,648 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:55:50,720 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:55:51,787 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:55:53,851 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'logout\')
2018-10-12 15:55:54,136 - login_page.py:[95] - [INFO] - quit
2018-10-12 15:55:54,192 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:55:54,239 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 15:55:56,295 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:55:56,363 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:55:58,426 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:55:58,615 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:00,651 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:00,681 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:00,708 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:56:00,741 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:56:02,778 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:56:02,842 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:56:04,873 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:04,926 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:06,966 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:56:07,003 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:56:07,054 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 15:56:09,122 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:56:09,182 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@]
2018-10-12 15:56:11,205 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:11,384 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:13,439 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:13,478 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:13,504 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:56:13,547 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:56:15,585 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:56:15,639 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:56:17,688 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:17,733 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:19,775 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 15:56:19,814 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:56:19,866 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:56:21,912 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:56:21,967 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 15:56:24,019 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:24,229 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:26,258 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:26,286 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:26,309 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'username\')
2018-10-12 15:56:26,346 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:56:28,384 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'password\')
2018-10-12 15:56:28,430 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:56:30,464 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:30,503 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:32,562 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:56:32,563 - LoginTc.py:[108] - [INFO] - test_login->run completed! please check the test report
2018-10-12 15:56:33,042 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:33,298 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:33,299 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:33,299 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:33,339 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D7B8> had already find the element (\'id\', \'username\')
2018-10-12 15:56:33,381 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:56:33,405 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D7B8> had already find the element (\'id\', \'password\')
2018-10-12 15:56:33,448 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 15:56:33,472 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D7B8> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:33,666 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:33,715 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4D7B8> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:33,745 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:33,745 - LoginTc.py:[49] - [INFO] - test_login_failed_incorrect_password->run completed! please check the test report
2018-10-12 15:56:34,212 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:34,461 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:34,461 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:34,461 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:34,505 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DEF0> had already find the element (\'id\', \'username\')
2018-10-12 15:56:34,545 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 15:56:34,572 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DEF0> had already find the element (\'id\', \'password\')
2018-10-12 15:56:34,618 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:56:34,644 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DEF0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:34,826 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:34,873 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DEF0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:34,897 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:34,897 - LoginTc.py:[40] - [INFO] - test_login_failed_incorrect_username->run completed! please check the test report
2018-10-12 15:56:35,372 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:35,708 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:35,709 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:35,709 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:35,757 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE48> had already find the element (\'id\', \'username\')
2018-10-12 15:56:35,818 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:56:35,850 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE48> had already find the element (\'id\', \'password\')
2018-10-12 15:56:35,895 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:56:35,928 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE48> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:35,995 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:36,034 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 15:56:36,034 - LoginTc.py:[65] - [INFO] - test_login_failed_password_blank->run completed! please check the test report
2018-10-12 15:56:36,566 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:36,817 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:36,818 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:36,818 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:36,878 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DFD0> had already find the element (\'id\', \'username\')
2018-10-12 15:56:36,920 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 15:56:36,943 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DFD0> had already find the element (\'id\', \'password\')
2018-10-12 15:56:36,980 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [rmln]
2018-10-12 15:56:37,014 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DFD0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:37,212 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:37,266 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DFD0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 15:56:37,293 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 15:56:37,293 - LoginTc.py:[73] - [INFO] - test_login_failed_unpw_incorrect->run completed! please check the test report
2018-10-12 15:56:37,761 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:38,069 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:38,070 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:38,070 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:38,106 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633D0D6A0> had already find the element (\'id\', \'username\')
2018-10-12 15:56:38,154 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 15:56:38,179 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633D0D6A0> had already find the element (\'id\', \'password\')
2018-10-12 15:56:38,217 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 15:56:38,245 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633D0D6A0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:38,299 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:38,332 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 15:56:38,332 - LoginTc.py:[57] - [INFO] - test_login_failed_username_password_blank->run completed! please check the test report
2018-10-12 15:56:38,856 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:39,117 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 15:56:39,117 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 15:56:39,117 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 15:56:39,161 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE10> had already find the element (\'id\', \'username\')
2018-10-12 15:56:39,208 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 15:56:39,231 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE10> had already find the element (\'id\', \'password\')
2018-10-12 15:56:39,283 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 15:56:39,308 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x000001A633C4DE10> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 15:56:40,038 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 15:56:40,125 - base_page.py:[219] - [INFO] - the file [correct_username_password_pass.png]  save screenshot successed under [D:\Petrochina_Retail_Test_Project\retail\report\image\pass]
2018-10-12 15:56:40,126 - LoginTc.py:[32] - [INFO] - test_login_success_correct_username_password->run completed! please check the test report
2018-10-12 15:56:41,187 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 15:56:42,002 - myunit.py:[49] - [INFO] - quit the browser success!
2018-10-12 15:59:49,135 - doconfIni.py:[36] - [INFO] - read excel value [D:\Petrochina_Retail_Test_Project] successed! 
2018-10-12 15:59:49,202 - testreport.py:[35] - [INFO] - successed to generate test report [D:\Petrochina_Retail_Test_Project\retail\report\TestReport\report2018-10-12 15_59_49.html]
2018-10-12 15:59:49,356 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:59:49,366 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:59:49,379 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:59:49,389 - doexcel.py:[31] - [INFO] - initing class ReadExcel
2018-10-12 15:59:49,389 - doexcel.py:[46] - [INFO] - reading value [權限管理] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,389 - doexcel.py:[46] - [INFO] - reading value [會員檔案] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [積分消費查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [功能示範] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [待辦工作] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [報表] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動查詢] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [積分規則/活動申請] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,390 - doexcel.py:[46] - [INFO] - reading value [username] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [password] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [loginSubmitButton] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [checkcookie] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [inputTdRight] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [logout] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [rmlv] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,391 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@#] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [rml] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [qwert1234!@] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [rmln] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [quert1234] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 15:59:49,392 - doexcel.py:[46] - [INFO] - reading value [] from excel file [D:\Petrochina_Retail_Test_Project\retail\data\TestData\elementDate.xlsx] completed
2018-10-12 16:00:00,276 - driver.py:[27] - [INFO] - fireFoxDriver:found the Firefox driver [<selenium.webdriver.firefox.webdriver.WebDriver (session="0a7f2418-d24d-45c5-893d-5914d64ee0d1")>] successed !
2018-10-12 16:00:03,791 - myunit.py:[25] - [INFO] - opened the browser successed!
2018-10-12 16:00:04,323 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:04,323 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:04,323 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:04,368 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:04,426 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:06,504 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:06,570 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 16:00:08,623 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:09,623 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:11,706 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'logout\')
2018-10-12 16:00:11,943 - login_page.py:[95] - [INFO] - quit
2018-10-12 16:00:12,002 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:12,049 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 16:00:14,080 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:14,136 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 16:00:16,191 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:16,407 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:18,466 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:18,517 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:18,549 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:18,587 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 16:00:20,658 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:20,736 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 16:00:22,797 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:22,847 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:24,885 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 16:00:24,918 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:24,972 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 16:00:27,029 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:27,107 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@]
2018-10-12 16:00:29,135 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:29,302 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:31,367 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:31,395 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:31,420 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:31,466 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:33,497 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:33,534 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 16:00:35,585 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:35,640 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:37,692 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 16:00:37,727 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:37,794 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:39,827 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:39,887 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 16:00:41,983 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:42,178 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:44,234 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:44,277 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:44,311 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'username\')
2018-10-12 16:00:44,350 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 16:00:46,397 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'password\')
2018-10-12 16:00:46,440 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 16:00:48,476 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D828> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:48,512 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:50,555 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 16:00:50,555 - LoginTc.py:[108] - [INFO] - test_login->run completed! please check the test report
2018-10-12 16:00:51,044 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:51,319 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:51,319 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:51,319 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:51,362 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D7B8> had already find the element (\'id\', \'username\')
2018-10-12 16:00:51,407 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:51,430 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D7B8> had already find the element (\'id\', \'password\')
2018-10-12 16:00:51,477 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [quert1234]
2018-10-12 16:00:51,500 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D7B8> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:51,693 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:51,742 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06D7B8> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:51,773 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:51,773 - LoginTc.py:[49] - [INFO] - test_login_failed_incorrect_password->run completed! please check the test report
2018-10-12 16:00:52,193 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:52,405 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:52,406 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:52,406 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:52,444 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DEF0> had already find the element (\'id\', \'username\')
2018-10-12 16:00:52,487 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmlv]
2018-10-12 16:00:52,512 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DEF0> had already find the element (\'id\', \'password\')
2018-10-12 16:00:52,566 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 16:00:52,594 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DEF0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:52,816 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:52,863 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DEF0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:52,891 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:52,892 - LoginTc.py:[40] - [INFO] - test_login_failed_incorrect_username->run completed! please check the test report
2018-10-12 16:00:53,344 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:53,579 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:53,580 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:53,580 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:53,620 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE48> had already find the element (\'id\', \'username\')
2018-10-12 16:00:53,663 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:53,690 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE48> had already find the element (\'id\', \'password\')
2018-10-12 16:00:53,728 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 16:00:53,757 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE48> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:53,811 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:53,849 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者密碼!
2018-10-12 16:00:53,849 - LoginTc.py:[65] - [INFO] - test_login_failed_password_blank->run completed! please check the test report
2018-10-12 16:00:54,283 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:54,590 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:54,590 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:54,590 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:54,637 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DFD0> had already find the element (\'id\', \'username\')
2018-10-12 16:00:54,678 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rml]
2018-10-12 16:00:54,704 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DFD0> had already find the element (\'id\', \'password\')
2018-10-12 16:00:54,748 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [rmln]
2018-10-12 16:00:54,777 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DFD0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:54,994 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:55,047 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DFD0> had already find the element (\'id\', \'inputTdRight\')
2018-10-12 16:00:55,077 - login_page.py:[53] - [INFO] - login failed : 輸入的使用者名或密碼錯誤,請重新輸入!
2018-10-12 16:00:55,077 - LoginTc.py:[73] - [INFO] - test_login_failed_unpw_incorrect->run completed! please check the test report
2018-10-12 16:00:55,512 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:55,760 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:55,760 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:55,760 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:55,806 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C12D6A0> had already find the element (\'id\', \'username\')
2018-10-12 16:00:55,852 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value []
2018-10-12 16:00:55,879 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C12D6A0> had already find the element (\'id\', \'password\')
2018-10-12 16:00:55,915 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value []
2018-10-12 16:00:55,942 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C12D6A0> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:55,973 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:56,007 - login_page.py:[70] - [INFO] - login failed ,handleAlert handle alert successed alert info: 請填寫使用者名!
2018-10-12 16:00:56,007 - LoginTc.py:[57] - [INFO] - test_login_failed_username_password_blank->run completed! please check the test report
2018-10-12 16:00:56,485 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:56,699 - base_page.py:[56] - [INFO] - _open is accessing address http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp at line[46]
2018-10-12 16:00:56,699 - base_page.py:[65] - [INFO] - http://11.11.164.134:9081/rmms/modules/ep.rmms.portal/login/login.jsp loading successed!
2018-10-12 16:00:56,700 - myunit.py:[35] - [INFO] - ************************starting run test cases************************
2018-10-12 16:00:56,739 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE10> had already find the element (\'id\', \'username\')
2018-10-12 16:00:56,784 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'username\')] is receiveing value [rmln]
2018-10-12 16:00:56,809 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE10> had already find the element (\'id\', \'password\')
2018-10-12 16:00:56,861 - base_page.py:[118] - [INFO] - inputValue:[(\'id\', \'password\')] is receiveing value [qwert1234!@#]
2018-10-12 16:00:56,903 - base_page.py:[83] - [INFO] - The page of <retail.test_case.page_obj.login_page.LoginPage object at 0x0000015F8C06DE10> had already find the element (\'id\', \'loginSubmitButton\')
2018-10-12 16:00:57,456 - login_page.py:[45] - [INFO] - clickLoginBtn ,logining....!
2018-10-12 16:00:57,583 - base_page.py:[219] - [INFO] - the file [correct_username_password_pass.png]  save screenshot successed under [D:\Petrochina_Retail_Test_Project\retail\report\image\pass]
2018-10-12 16:00:57,583 - LoginTc.py:[32] - [INFO] - test_login_success_correct_username_password->run completed! please check the test report
2018-10-12 16:00:58,538 - myunit.py:[43] - [INFO] - ************************test case run completed************************
2018-10-12 16:00:59,037 - myunit.py:[49] - [INFO] - quit the browser success!      

日志

測試報告:

第二個python&amp;selenium自動化測試實戰項目

總結

看到結果還是挺有成就感的,郵件的截圖我沒發,因為我是内網不知道什麼原因郵件伺服器連接配接不上,但是使用外網單獨測試郵件發送是沒什麼問題的!

就寫這麼多吧,其他頁面的用例設計思路都是一樣的,因為所有的用例彼此都是獨立的,是以多與少都不影響! 要源碼的同學可以通路我的github自己下載下傳吧!

部落格寫的不是很好,有的東西不知道怎麼講,希望大家能夠看到懂,當然,不懂的或者像學自動化的有問題的 都可以聯系我QQ 281754043  添加時注明:部落格園

第二個python&amp;selenium自動化測試實戰項目