• 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-启动打开页面-输入-断言

    四、结果

    控制台:

    磁盘日志文件:

  • 相关阅读:
    Reactive Extensions (Rx) 入门(5) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(4) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(3) —— Rx的事件编程
    Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions
    Reactive Extensions (Rx) 入门(1) —— Reactive Extensions 概要
    Xamarin NuGet 缓存包导致 already added : Landroid/support/annotation/AnimRes 问题解决方案
    Android 系统Action大全
    Xamarin Forms 实现发送通知点击跳转
    如何理解灰度发布
    推荐一款分布式微服务框架 Surging
  • 原文地址:https://www.cnblogs.com/sincoolvip/p/8632425.html
Copyright © 2020-2023  润新知