python selenium 基礎框架
阿新 • • 發佈:2018-03-20
for exce please etc form 文本框 不同 pos www
base_page.py
1 # coding=utf-8 2 import time 3 from selenium.common.exceptions import NoSuchElementException 4 import os.path 5 from unittest3.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 21 def quit_browser(self): 22 self.driver.quit() 23 24 # 瀏覽器前進操作 25 26 defforward(self): 27 self.driver.forward() 28 logger.info("Click forward on current page.") 29 30 # 瀏覽器後退操作 31 32 def back(self): 33 self.driver.back() 34 logger.info("Click back on current page.") 35 36 # 隱式等待 37 38 def wait(self, seconds):39 self.driver.implicitly_wait(seconds) 40 logger.info("wait for %d seconds." % seconds) 41 42 # 點擊關閉當前窗口 43 44 def close(self): 45 try: 46 self.driver.close() 47 logger.info("Closing and quit the browser.") 48 except NameError as e: 49 logger.error("Failed to quit the browser with %s" % e) 50 51 # 保存圖片 52 53 def get_windows_img(self): 54 """ 55 在這裏我們把file_path這個參數寫死,直接保存到我們項目根目錄的一個文件夾.\Screenshots下 56 """ 57 file_path = os.path.dirname(os.path.abspath(‘.‘)) + ‘/screenshots/‘ 58 rq = time.strftime(‘%Y%m%d%H%M‘, time.localtime(time.time())) 59 screen_name = file_path + rq + ‘.png‘ 60 try: 61 self.driver.get_screenshot_as_file(screen_name) 62 logger.info("Had take screenshot and save to folder : /screenshots") 63 except NameError as e: 64 logger.error("Failed to take screenshot! %s" % e) 65 self.get_windows_img() 66 67 # 定位元素方法 68 69 def find_element(self, selector): 70 """ 71 這個地方為什麽是根據=>來切割字符串,請看頁面裏定位元素的方法 72 submit_btn = "id=>su" 73 login_lnk = "xpath => //*[@id=‘u1‘]/a[7]" # 百度首頁登錄鏈接定位 74 如果采用等號,結果很多xpath表達式中包含一個=,這樣會造成切割不準確,影響元素定位 75 :param selector: 76 :return: element 77 """ 78 element = ‘‘ 79 if ‘=>‘ not in selector: 80 return self.driver.find_element_by_id(selector) 81 selector_by = selector.split(‘=>‘)[0] 82 selector_value = selector.split(‘=>‘)[1] 83 84 if selector_by == "i" or selector_by == ‘id‘: 85 try: 86 element = self.driver.find_element_by_id(selector_value) 87 logger.info("Had find the element \‘ %s \‘ successful " 88 "by %s via value: %s " % (element.text, selector_by, selector_value)) 89 except NoSuchElementException as e: 90 logger.error("NoSuchElementException: %s" % e) 91 self.get_windows_img() # take screenshot 92 elif selector_by == "n" or selector_by == ‘name‘: 93 element = self.driver.find_element_by_name(selector_value) 94 elif selector_by == "c" or selector_by == ‘class_name‘: 95 element = self.driver.find_element_by_class_name(selector_value) 96 elif selector_by == "l" or selector_by == ‘link_text‘: 97 element = self.driver.find_element_by_link_text(selector_value) 98 elif selector_by == "p" or selector_by == ‘partial_link_text‘: 99 element = self.driver.find_element_by_partial_link_text(selector_value) 100 elif selector_by == "t" or selector_by == ‘tag_name‘: 101 element = self.driver.find_element_by_tag_name(selector_value) 102 elif selector_by == "x" or selector_by == ‘xpath‘: 103 try: 104 element = self.driver.find_element_by_xpath(selector_value) 105 logger.info("Had find the element \‘ %s \‘ successful " 106 "by %s via value: %s " % (element.text, selector_by, selector_value)) 107 except NoSuchElementException as e: 108 logger.error("NoSuchElementException: %s" % e) 109 self.get_windows_img() 110 elif selector_by == "s" or selector_by == ‘selector_selector‘: 111 element = self.driver.find_element_by_css_selector(selector_value) 112 else: 113 raise NameError("Please enter a valid type of targeting elements.") 114 115 return element 116 117 # 輸入 118 119 def type(self, selector, text): 120 121 el = self.find_element(selector) 122 el.clear() 123 try: 124 el.send_keys(text) 125 logger.info("Had type \‘ %s \‘ in inputBox" % text) 126 except NameError as e: 127 logger.error("Failed to type in input box with %s" % e) 128 self.get_windows_img() 129 130 # 清除文本框 131 132 def clear(self, selector): 133 134 el = self.find_element(selector) 135 try: 136 el.clear() 137 logger.info("Clear text in input box before typing.") 138 except NameError as e: 139 logger.error("Failed to clear in input box with %s" % e) 140 self.get_windows_img() 141 142 # 點擊元素 143 144 def click(self, selector): 145 146 el = self.find_element(selector) 147 try: 148 el.click() 149 logger.info("The element \‘ %s \‘ was clicked." % el.text) 150 except NameError as e: 151 logger.error("Failed to click the element with %s" % e) 152 153 # 或者網頁標題 154 155 def get_page_title(self): 156 logger.info("Current page title is %s" % self.driver.title) 157 return self.driver.title 158 159 @staticmethod 160 def sleep(seconds): 161 time.sleep(seconds) 162 logger.info("Sleep for %d seconds" % seconds)
browser_engine.py
1 # coding=utf-8 2 from selenium import webdriver 3 4 5 class BrowserEngine(object): 6 """ 7 定義一個瀏覽器引擎類,根據browser_type的值去,控制啟動不同的瀏覽器,這裏主要是IE,Firefox, Chrome 8 9 """ 10 11 def __init__(self, driver): 12 self.driver = driver 13 14 browser_type = "Chrome" # maybe Firefox, Chrome, IE 15 16 def get_browser(self): 17 """ 18 通過if語句,來控制初始化不同瀏覽器的啟動,默認是啟動Chrome 19 :return: driver 20 """ 21 22 if self.browser_type == ‘Firefox‘: 23 driver = webdriver.Firefox() 24 elif self.browser_type == ‘Chrome‘: 25 driver = webdriver.Chrome() 26 elif self.browser_type == ‘IE‘: 27 driver = webdriver.Ie() 28 else: 29 driver = webdriver.Chrome() 30 31 # driver.maximize_window() 32 driver.implicitly_wait(10) 33 driver.get("https://www.baidu.com") 34 return driver
logger.py
1 # _*_ coding: utf-8 _*_ 2 import logging 3 import os.path 4 import time 5 6 7 class Logger(object): 8 def __init__(self, logger): 9 """ 10 指定保存日誌的文件路徑,日誌級別,以及調用文件 11 將日誌存入到指定的文件中 12 :param logger: 13 """ 14 # 創建一個logger 15 self.logger = logging.getLogger(logger) 16 self.logger.setLevel(logging.DEBUG) 17 18 # 創建一個handler,用於寫入日誌文件 19 rq = time.strftime(‘%Y%m%d%H%M‘, time.localtime(time.time())) 20 log_path = os.path.dirname(os.getcwd()) + ‘/Logs/‘ 21 log_name = log_path + rq + ‘.log‘ 22 fh = logging.FileHandler(log_name) 23 fh.setLevel(logging.INFO) 24 25 # 再創建一個handler,用於輸出到控制臺 26 ch = logging.StreamHandler() 27 ch.setLevel(logging.INFO) 28 29 # 定義handler的輸出格式 30 formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) 31 fh.setFormatter(formatter) 32 ch.setFormatter(formatter) 33 34 # 給logger添加handler 35 self.logger.addHandler(fh) 36 self.logger.addHandler(ch) 37 38 def getlog(self): 39 return self.logger
baidu_homepage.py
# coding=utf-8 from unittest3.framework.base_page import BasePage class HomePage(BasePage): input_box = "id=>kw" search_submit_btn = "xpath=>//*[@id=‘su‘]" def type_search(self, text): self.type(self.input_box, text) def send_submit_btn(self): self.click(self.search_submit_btn)
測試類代碼 baidu_search.py
# coding=utf-8 import time import unittest from selenium import webdriver from unittest3.page_object.baidu_homepage import HomePage from unittest3.framework.browser_engine import BrowserEngine class BaiduSearch(unittest.TestCase): def setUp(self): """ 測試固件的setUp()的代碼,主要是測試的前提準備工作 :return: """ # 添加如下代碼,可運行 # ------------------------------------------- # browse = BrowserEngine(self) # self.driver = webdriver.Firefox() # self.driver.get(‘https://www.baidu.com‘) #------------------------------------------- # 修改代碼可以執行 browse = BrowserEngine(self) self.driver=browse.get_browser() def tearDown(self): """ 測試結束後的操作,這裏基本上都是關閉瀏覽器 :return: """ self.driver.quit() def test_baidu_search(self): """ 這裏一定要test開頭,把測試邏輯代碼封裝到一個test開頭的方法裏。 :return: """ homepage = HomePage(self.driver) homepage.type_search(‘selenium‘) # 調用頁面對象中的方法 homepage.send_submit_btn() # 調用頁面對象類中的點擊搜索按鈕方法 time.sleep(2) homepage.get_windows_img() # 調用基類截圖方法 try: assert ‘selenium‘ in homepage.get_page_title() # 調用頁面對象繼承基類中的獲取頁面標題方法 print(‘Test Pass.‘) except Exception as e: print(‘Test Fail.‘, format(e)) if __name__ == ‘__main__‘: unittest.main()
python selenium 基礎框架