基於python語言下的UI自動化測試框架搭建(二)


 

framework包中文件如下所示:

 

 

base_page.py:常用操作方法

 

在framework包下創建base_page.py文件,文件中封裝一些頁面常用操作方法,可以自己在這個類中進行對應方法的添加,代碼如下:

 

 1 # coding=utf-8  2 import time  3 from selenium.common.exceptions import NoSuchElementException  4 import os.path  5 from framework.logger import Logger  6  7 # create a logger instance  8 logger = Logger(logger="BasePage").getlog()  9  10  11 class BasePage(object):  12 """  13  定義一個頁面基類,讓所有頁面都繼承這個類,封裝一些常用的頁面操作方法到這個類  14 """  15  16 def __init__(self, driver):  17 self.driver = driver  18  19 # quit browser and end testing  20 def quit_browser(self):  21  self.driver.quit()  22  23 # 瀏覽器前進操作  24 def forward(self):  25  self.driver.forward()  26 logger.info("Click forward on current page.")  27  28 # 瀏覽器后退操作  29 def back(self):  30  self.driver.back()  31 logger.info("Click back on current page.")  32  33 # 隱式等待  34 def wait(self, seconds):  35  self.driver.implicitly_wait(seconds)  36 logger.info("wait for %d seconds." % seconds)  37  38 # 點擊關閉當前窗口  39 def close(self):  40 try:  41  self.driver.close()  42 logger.info("Closing and quit the browser.")  43 except NameError as e:  44 logger.error("Failed to quit the browser with %s" % e)  45  46 # 保存圖片  47 def get_windows_img(self):  48 """  49  在這里我們把file_path這個參數寫死,直接保存到我們項目根目錄的一個文件夾.\Screenshots下  50 """  51 file_path = os.path.dirname(os.path.abspath('.')) + '\screenshots\\'  52 rq = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))  53 screen_name = file_path + rq + '.png'  54 try:  55  self.driver.get_screenshot_as_file(screen_name)  56 logger.info("Had take screenshot and save to folder : \screenshots")  57 except NameError as e:  58 logger.error("Failed to take screenshot! %s" % e)  59  self.get_windows_img()  60  61 # 定位元素方法  62 def find_element(self, selector):  63 """  64  這個地方為什么是根據=>來切割字符串,請看頁面里定位元素的方法  65  submit_btn = "id=>su"  66  login_lnk = "xpath => //*[@id='u1']/a[7]" # 百度首頁登錄鏈接定位  67  如果采用等號,結果很多xpath表達式中包含一個=,這樣會造成切割不准確,影響元素定位  68  :param selector:  69  :return: element  70 """  71 element = ''  72 if '=>' not in selector:  73 return self.driver.find_element_by_id(selector)  74 selector_by = selector.split('=>')[0]  75 selector_value = selector.split('=>')[1]  76  77 if selector_by == "i" or selector_by == 'id':  78 try:  79 element = self.driver.find_element_by_id(selector_value)  80 logger.info("Had find the element \' %s \' successful "  81 "by %s via value: %s " % (element.text, selector_by, selector_value))  82 except NoSuchElementException as e:  83 logger.error("NoSuchElementException: %s" % e)  84 self.get_windows_img() # take screenshot  85 elif selector_by == "n" or selector_by == 'name':  86 element = self.driver.find_element_by_name(selector_value)  87 elif selector_by == "c" or selector_by == 'class_name':  88 element = self.driver.find_element_by_class_name(selector_value)  89 elif selector_by == "l" or selector_by == 'link_text':  90 element = self.driver.find_element_by_link_text(selector_value)  91 elif selector_by == "p" or selector_by == 'partial_link_text':  92 element = self.driver.find_element_by_partial_link_text(selector_value)  93 elif selector_by == "t" or selector_by == 'tag_name':  94 element = self.driver.find_element_by_tag_name(selector_value)  95 elif selector_by == "x" or selector_by == 'xpath':  96 try:  97 element = self.driver.find_element_by_xpath(selector_value)  98 logger.info("Had find the element \' %s \' successful "  99 "by %s via value: %s " % (element.text, selector_by, selector_value)) 100 except NoSuchElementException as e: 101 logger.error("NoSuchElementException: %s" % e) 102  self.get_windows_img() 103 elif selector_by == "s" or selector_by == 'selector_selector': 104 element = self.driver.find_element_by_css_selector(selector_value) 105 else: 106 raise NameError("Please enter a valid type of targeting elements.") 107 108 return element 109 110 111 # 輸入 112 def type(self, selector, text): 113 114 el = self.find_element(selector) 115  el.clear() 116 try: 117  el.send_keys(text) 118 logger.info("Had type \' %s \' in inputBox" % text) 119 except NameError as e: 120 logger.error("Failed to type in input box with %s" % e) 121  self.get_windows_img() 122 123 # 清除文本框 124 def clear(self, selector): 125 126 el = self.find_element(selector) 127 try: 128  el.clear() 129 logger.info("Clear text in input box before typing.") 130 except NameError as e: 131 logger.error("Failed to clear in input box with %s" % e) 132  self.get_windows_img() 133 134 # 點擊元素 135 def click(self, selector): 136 137 el = self.find_element(selector) 138 try: 139  el.click() 140 logger.info("The element \' %s \' was clicked." % el.text) 141 except NameError as e: 142 logger.error("Failed to click the element with %s" % e) 143 144 # 或者網頁標題 145 def get_page_title(self): 146 logger.info("Current page title is %s" % self.driver.title) 147 return self.driver.title 148 149  @staticmethod 150 def sleep(seconds): 151  time.sleep(seconds) 152 logger.info("Sleep for %d seconds" % seconds)

 

