python+selenium+unnittest框架,以百度搜索為例,做了一個簡單的框架,先看一下整個項目目錄結構
我用的是pycharm工具,我覺得這個工具是天使,超好用也超好看!
這些要感謝原作者:https://blog.csdn.net/u011541946/article/details/70269965
但是我這里有些改動,主要是代碼方面的,作者寫的我運行有問題而且理解不了,改了一點
有幾點注意強調一下:
1、不要建目錄,要建python package會自動創建__init__.py,這樣import的時候找得到package
2、函數還是選擇無參會好一些,如果沒有特別的需要
3、有很多api方法的使用不是很熟悉,但沒關系,用到了搜一下就行了。有百度和google為什么還要自己死摳
4、有報錯,請認真看報錯信息,一個字都不能漏掉。指望原作者是不頂用的。
這里就列3個核心py
一、logger.py所有日志輸出全靠它了!
#_*_coding:utf-8_*_ import logging import os import time class Logger(object): def __init__(self,logger):#logger就是給log起的名字 #創建一個logger self.logger = logging.getLogger(logger) self.logger.setLevel(logging.INFO) #創建一個hanlder,用於寫入日志文件 request_time = time.strftime('%Y%m%d%H%M',time.localtime(time.time())) #生成一個當前日期的日期字符串 log_path = os.path.dirname(os.getcwd())+'/logs/' # os.getcwd()獲取當前工作目錄,os.path.dirname(os.getcwd())獲取當前目錄的上一級目錄 log_name = log_path+request_time+'.log' #拼成日志名稱 =路徑+時間戳.log
#創建一個handler,用於生成在磁盤上 fh = logging.FileHandler(log_name) #logging模塊自帶的三個handler之一。繼承自StreamHandler。將日志信息輸出到磁盤文件上。 fh.setLevel(logging.INFO) #再創建一個handler,用於輸出控制台 sh = logging.StreamHandler() sh.setLevel(logging.INFO) #定義handler的輸出格式 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') fh.setFormatter(formatter) #給handler設置格式 sh.setFormatter(formatter) #給logger添加handler 換句話說就是給該logger添加不同的handler self.logger.addHandler(fh) self.logger.addHandler(sh) def getlog(self): return self.logger
怎么說呢,也許你看不懂,但沒關系,我也是看了至少5遍才看懂。你就當是組件。有個步驟
1、先創建logger設置好日志名稱
2、拼好生成的本地log文件,生成的最終是路徑+文件名
3、創建logging的handler,你可以不用管這個是什么,就相當於句柄吧。控制台輸出和文件輸出還是不一樣的方法
4、定義handler的輸出格式
5、把控制台輸出和文件輸出的2個handler添加進第1步的logger中
二、瀏覽器引擎基礎類本劇的核心browser_engine.py
#瀏覽器引擎類 import configparser import os from selenium import webdriver from framework.logger import Logger mylogger = Logger(logger='TestMyLog').getlog() class BrowserEngine(object): dir = os.path.dirname(os.path.abspath('.')) #注意相對路徑獲取方法 firefox_driver_path = dir+'/tools/geckodriver.exe' chrome_driver_path = dir + '/tools/chromedriver.exe' def open_browser(self): #讀取配置文件 config = configparser.ConfigParser() file_path = self.dir+'/config/config.ini' print('file_path===========',file_path) config.read(file_path) #從配置 文件 中獲取瀏覽器名稱並打印日志 browser = config.get('browserType','browserName') print('browser=========',browser) mylogger.info('you had select %s' % browser) #從配置文件 中獲取要訪問的URL並打印日志 url = config.get('testServer','URL') print('url=============',url) mylogger.info('you want to visit %s' %url) if browser == 'Firefox': self.driver = webdriver.Firefox(executable_path=self.firefox_driver_path) mylogger.info('Starting firefox browser') elif browser == 'Chrome': self.driver = webdriver.Chrome(executable_path=self.chrome_driver_path) mylogger.info('Starting chrome browser') # URL請求 self.driver.get(url) mylogger.info('Open url: %s' % url) # 窗口全屏幕 self.driver.maximize_window() mylogger.info('Maximize the current window') # 加載等待時間 self.driver.implicitly_wait(5) mylogger.info('Set implicitly wait 10 seconds') return self.driver def quit_browser(self): mylogger.info('Now,Close and quit the browser') self.driver.quit()
這個真的沒啥了,玩過'一條道走到黑'(新手一個py走完全程的編程方法 )都看得懂。就是有些原來的東西抽出來當了變量全是舊知識點,
唯一用的新知識點是解析配置文件的庫包configparser,就那么簡單,讀取配置文件。一個get就行了,其實相當於是找key-value
在這一步中,我修改了一些內容,與原作者不同。每個人的編程方法不同,沒有好壞,只有對錯和有無結果,大家見仁見智了!
三、測試類baidu_search.py
#coding=utf-8 import time import unittest from framework.browser_engine import BrowserEngine class BaiduSearch(unittest.TestCase): def setUp(self): #得到driver browser = BrowserEngine() self.driver = browser.open_browser() print(self.driver) def tearDown(self): self.driver.quit() def test_baidu_search(self): self.driver.find_element_by_id('kw').send_keys('selenium') time.sleep(1) try: assert 'selenium' in self.driver.title print('Test Pass') except Exception as e: print('Test Fail.',format(e)) if __name__ == '__main__': unittest.main()
unnittest是python自帶的單元測試包來着。其實相當於java中的junit。意思就是運行不需要再寫主函數調用。
這里真沒得啥要說的。就是核心類瀏覽器引擎類的調用。生成driver-啟動打開頁面-輸入-斷言
四、結果
控制台:
磁盤日志文件: