預期架構整理目標:
1.單個用例維護在單個.py檔案中可單個執行,也可批量產生組件批量執行
2.對定位參數,定位方法,業務功能指令碼,用例指令碼,用例批量執行指令碼,常用常量進行分層獨立,各自維護在單獨的.py檔案中
3.加入日誌,htlm報表,發送郵件功能
架構結構
結構說明:
config:配置部分,瀏覽器種類和定位資訊維護在此處
constant:常量部分,固定不變的資料維護在此處
data:存放用於參數化的文本表格等檔案
encapsulation:定位等selenium功能二次封裝在此處
error_picture:存放錯誤截圖
function:業務功能指令碼維護在此處
log:存放log類
report:存放測試報告檔案
test_case:存放用例檔案
all_case.py:用來執行所有用例
debug_case.py:本人調試用的,可以忽略
tst.log:產生的日誌
逐個介紹各個包下面的.py檔案,並附上源碼(說明見注釋哈哈~):
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-11 13:42 4 # config/config_01.py 5 from selenium import webdriver 6 import time 7 from selenium.webdriver.common.action_chains import * 8 9 10 # config配置部分11 12 # 瀏覽器種類維護在此處13 browser_config = {14 'ie': webdriver.Ie,15 'chrome': webdriver.Chrome16 }17 18 # 定位資訊維護在此處,維護結構由外到內為:頁面名稱--頁面下元素名稱--元素的定位方式+參數19 locat_config = {20 '部落格園首頁': {21 '找找看輸入框': ['id', 'zzk_q'],22 '找找看按鈕': ['xpath', '//input[@value="找找看"]']23 }24 }
1 #!/usr/bin/env python2 # -*- coding: utf-8 -*-3 # @Time : 2017-05-15 13:204 # constant/constant_1.py5 6 # 常量部分(固定不變使用頻繁的參數維護在此處)7 LOGIN_URL = 'https://www.cnblogs.com/'
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 13:20 4 # encapsulation/encapsulation.py 5 6 # 封裝部分維護在此 7 8 from config.config_01 import locat_config 9 from log.log import Logger10 from selenium.webdriver.support.wait import WebDriverWait11 12 from selenium.webdriver.support import expected_conditions as EC13 14 class UIHandle():15 logger = Logger()16 17 # 構造方法,用來接收selenium的driver對象18 @classmethod19 def __init__(cls, driver):20 cls.driver = driver21 22 # 輸入地址23 @classmethod24 def get(cls, url):25 cls.logger.loginfo(url)26 cls.driver.get(url)27 28 # 關閉瀏覽器驅動29 @classmethod30 def quit(cls):31 cls.driver.quit()32 33 # element對象(還可加入try,截圖等。。。)34 @classmethod35 def element(cls, page, element):36 # 加入日誌37 cls.logger.loginfo(page)38 # 加入隱性等待39 # 此處便可以傳入config_o1中的dict定位參數40 el = WebDriverWait(cls.driver, 10).until(EC.presence_of_element_located(locat_config[page][element]))41 # 加入日誌42 cls.logger.loginfo(page+'OK')43 return el44 # element對象(還未完成。。。)45 def elements(cls, page, element):46 # 加入日誌47 cls.logger.loginfo(page)48 # 加入隱性等待49 WebDriverWait(cls.driver, 10)50 els = cls.driver.find_elements(*locat_config[page][element])51 # 注意返回的是list52 return els53 54 # send_keys方法55 @classmethod56 def Input(cls, page, element, msg):57 el = cls.element(page, element)58 el.send_keys(msg)59 60 # click方法61 @classmethod62 def Click(cls, page, element):63 el = cls.element(page, element)64 el.click()
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-15 13:22 4 # function/function_01.py 5 # 業務功能指令碼(用例指令碼可調用此處的功能指令碼) 6 7 from encapsulation.encapsulation import UIHandle 8 from constant.constant_1 import LOGIN_URL 9 from config.config_01 import browser_config10 from time import sleep11 12 # 開啟部落格園首頁,進行找找看搜尋功能13 def search(msg):14 # 開啟瀏覽器15 driver = browser_config['chrome']()16 # 傳入driver對象17 uihandle = UIHandle(driver)18 #輸入url地址19 uihandle.get(LOGIN_URL)20 # 調用二次封裝後的方法,此處可見操作了哪個頁面,哪個元素,msg是要插入的值,插入值得操作在另外一個用例檔案中傳入21 uihandle.Input('部落格園首頁', '找找看輸入框', msg)22 uihandle.Click('部落格園首頁', '找找看按鈕')23 uihandle.quit()
1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2017-05-17 11:19 4 # log/log.py 5