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-啟動打開頁面-輸入-斷言
四、結果
控制台:

磁盤日志文件:

