python+selenium+unnittest框架


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-啟動打開頁面-輸入-斷言

四、結果

控制台:

磁盤日志文件:

 


免責聲明!

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



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