自動化測試框架的搭建
1、自動化測試框架
(1)概述:
自動化測試框架是應用於自動化測試的程序框架。它提供了可重用的自動化測試模塊,提供最基礎的自動化測試功能(如:打開瀏覽器、單擊鏈接等功能),或提供自動化測試執行和管理功能的架構模塊(如TestNG)。它是由一個或多個自動化測試基礎模塊、自動化測試管理模塊、自動化測試統計模塊等組成的工具集合。
(2)常見模式
>數據驅動測試框架:使用數據數組、測試數據文件或者數據庫等方式作為測試過程輸入的自動化測試框架
>關鍵字驅動測試框架:使用被操作的元素對象、操作的方法和操作的數據值作為測試過程輸入的自動化測試框架
>混合型測試框架:在關鍵字驅動測試框架中加入了數據驅動
>行為驅動測試框架:支持自然語言作為測試用例描述的自動化測試框架
(3)作用:
>能夠有效組織和管理測試腳本
>進行數據驅動或關鍵字驅動的測試
>將基礎的測試代碼進行封裝,降低測試腳本編寫的復雜性和重復性
>提高測試腳本維護和修改的效率
>自動執行測試腳本,並自動發布測試報告,為持續集成的開發方式提供腳本支持
>讓不具備編程能力的測試工程師開展自動化測試工作
(4)自動化測試框架的設計核心思想
將常用的腳本代碼或者測試邏輯進行抽象和總結,然后將這些代碼進行面向對象設計,將需要重復的代碼封裝到可公用的類方法中。通過調用公用的類立法,測試類中的腳本復雜度會被大大降低,讓更多腳本能力不強的測試人員來實施自動化測試。
創建和實施Web自動化測試框架的步驟如下:
1)根據測試業務的手工測試用例,選出需要可自動化執行的測試用例
2)根據可自動化執行的測試用例,分析出測試框架需要模擬的手工操作和重復高的測試流程或邏輯
3)將手工操作和重復高的測試邏輯在代碼中實現,並在類中進行封裝方法的編寫
4)根據測試業務的類型和本身技術能力,選擇數據驅動框架、關鍵字驅動框架、混合型框架還是行為驅動框架
5)確定框架模型后,將框架中常用的瀏覽器選擇、測試數據處理、文件操作、數據庫操作、頁面元素的原始操作、日志和報告等功能進行類方法的封裝實現
6)對框架代碼進行集成測試和系統測試,采用PageObject模式和TestNG框架(或JUnit)編寫測試腳本,使用框架進行自動化測試,驗證框架的功能可以滿足自動化測試的需求
7)編寫自動化測試框架的常用 Api文檔,以供他人參閱
8)在測試組內部進行培訓和推廣
9)不斷收集測試過程中的框架使用問題和反饋意見,不斷增加和優化自動化框架的功能,不斷增強框架中復雜操作的封裝效果,盡量降低測試腳本的編寫復雜性。
10)定期評估測試框架的使用效果,評估自動化測試的投入產出比,再逐推廣自動化框架的應用范圍
2、數據驅動框架及實踐
(1)框架大體包含目錄:
新建一個工程,下面包含以下部分
1)Util包:封裝常用的函數和功能(復用的)
Excel、時間、取元素、寫日志、mapobject程序、解析ini文件,可選(截屏、建目錄、文件操作、數據庫操作等)
2)工程變量包
存放所有通用的變量或配置相關的變量
3)PageObject 包:一個頁面一個類,里面有很多方法,方法是用於獲取頁面中的一個元素
如:login類 get_frame get_username get_password 等 返回頁面元素對象
4)conf配置目錄:存放所有的配置文件(日志的配置文件、定位元素的配置文件)
5)Action包:
login函數:所有登錄的腳本邏輯
addContact : 添加聯系人為腳本邏輯
6)可選的(截屏目錄)
出錯的截屏
(2)框架搭建步驟:
1)在PyCharm中新建一個工程:my_datadriven_frame
2)在工程my_datadriven_frame下新建一個包:Util
a、在Util下新增一個模塊,即python模塊:Excel.py 內容如下:
#encoding=utf-8 from openpyxl import * from openpyxl.styles import Font from FormatTime import data_time_chinese class ParseExcel(object): def __init__(self,excel_file_path): self.excel_file_path=excel_file_path self.workbook=load_workbook(excel_file_path) self.font=Font(color=None) self.colorDict={"red":'FFFF3030',"green":'FF008B00'} self.sheet=self.get_sheet_by_index(0) # 通過序號設置當前要操作的sheet,使用index來獲取相應的sheet def set_sheet_by_index(self,sheet_index): self.sheet = self.get_sheet_by_index(sheet_index) # 通過名字設置操作的sheet def set_sheet_by_name(self,sheet_name): self.sheet = self.workbook.get_sheet_by_name(sheet_name) # 獲取當前操作的sheet和title名字 def get_default_name(self): return self.sheet.title # 通過名字獲取要操作的sheet def get_sheet_by_name(self,sheet_name): self.sheet = self.workbook.get_sheet_by_name(sheet_name) return self.sheet # 通過序號獲取要操作的sheet def get_sheet_by_index(self, sheet_index): sheet_name = self.workbook.get_sheet_names()[sheet_index] self.sheet = self.get_sheet_by_name(sheet_name) return self.sheet #獲取sheet中的最大行號,從0開始 def get_max_row_no(self): return self.sheet.max_row # 獲取sheet中的最大列號,從0開始 def get_max_col_no(self): return self.sheet.max_column #獲取默認sheet中的最小行號 def get_min_row_no(self): return self.sheet.min_row # 獲取默認sheet中的最小列號 def get_min_col_no(self): return self.sheet.min_column #獲取正在操作的sheet中的所有行對象 def get_all_rows(self): # rows = [] # for row in self.sheet.iter_rows(): # rows.append(row) # return rows #也可用以上方法 return list(self.sheet.iter_rows()) #獲取正在操作的sheet中的所有列對象 def get_all_cols(self): # cols = [] # for col in self.sheet.iter_cols(): # cols.append(col) # return cols #也可用以上方法 return list(self.sheet.iter_cols()) #獲取某一個行對象,第一行從0開始 def get_single_row(self,row_no): return self.get_all_rows()[row_no] # 獲取某一個列對象,第一列從0開始 def get_single_col(self, col_no): return self.get_all_cols()[col_no] #獲取某一個單元格對象,行號和列號從1開始 def get_cell(self,row_no,col_no): return self.sheet.cell(row = row_no,column = col_no) # 獲取某一個單元格內容 def get_cell_content(self, row_no, col_no): return self.sheet.cell(row = row_no,column = col_no).value # 給某一個單元格寫入指定內容,行號和列號從1開始 #調用此方法時,excel不要處於打開狀態 def write_cell_content(self, row_no, col_no,content,font=None): self.sheet.cell(row=row_no,column=col_no).value = content self.workbook.save(self.excel_file_path) #給某個單元格寫入當前時間,行號和列號從1開始 #調用此方法時,excel不要處於打開狀態 def write_cell_current_time(self,row_no,col_no): self.sheet.cell(row=row_no,column=col_no).value = data_time_chinese() self.workbook.save(self.excel_file_path) def save_excel_file(self): self.workbook.save(self.excel_file_path) #保存所有對單元格的修改 if __name__ == "__main__": #測試所有的方法 pe = ParseExcel("D:\\test\\test.xlsx") pe.set_sheet_by_index(0) print pe.get_default_name() pe.set_sheet_by_name("2") print pe.get_default_name() print pe.get_sheet_by_name("2") print pe.get_sheet_by_index(0) print "max rows:",pe.get_max_row_no() print "min row",pe.get_min_row_no() print pe.get_all_rows() #獲取所有行對象 print pe.get_all_rows()[2] #獲取某一行 print pe.get_all_rows()[0][2] #獲取某一個單元格 print pe.get_all_rows()[2][1].value #獲取某一單元格的值 print "max cols:",pe.get_max_col_no() print "min col",pe.get_min_col_no() print pe.get_all_cols() #獲取所有行對象 print pe.get_all_cols()[2] #獲取某一行 print pe.get_all_cols()[0][2] #獲取某一個單元格 print pe.get_all_cols()[2][1].value #獲取某一單元格的值 print len(pe.get_all_rows()) for cell in pe.get_all_rows()[1]: print cell.value print len(pe.get_all_cols()) for cell in pe.get_all_cols()[2]: print cell.value print "================================" for cell in pe.get_single_col(0): print cell.value for cell in pe.get_single_row(0): print cell.value print "--------------------" print pe.get_cell(1,2) print pe.get_cell_content(1,1) pe.write_cell_content(5,6,"hello") print pe.get_cell_content(5,6) pe.write_cell_current_time(7,7) print pe.get_cell_content(7,7)
b、封裝時間模塊,FormatTime.py,內容如下:
#encoding=utf-8 import time #返回中文的年月日時分秒 def data_time_chinese(): return time.strftime("%Y年%m月%d日 %H時%M分%S秒",time.localtime()) #返回中文的時分秒 def time_chinese(): return time.strftime("%H時%M分%S秒", time.localtime()) # 返回英文的年月日時分秒 def data_time_english(): return time.strftime("%Y-%m-%d %H:%M:%S秒", time.localtime()) # 返回英文的時分秒 def time_english(): return time.strftime("%H:%M:%S秒", time.localtime()) if __name__ == "__main__": print data_time_chinese() print time_chinese() print data_time_english() print time_english()
c、封裝日志模塊,Log.py,內容如下:
#encoding=utf-8 import logging import logging.config from ProjectVar.var import * #讀取日志的配置文件 logging.config.fileConfig(log_config_file_path) #選擇一個日志格式 logger = logging.getLogger("example02") def info(message): #打印info級別的信息 logging.info(message) def error(message): #打印error級別的信息 logging.error(message) def warning(message): #打印warning級別的信息 logging.warning(message) if __name__ == "__main__": error("---ERROR---") info("===Test===") warning("````Wang`````")
d、封裝獲取頁面元素模塊,ObjectMap.py,內容如下:
#encoding=utf-8 from selenium.webdriver.support.ui import WebDriverWait import time #獲取單個頁面元素對象 def getElement(driver,locateType,locateExpression): try: element = WebDriverWait(driver,5).until(lambda x: x.find_element(by = locateType,value = locateExpression)) return element except Exception,e: raise e #獲取多個相同頁面元素對象,以list返回 def getElements(driver,locateType,locateExpression): try: element = WebDriverWait(driver,5).until(lambda x: x.find_elements(by = locateType,value = locateExpression)) return element except Exception,e: raise e if __name__ == "__main__": from selenium import webdriver #進行單元測試 driver = webdriver.Firefox(executable_path = "D:\\geckodriver") driver.maximize_window() driver.get("https://mail.126.com/") time.sleep(2) lb = getElement(driver,"id","lbNormal") print lb driver.quit()
e、封裝解析配置文件的模塊,ParsePageObjectRepository.py,內容如下:
#encoding=utf-8 from ConfigParser import ConfigParser from ProjectVar.var import page_object_repository_path class ParsePageObjectRepositoryConfig(object): def __init__(self): self.cf = ConfigParser() self.cf.read(page_object_repository_path) #獲取某個section,所有的key和value,用字典方式返回 def getItemsFromSection(self,sectionName): print self.cf.items(sectionName) return dict(self.cf.items(sectionName)) #獲取某一個具體的選項對應的value def getOptionValue(self,sectionName,optionName): return self.cf.get(sectionName,optionName)
3)新建一個包,ProjectVar
在ProjectVar下新增一個模塊,var.py,內容如下:
#encoding=utf-8 import os #獲取工程所在目錄的絕對路徑 project_path = os.path.dirname(os.path.dirname(__file__)) #日志配置文件的絕對路徑 log_config_file_path = project_path + "/Conf/logger.conf" #測試數據excel文件的絕對路徑 test_data_excel_path = project_path.decode("utf-8") + u"/TestData/126郵箱聯系人.xlsx" # page_object_repository_path = project_path.decode("utf-8") + "/Conf/PageProjectRepository.ini" username_col_no=1 password_col_no=2 is_executed_col_no=4 test_result_col_no=6 exception_info_col_no=7 assert_keyword_col_no = 6 firefox_driver_path= 'D:\\geckodriver' if __name__ == "__main__": print os.path.dirname(__file__) print os.path.dirname(os.path.dirname(__file__)) print os.path.dirname(project_path+"/Conf/logger.conf") #路徑斜杠向左向右都可以 print log_config_file_path print test_data_excel_path
4)新建一個目錄 Conf
在Conf下新建一個log配置文件, logger.conf內容如下:
#logger.conf ############################################### [loggers] keys=root,example01,example02 [logger_root] level=DEBUG handlers=hand01,hand02 [logger_example01] handlers=hand01,hand02 qualname=example01 propagate=0 [logger_example02] handlers=hand01,hand03 qualname=example02 propagate=0 ############################################### [handlers] keys=hand01,hand02,hand03 [handler_hand01] class=StreamHandler level=INFO formatter=form01 args=(sys.stderr,) [handler_hand02] class=FileHandler level=DEBUG formatter=form01 args=('DataDrivenFrameWork.log', 'a') [handler_hand03] class=handlers.RotatingFileHandler level=INFO formatter=form01 args=('DataDrivenFrameWork.log', 'a', 10*1024*1024, 5) ############################################### [formatters] keys=form01,form02 [formatter_form01] format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s datefmt=%Y-%m-%d %H:%M:%S [formatter_form02] format=%(name)-12s: %(levelname)-8s %(message)s datefmt=%Y-%m-%d %H:%M:%S
在Conf目錄下新建一個PageProjectRepository配置文件,PageProjectRepository.ini內容如下:
[126mail_login] login_page.lbnormalbutton=id>lbNormal login_page.frame=xpath>//iframe[contains(@id,"x-URS-iframe")] login_page.username=xpath>//input[@name='email'] login_page.password=xpath>//input[@name='password'] login_page.loginbutton=id>dologin [126mail_homepage] home_page.addressbook=xpath>//div[text()='通訊錄'] [126mail_addcontactspage] addcontacts_page.createcontactsbtn=xpath>//span[text()='新建聯系人'] addcontacts_page.contactpersonname=xpath>//a[@title='編輯詳細姓名']/preceding-sibling::div/input addcontacts_page.contactpersonemail=xpath>//*[@id='iaddress_MAIL_wrap']//input addcontacts_page.starcontacts=xpath>//span[text()='設為星標聯系人']/preceding-sibling::span/b addcontacts_page.contactpersonmobile=xpath>//*[@id='iaddress_TEL_wrap']//dd//input addcontacts_page.contactpersoncomment=xpath>//textarea addcontacts_page.savecontaceperson=xpath>//span[.='確 定']
5)新建一個目錄TestData,存放測試數據: 126郵箱聯系人.xlsx
sheet1數據:
序號 用戶名 密碼 數據表 是否執行 測試結果
1 xxx xxx 聯系人 y
2 xxx xxx 聯系人 y
sheet2數據(聯系人):
序號 聯系人姓名 聯系人郵箱 是否設為星標聯系人 聯系人手機號 聯系人備注信息 驗證頁面包含的關鍵字 是否執行 執行時間 測試結果
1 lily lily@qq.com 是 13512319865 lily lily@qq.com y
2 張三 zhangsan@qq.com 否 15812316893 忽略 zhangsan@qq.com n
3 amy am y@qq.com 是 13901902408 lily amy n
4 李四 lisi@qq.com 否 15796356569 lily 李四 y
6)新建一個包,PageProject(一個頁面一個類,里面有很多方法,方法是用於獲取頁面中的一個元素)
新建login_page(登錄頁面)模塊,login_page.py,內容如下:
#ecoding=utf-8 import time from Util.ObjectMap import * from Util.ParsePageObjectRepository import ParsePageObjectRepositoryConfig class LoginPage(object): def __init__(self,driver): self.driver = driver self.parse_config_file = ParsePageObjectRepositoryConfig() self.login_page_items = self.parse_config_file.getItemsFromSection("126mail_login") print self.login_page_items #獲取元素 def lbnormalbutton(self): locateType, locateExpression = self.login_page_items['login_page.lbnormalbutton'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def frame(self): locateType, locateExpression = self.login_page_items['login_page.frame'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def username(self): locateType, locateExpression = self.login_page_items['login_page.username'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def password(self): locateType, locateExpression = self.login_page_items['login_page.password'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def loginbutton(self): locateType, locateExpression = self.login_page_items['login_page.loginbutton'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) #操作元素 def lbnormalbutton_click(self): self.lbnormalbutton().click() def switch_to_frame(self): self.driver.switch_to.frame(self.frame()) def input_username(self,username): self.username().send_keys(username) def input_password(self,password): self.password().send_keys(password) def loginbutton_click(self): self.loginbutton().click() if __name__ == "__main__": from selenium import webdriver driver = webdriver.Firefox(executable_path = "D:\\geckodriver") driver.maximize_window() driver.get("https://mail.126.com") lp = LoginPage(driver) # lp.lbnormalbutton().click() lp.lbnormalbutton_click() time.sleep(1) # driver.switch_to.frame(lp.frame()) lp.switch_to_frame() time.sleep(3) # lp.username().send_keys("xxx") lp.input_username("xxx") # lp.password().send_keys("xxx") lp.input_password("xxx") lp.loginbutton_click() time.sleep(5) driver.quit()
新建home_page(郵箱首頁)模塊,home_page.py,內容如下:
#encoding=utf-8 import time from Util.ObjectMap import * from Util.ParsePageObjectRepository import ParsePageObjectRepositoryConfig from Action.login import * class HomePage(object): def __init__(self,driver): self.driver = driver self.parse_config_file = ParsePageObjectRepositoryConfig() self.home_page_items = self.parse_config_file.getItemsFromSection("126mail_homepage") print self.home_page_items def address_book_page_link(self): locateType, locateExpression = self.home_page_items['home_page.addressbook'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) if __name__ == "__main__": from selenium import webdriver driver = webdriver.Firefox(executable_path = "D:\\geckodriver") driver.maximize_window() login(driver,"xxx","xxx") hp = HomePage(driver) hp.address_book_page_link().click() time.sleep(5) driver.quit()
新建addressBook(通訊錄)模塊,addressBook.py,內容如下:
#encoding=utf-8 import time from Util.ObjectMap import * from Util.ParsePageObjectRepository import ParsePageObjectRepositoryConfig from Action.login import * from Action.visit_address_page import * class AddressPage(object): def __init__(self,driver): self.driver = driver self.parse_config_file = ParsePageObjectRepositoryConfig() self.address_page_items = self.parse_config_file.getItemsFromSection("126mail_addcontactspage") print self.address_page_items def add_contact_button(self): locateType, locateExpression = self.address_page_items['addcontacts_page.createcontactsbtn'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_name(self): locateType, locateExpression = self.address_page_items['addcontacts_page.contactpersonname'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_email(self): locateType, locateExpression = self.address_page_items['addcontacts_page.contactpersonemail'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_is_star(self): locateType, locateExpression = self.address_page_items['addcontacts_page.starcontacts'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_mobile(self): locateType, locateExpression = self.address_page_items['addcontacts_page.contactpersonmobile'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_other_info(self): locateType, locateExpression = self.address_page_items['addcontacts_page.contactpersoncomment'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) def contact_save_button(self): locateType, locateExpression = self.address_page_items['addcontacts_page.savecontaceperson'].split(">") print locateType, locateExpression return getElement(self.driver, locateType, locateExpression) if __name__ == "__main__": from selenium import webdriver driver = webdriver.Firefox(executable_path="D:\\geckodriver") login(driver, "xxx", "xxx") hp=HomePage(driver) hp.address_book_page_link().click() time.sleep(5) ap=AddressPage(driver) ap.add_contact_button().click() time.sleep(2) ap.contact_name().send_keys("gloryroad") ap.contact_email().send_keys("87393932@qq.com") ap.contact_is_star().click() ap.contact_mobile().send_keys("1322222222") ap.contact_other_info().send_keys(u"光榮之路") ap.contact_save_button().click()
7)新建一個包,Action ,封裝各種方法
新建一個模塊,login.py,內容如下:
#encoding=utf-8 import time from selenium import webdriver from Util.Log import * from Util.FormatTime import data_time_chinese from PageProject.login_page import * def login(driver,username,password): driver.get("https://mail.126.com") time.sleep(2) lp = LoginPage(driver) lp.lbnormalbutton_click() lp.switch_to_frame() time.sleep(2) lp.input_username(username) lp.input_password(password) lp.loginbutton_click() time.sleep(2) info("Login Successfully!") print data_time_chinese() if __name__ == "__main__": driver = webdriver.Firefox(executable_path = "D:\\geckodriver") login(driver,"xxx","xxx")
新建一個模塊,visit_address_page.py,內容如下:
#encoding=utf-8 from selenium import webdriver from Util.Log import * import time from PageObject.login_page import * from PageObject.home_page import * from login import * def visit_address_page(driver): hp = HomePage(driver) hp.address_book_page_link().click() time.sleep(5) if __name__ == "__main__": driver = webdriver.Firefox(executable_path = "D:\\geckodriver") login(driver,"xxx","xxx") visit_address_page(driver)
新建一個模塊,add_contact.py,內容如下:
#encoding=utf-8 from selenium import webdriver from Util.Log import * from Util.FormatTime import * import time from PageObject.login_page import * from PageObject.home_page import * from PageObject.addressBook import * from Util.Excel import * from ProjectVar.var import * def add_contact(driver,name="",email="",is_star=True,mobile="",other_info=""): ap = AddressPage(driver) ap.add_contact_button().click() time.sleep(2) ap.contact_name().send_keys(name) ap.contact_email().send_keys(email) if is_star == "True": ap.contact_is_star().click() ap.contact_mobile().send_keys(mobile) ap.contact_other_info().send_keys(other_info) ap.add_contact_button().click() time.sleep(3) if __name__ == "__main__": driver = webdriver.Firefox(executable_path = "D:\\geckodriver") login(driver,"xxx","xxx") visit_address_page(driver) add_contact(driver,"Tom","1234@qq.com","True","18702235965",u"自己") driver.quit()
8)新建一個目錄TestScript,存放測試腳本
新建一個python文件,testContact.py,內容如下:
#encoding=utf-8 from selenium import webdriver from Util.Log import * from Util.Excel import * from Util.FormatTime import * import time from Action.add_contact import * from Action.visit_address_page import * from Action.login import * from ProjectVar.var import * import sys reload(sys) sys.setdefaultencoding("utf8") #取出所有行,使用切片取非第一行的所有行,因為第一行是標題,所以不用取 #遍歷每一行,然后使用讀取單元格的方法,將用戶名和密碼讀取到兩個變量里面,然后傳到login方法中,調用即可 pe = ParseExcel(test_data_excel_path) pe.set_sheet_by_index(0) print pe.get_default_name() rows = pe.get_all_rows()[1:] for id,row in enumerate(rows): if row[is_executed_col_no].value.lower() == "y": username = row[username_col_no].value password = row[password_col_no].value print "username:",row[username_col_no].value print "password:",row[password_col_no].value driver = webdriver.Firefox(executable_path = firefox_driver_path) try: login(driver,username,password) visit_address_page(driver) time.sleep(3) pe.set_sheet_by_index(1) print pe.get_default_name() print pe.get_all_rows() test_data_result_flag = True #新建聯系人都成功才是True,有一個失敗就是False for id2,row in enumerate(pe.get_all_rows()[1:]): if row[7].value == "y": try: print "log:",row[1],row[1].value print "log:",type(row[1]) add_contact(driver,row[1].value,row[2].value,row[3].value,row[4].value,row[5].value) pe.write_cell_content(id2 + 2,9,data_time_chinese()) print "assert word:",row[assert_keyword_col_no].value assert row[assert_keyword_col_no].value in driver.page_source pe.write_cell_content(id2 + 2,10,"pass") except Exception,e: print u"異常信息:",e.message error(u"異常信息:" + e.message) pe.write_cell_content(id2 + 2,9,data_time_chinese()) pe.write_cell_content(id2 + 2,10,"fail") test_data_result_flag = False else: pe.write_cell_content(id2 + 2,10,u"忽略") continue if test_data_result_flag == True: pe.set_sheet_by_index(0) pe.write_cell_content(id + 2,test_result_col_no,u"成功") else: pe.set_sheet_by_index(0) pe.write_cell_content(id + 2, test_result_col_no, u"失敗") except Exception,e: print u"異常信息:",e.message info(u"異常信息:" + e.message) driver.quit() else: print u"第" + str(id+1) + u"行數據不執行" pe.set_sheet_by_index(0) pe.write_cell_content(id+2,test_result_col_no,u"忽略") continue