browser_engine.py:瀏覽器操作方法

 

browser_engine.py中封裝獲取根目錄下瀏覽器驅動方法和瀏覽器操作方法,但需要注意的是,如果在里面使用中文,需要切換方法,但是小編在切換了以后還是不對,可能是因為使用2.7版本python吧,用3.x版本的朋友可以嘗試一下使用中文進行日志打印的操作,代碼如下:

 

 1 # -*- coding:utf-8 -*-  2 import ConfigParser  3 import os.path  4 from selenium import webdriver  5 from framework.logger import Logger  6  7 logger = Logger(logger="BrowserEngine").getlog()  8  9 10 class BrowserEngine(object): 11 dir = os.path.dirname(os.path.abspath('.')) # 注意相對路徑獲取方法 12 chrome_driver_path = dir + '/tools/chromedriver.exe' 13 ie_driver_path = dir + '/tools/IEDriverServer.exe' 14 15 def __init__(self, driver): 16 self.driver = driver 17 18 # read the browser type from config.ini file, return the driver 19 def open_browser(self, driver): 20 config = ConfigParser.ConfigParser() 21 # file_path = os.path.dirname(os.getcwd()) + '/config/config.ini' 22 file_path = os.path.dirname(os.path.abspath('.')) + '/config/config.ini' 23  config.read(file_path) 24 # config.read(file_path,encoding='UTF-8'), 如果代碼有中文注釋,用這個,不然報解碼錯誤 25 26 browser = config.get("browserType", "browserName") 27 logger.info("You had select %s browser." % browser) 28 url = config.get("testServer", "URL") 29 logger.info("The test server url is: %s" % url) 30 31 if browser == "Firefox": 32 driver = webdriver.Firefox() 33 logger.info("Starting firefox browser.") 34 elif browser == "Chrome": 35 driver = webdriver.Chrome(self.chrome_driver_path) 36 logger.info("Starting Chrome browser.") 37 elif browser == "IE": 38 driver = webdriver.Ie(self.ie_driver_path) 39 logger.info("Starting IE browser.") 40 41  driver.get(url) 42 logger.info("Open url: %s" % url) 43  driver.maximize_window() 44 logger.info("Maximize the current window.") 45 driver.implicitly_wait(10) 46 logger.info("Set implicitly wait 10 seconds.") 47 return driver 48 49 def quit_browser(self): 50 logger.info("Now, Close and quit the browser.") 51 self.driver.quit()

 

logger.py:日志處理

現在,我們來看一下logger.py中是怎么寫的,logger需要實現的功能是要指定保存的日志文件路徑,日志級別還有調用文件后將日志存入到指定的文件夾中,日志命名格式為當前案例執行時間並精確到秒,可以保證在執行案例過程中精確的打印出當前案例執行過程的日志。代碼如下:

 1 #_*_coding:utf-8 _*_
 2 import logging
 3 import os.path
 4 import time
 5 
 6 class Logger(object):
 7     def __init__(self,logger):
 8         '''指定保存日志的文件路徑,日志級別以及調用文件將日志存入到指定的文件中'''
 9         #創建一個logger
10         self.logger = logging.getLogger(logger)
11         self.logger.setLevel(logging.DEBUG)
12         #創建一個handler,用於寫入日志文件
13         rq = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
14         log_path = os.path.dirname(os.path.abspath('.'))+'\logs\\'
15         #如果case組織結構式/testsuit/fraturemoddel/xxx.py,那么得到的相對路徑的父路徑就是項目的根目錄
16         log_name = log_path + rq + '.log'
17         fh = logging.FileHandler(log_name)
18         fh.setLevel(logging.INFO)
19 
20         #再創建一個handler,用於輸出到控制台
21         ch = logging.StreamHandler()
22         ch.setLevel(logging.INFO)
23         #定義handler的輸出格式
24         formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
25         fh.setFormatter(formatter)
26         ch.setFormatter(formatter)
27         #給logger添加handler
28         self.logger.addHandler(fh)
29         self.logger.addHandler(ch)
30     def getlog(self):
31         return self.logger

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM