日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集

系統(tǒng) 1781 0

簡(jiǎn)介

生活中的日志是記錄你生活的點(diǎn)點(diǎn)滴滴,讓它把你內(nèi)心的世界表露出來(lái),更好的詮釋自己的內(nèi)心世界,而電腦里的日志是有價(jià)值的信息寶庫(kù)。

日志文件是專門用于記錄系統(tǒng)操作事件的記錄文件或文件集合,操作系統(tǒng)有操作系統(tǒng)日志文件,數(shù)據(jù)庫(kù)系統(tǒng)有數(shù)據(jù)庫(kù)系統(tǒng)日志文件,等等。

系統(tǒng)日志文件是包含關(guān)于系統(tǒng)消息的文件,包括內(nèi)核、服務(wù)、在系統(tǒng)上運(yùn)行的應(yīng)用程序等。不同的日志文件記載不同的信息。例如,有的是默認(rèn)的系統(tǒng)日志文件,有的記載特定任務(wù)。

在數(shù)據(jù)庫(kù)中用事務(wù)日志文件記錄數(shù)據(jù)的修改操作,其中的每條日志記錄或者記錄所執(zhí)行的邏輯操作,或者記錄已修改數(shù)據(jù)的前像和后像。前像是操作執(zhí)行前的數(shù)據(jù)復(fù)本;后像是操作執(zhí)行后的數(shù)據(jù)復(fù)本。

問(wèn)題思考

在自動(dòng)化腳本運(yùn)行過(guò)程中, IDE控制臺(tái)一般都會(huì)輸出運(yùn)行日志。但是如果測(cè)試項(xiàng)目是在liunx服務(wù)器上面運(yùn)行,沒(méi)有IDE控制臺(tái)輸出log,那么我們?cè)撊绾尾杉罩荆? 元芳,你怎么看?

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第1張圖片 ? ? ? Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第2張圖片 ??

日志概述

日志作用

不管是在項(xiàng)目開(kāi)發(fā)還是測(cè)試過(guò)程中,項(xiàng)目運(yùn)行一旦出現(xiàn)問(wèn)題日志信息就非常重要了。日志是定位問(wèn)題的重要手段,就像偵探人員要根據(jù)現(xiàn)場(chǎng)留下的線索來(lái)推斷案情。

日志級(jí)別

腳本運(yùn)行會(huì)有很多的情況,比如調(diào)試信息、報(bào)錯(cuò)異常信息等。日志要根據(jù)這些不同的情況來(lái)繼續(xù)分級(jí)管理,不然對(duì)于排查問(wèn)題的篩選會(huì)有比較大的干擾。 。日志一般定位的級(jí)別如下:

?

級(jí)別

何時(shí)使用

DEBUG

調(diào)試信息,也是最詳細(xì)的日志信息。

INFO

證明事情按預(yù)期工作。

WARNING

表明發(fā)生了一些意外,或者不久的將來(lái)會(huì)發(fā)生問(wèn)題(如‘磁盤滿了’)。軟件還是在正常工作。

ERROR

由于更嚴(yán)重的問(wèn)題,軟件已不能執(zhí)行一些功能了。

CRITICAL

嚴(yán)重錯(cuò)誤,表明軟件已不能繼續(xù)運(yùn)行了。

首先我們?nèi)罩拘枰凑? info、debug、error等級(jí)別來(lái)進(jìn)行區(qū)分的。當(dāng)然這個(gè)級(jí)別可以自己去設(shè)置。在一般的情況下我們普通的輸出我們直接用info類型,調(diào)試的時(shí)候用debug類型,如果預(yù)計(jì)有錯(cuò)誤時(shí)那么我們就需要用error類型的日志,一般情況去info級(jí)別最為合適。

日志格式

日志格式化是為了提高日志的可閱讀性,比如: 時(shí)間 +模塊+行數(shù)+日志具體信息 ?的內(nèi)容格式。如果日志信息雜亂無(wú)章的全部輸出來(lái),這樣也不利于定位問(wèn)題。如下所示就是日志格式化輸出,非常便于閱讀查看。

            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              02
            
            :
            
              35
            
            ,
            
              633
            
             backup.py[line:
            
              18
            
            ] INFO ============test backup================


            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              02
            
            :
            
              39
            
            ,
            
              253
            
             backup.py[line:
            
              20
            
            
              ] INFO click backup button


            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              02
            
            :
            
              54
            
            ,
            
              025
            
             backup.py[line:
            
              23
            
            
              ] INFO click next button


            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              03
            
            :
            
              09
            
            ,
            
              280
            
             common_fun.py[line:
            
              83
            
            
              ] INFO Start send Email..


            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              03
            
            :
            
              11
            
            ,
            
              840
            
             common_fun.py[line:
            
              91
            
            ] INFO Send Email finish!


            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              22
            
            :
            
              03
            
            :
            
              13
            
            ,
            
              305
            
             common_fun.py[line:
            
              168
            
            ] INFO 
            
              get
            
            
               backup screenshot


            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              23
            
            :
            
              36
            
            :
            
              00
            
            ,
            
              238
            
             backup.py[line:
            
              17
            
            ] INFO ============test backup================


            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              23
            
            :
            
              36
            
            :
            
              04
            
            ,
            
              530
            
             backup.py[line:
            
              19
            
            
              ] INFO click backup button


            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              23
            
            :
            
              37
            
            :
            
              20
            
            ,
            
              107
            
             backup.py[line:
            
              17
            
            ] INFO ============test
          

日志位置

一個(gè)項(xiàng)目中會(huì)有很多的日志采集點(diǎn),而日志采集點(diǎn)必須結(jié)合業(yè)務(wù)屬性來(lái)設(shè)置。比如在登錄代碼執(zhí)行前可以插入 “準(zhǔn)備登錄..”日志信息,如果登錄完成之后,再設(shè)置登錄的提示日志就會(huì)給人造成誤解,無(wú)法判斷到底是登錄之前的問(wèn)題還是登錄之后的問(wèn)題,因此日志采集點(diǎn)的位置很重要。

logging模塊

簡(jiǎn)介

Python的logging模塊提供了通用的日志系統(tǒng),這個(gè)模塊提供不同的日志級(jí)別,并可以采用不同的方式記錄日志,比如文件,HTTP GET/POST,SMTP,Socket等,甚至可以自己實(shí)現(xiàn)方式記錄日志。

# 導(dǎo)入 logging 模塊

import?logging

logging模塊官方文檔

logging構(gòu)成

logging模塊包括 logger,Handler,F(xiàn)ilter,F(xiàn)ormatter 四個(gè)部分。

  • Logger 記錄器,用于設(shè)置日志采集。
  • Handler 處理器,將日志記錄發(fā)送至合適的路徑。
  • Filter 過(guò)濾器,提供了更好的粒度控制,它可以決定輸出哪些日志記錄。
  • Formatter 格式化器,指明了最終輸出中日志的格式。

Logger 記錄器

Logger是一個(gè)樹(shù)形層級(jí)結(jié)構(gòu),在使用接口debug,info,warn,error,critical;使用之前必須創(chuàng)建Logger實(shí)例,即創(chuàng)建一個(gè)記錄器,如果沒(méi)有顯式的進(jìn)行創(chuàng)建,則默認(rèn)創(chuàng)建一個(gè)root logger,并應(yīng)用默認(rèn)的日志級(jí)別(WARN),處理器Handler(StreamHandler,即將日志信息打印輸出在標(biāo)準(zhǔn)輸出上),和格式化器Formatter(默認(rèn)的格式即為第一個(gè)簡(jiǎn)單使用程序中輸出的格式)。

方法:

basicConfig(**kwargs) 為日志記錄系統(tǒng)做基本配置。

部分參數(shù)

filename ?指定日志文件名稱

filemode ? 指定打開(kāi)文件的模式,如果指定了 filename(如果文件模式未指定,則默認(rèn)為'a)

Tips:文件讀寫(xiě)模式

  • w 以寫(xiě)方式打開(kāi),
  • W 文件若存在,首先要清空,然后(重新)創(chuàng)建
  • a 以追加模式打開(kāi) (從 EOF 開(kāi)始, 必要時(shí)創(chuàng)建新文件)
  • r+ 以讀寫(xiě)模式打開(kāi)
  • w+ 以讀寫(xiě)模式打開(kāi) (參見(jiàn) w )
  • a+ 以讀寫(xiě)模式打開(kāi) (參見(jiàn) a )

format ?為處理程序使用指定的格式字符串。

datefmt ? 使用指定的日期 /時(shí)間格式。樣式如果指定了格式字符串,則使用它來(lái)指定 格式字符串的類型.

level ?將根記錄器級(jí)別設(shè)置為指定級(jí)別。

logging_test.py

            # coding=utf-
            
              8
            
            
              
# 
            
            
              1
            
            .先設(shè)置編碼,utf-
            
              8可支持中英文,如上,一般放在第一行

# 
            
            
              2
            
            
              .注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。

            
            
              '''

            
            Created on 
            
              2019
            
            -
            
              8
            
            -
            
              14
            
            
              
@author: 北京
            
            -宏哥   QQ交流群:
            
              707699217
            
            
              
Project:學(xué)習(xí)和使用appium自動(dòng)化測(cè)試
            
            -代碼和數(shù)據(jù)分離-
            
              日志收集

            
            
              '''

            
            # 
            
              3
            
            
              .導(dǎo)入模塊

import  logging
# logging.basicConfig(level
            
            =
            
              logging.DEBUG)
logging.basicConfig(level
            
            =
            
              logging.INFO)

logging.debug(
            
            
              '
            
            
              debug info
            
            
              '
            
            
              )
logging.info(
            
            
              '
            
            
              hello 宏哥
            
            
              '
            
            
              )
logging.warning(
            
            
              '
            
            
              warning info
            
            
              '
            
            
              )
logging.error(
            
            
              '
            
            
              error info
            
            
              '
            
            
              )
logging.critical(
            
            
              '
            
            
              critical info
            
            
              '
            
            )
          

Handler 處理器

Handler 處理器,將日志記錄發(fā)送至合適的路徑,Handler處理器類型有很多種,比較常用的有三個(gè):

1.StreamHandler

將日志記錄輸出發(fā)送到諸如 sys.stdout,sys.stderr或任何類似文件流的對(duì)象。上面例子就是輸出到控制臺(tái)

2.FileHandler

將日志記錄輸出發(fā)送到磁盤文件。 它繼承了 StreamHandler的輸出功能。

            logging.basicConfig(filename=
            
              '
            
            
              runlog.log
            
            
              '
            
            ,level=logging.DEBUG)
          

3.NullHandler

不做任何格式化或輸出。 它本質(zhì)上是一個(gè)開(kāi)發(fā)人員使用的 “無(wú)操作”處理程序。

Filter 過(guò)濾器

Handlers和Loggers可以使用Filters來(lái)完成比級(jí)別更復(fù)雜的過(guò)濾。

Formatter

使用 Formatter對(duì)象設(shè)置日志信息最后的規(guī)則、結(jié)構(gòu)和內(nèi)容,默認(rèn)的時(shí)間格式為%Y-%m-%d %H:%M:%S。

格式

描述

%(levelno)s

打印日志級(jí)別的數(shù)值

%(levelname)s

打印日志級(jí)別名稱

%(pathname)s

打印當(dāng)前執(zhí)行程序的路徑

%(filename)s

打印當(dāng)前執(zhí)行程序名稱

%(funcName)s

打印日志的當(dāng)前函數(shù)

%(lineno)d

打印日志的當(dāng)前行號(hào)

%(asctime)s

打印日志的時(shí)間

%(thread)d

打印線程id

%(threadName)s

打印線程名稱

%(process)d

打印進(jìn)程ID

%(message)s

打印日志信息

使用方法:

            logging.basicConfig(filename=
            
              '
            
            
              runlog.log
            
            
              '
            
            ,level=
            
              logging.DEBUG,

                  format
            
            =
            
              '
            
            
              %(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
            
            
              '
            
            )? ? ? ? ? ? ? ?
          

輸出結(jié)果:

            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              14
            
            :
            
              35
            
            :
            
              19
            
            ,
            
              430
            
             logging_test.py[line:
            
              6
            
            
              ]DEBUGdebug info

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              14
            
            :
            
              35
            
            :
            
              19
            
            ,
            
              430
            
             logging_test.py[line:
            
              7
            
            
              ]INFOhello hongge

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              14
            
            :
            
              35
            
            :
            
              19
            
            ,
            
              430
            
             logging_test.py[line:
            
              8
            
            
              ]WARNINGwarning info

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              14
            
            :
            
              35
            
            :
            
              19
            
            ,
            
              430
            
             logging_test.py[line:
            
              9
            
            
              ]ERRORerror info

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              14
            
            :
            
              35
            
            :
            
              19
            
            ,
            
              430
            
             logging_test.py[line:
            
              10
            
            ]CRITICALcritical info
          

Logging實(shí)戰(zhàn)操作

測(cè)試場(chǎng)景

將前面所學(xué)的啟動(dòng)考研幫 App的腳本增加log采集功能,設(shè)置指定的日志格式輸出,并將日志保存到指定文件。

代碼實(shí)現(xiàn)

kyb_logger.py

            # coding=utf-
            
              8
            
            
              
# 
            
            
              1
            
            .先設(shè)置編碼,utf-
            
              8可支持中英文,如上,一般放在第一行

# 
            
            
              2
            
            
              .注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。

            
            
              '''

            
            Created on 
            
              2019
            
            -
            
              8
            
            -
            
              14
            
            
              
@author: 北京
            
            -宏哥   QQ交流群:
            
              707699217
            
            
              
Project:學(xué)習(xí)和使用appium自動(dòng)化測(cè)試
            
            -代碼和數(shù)據(jù)分離-
            
              日志收集

            
            
              '''

            
            # 
            
              3
            
            
              .導(dǎo)入模塊

            
            
              from
            
            
               appium import webdriver
import yaml
import logging

            
            
              from
            
            
               selenium.common.exceptions import NoSuchElementException

file
            
            =open(
            
              '
            
            
              ./desired_caps.yaml
            
            
              '
            
            ,
            
              '
            
            
              r
            
            
              '
            
            
              )
data
            
            =
            
              yaml.load(file)

logging.basicConfig(level
            
            =logging.INFO,filename=
            
              '
            
            
              runlog.log
            
            
              '
            
            
              ,
                    format
            
            =
            
              '
            
            
              %(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s%(message)s
            
            
              '
            
            
              )

desired_caps
            
            =
            
              {}
desired_caps[
            
            
              '
            
            
              platformName
            
            
              '
            
            ]=data[
            
              '
            
            
              platformName
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              platformVersion
            
            
              '
            
            ]=data[
            
              '
            
            
              platformVersion
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              deviceName
            
            
              '
            
            ]=data[
            
              '
            
            
              deviceName
            
            
              '
            
            
              ]

desired_caps[
            
            
              '
            
            
              app
            
            
              '
            
            ]=data[
            
              '
            
            
              app
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              appPackage
            
            
              '
            
            ]=data[
            
              '
            
            
              appPackage
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              appActivity
            
            
              '
            
            ]=data[
            
              '
            
            
              appActivity
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              noReset
            
            
              '
            
            ]=data[
            
              '
            
            
              noReset
            
            
              '
            
            
              ]

logging.info(
            
            
              '
            
            
              start app...
            
            
              '
            
            
              )
driver
            
            =webdriver.Remote(
            
              '
            
            
              http://
            
            
              '
            
            +str(data[
            
              '
            
            
              ip
            
            
              '
            
            ])+
            
              '
            
            
              :
            
            
              '
            
            +str(data[
            
              '
            
            
              port
            
            
              '
            
            ])+
            
              '
            
            
              /wd/hub
            
            
              '
            
            
              ,desired_caps)

def check_cancelBtn():
    logging.info(
            
            
              '
            
            
              check cancelBtn
            
            
              '
            
            
              )

    
            
            
              try
            
            
              :
        cancelBtn 
            
            = driver.find_element_by_id(
            
              '
            
            
              android:id/button2
            
            
              '
            
            
              )
    except NoSuchElementException:
        logging.info(
            
            
              '
            
            
              no cancelBtn
            
            
              '
            
            
              )
    
            
            
              else
            
            
              :
        cancelBtn.click()

def check_skipBtn():
    logging.info(
            
            
              '
            
            
              check skipBtn
            
            
              '
            
            
              )

    
            
            
              try
            
            
              :
        skipBtn 
            
            = driver.find_element_by_id(
            
              '
            
            
              com.tal.kaoyan:id/tv_skip
            
            
              '
            
            
              )
    except NoSuchElementException:
        logging.info(
            
            
              '
            
            
              no skipBtn
            
            
              '
            
            
              )
    
            
            
              else
            
            
              :
        skipBtn.click()

check_cancelBtn()
check_skipBtn()
            
          

runlog.log

            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              15
            
            :
            
              27
            
            :
            
              38
            
            ,
            
              964
            
             kyb_logger.py[line:
            
              32
            
            
              ]INFOstart app...

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              15
            
            :
            
              27
            
            :
            
              47
            
            ,
            
              641
            
             poolmanager.py[line:
            
              358
            
            ]INFORedirecting http:
            
              //
            
            
              127.0.0.1:4723/wd/hub/session -> 
            
            
              http://127.0.0.1
            
            
              :4723/wd/hub/session/dfc8e7e7-71cc-4f0b-9aa6-5db0fdc98a84
            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              15
            
            :
            
              27
            
            :
            
              47
            
            ,
            
              644
            
             kyb_logger.py[line:
            
              36
            
            
              ]INFOcheck cancelBtn

            
            
              2019
            
            -
            
              08
            
            -
            
              14
            
            
              15
            
            :
            
              27
            
            :
            
              49
            
            ,
            
              442
            
             kyb_logger.py[line:
            
              46
            
            ]INFOcheck skipBtn
          

問(wèn)題思考

前面我們已經(jīng)實(shí)現(xiàn)了在代碼中增添 log,log也按照預(yù)期的采集到了,看似一切完美無(wú)瑕。但是該log配置的作用域也只是控制當(dāng)前的腳本 。 然而一個(gè)自動(dòng)化項(xiàng)目中通常有很多模塊腳本,難道我們需要每一個(gè)腳本都這樣配置嗎? 元芳,你怎么看?

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第3張圖片 ? Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第4張圖片

解決思路

回大人,以我跟隨大人多年的斷案經(jīng)驗(yàn): 將這些日志配置的參數(shù)抽離出來(lái),各個(gè)模塊需要使用則直接引用即可。

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第5張圖片

日志格式配置

log輸出格式,輸出路徑等參數(shù)抽離出來(lái)作為一個(gè)配置表,如下所示:

log.conf

            
              [loggers]
keys
            
            =
            
              root,infoLogger

[logger_root]
level
            
            =
            
              DEBUG
handlers
            
            =
            
              consoleHandler,fileHandler

[logger_infoLogger]
handlers
            
            =
            
              consoleHandler,fileHandler
qualname
            
            =
            
              infoLogger
propagate
            
            =
            
              0
            
            
              

[handlers]
keys
            
            =
            
              consoleHandler,fileHandler

[handler_consoleHandler]

            
            
              class
            
            =
            
              StreamHandler
level
            
            =
            
              INFO
formatter
            
            =
            
              form02
args
            
            =
            
              (sys.stdout,)

[handler_fileHandler]

            
            
              class
            
            =
            
              FileHandler
level
            
            =
            
              INFO
formatter
            
            =
            
              form01
args
            
            =(
            
              '
            
            
              runlog.log
            
            
              '
            
            , 
            
              '
            
            
              a
            
            
              '
            
            
              )

[formatters]
keys
            
            =
            
              form01,form02

[formatter_form01]
format
            
            =%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %
            
              (message)s

[formatter_form02]
format
            
            =%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s
          

在需要調(diào)用的模塊增加如下代碼:

            
              import logging

import logging.config



CON_LOG
            
            =
            
              '
            
            
              log.conf
            
            
              '
            
            
              

logging.config.fileConfig(CON_LOG)

logging
            
            =logging.getLogger()
          

方法:

            fileConfig(fname, defaults=None, disable_existing_loggers=True)
          

該放在作用是從 ConfigParser格式的文件中讀取日志配置,同時(shí)如果當(dāng)前腳本有配置log參數(shù),則覆蓋當(dāng)前l(fā)og配置選項(xiàng)。

代碼實(shí)現(xiàn)

kyb_logconf.py

            # coding=utf-
            
              8
            
            
              
# 
            
            
              1
            
            .先設(shè)置編碼,utf-
            
              8可支持中英文,如上,一般放在第一行

# 
            
            
              2
            
            
              .注釋:包括記錄創(chuàng)建時(shí)間,創(chuàng)建人,項(xiàng)目名稱。

            
            
              '''

            
            Created on 
            
              2019
            
            -
            
              8
            
            -
            
              14
            
            
              
@author: 北京
            
            -宏哥   QQ交流群:
            
              707699217
            
            
              
Project:學(xué)習(xí)和使用appium自動(dòng)化測(cè)試
            
            -代碼和數(shù)據(jù)分離-
            
              日志收集

            
            
              '''

            
            # 
            
              3
            
            
              .導(dǎo)入模塊

            
            
              from
            
            
               appium import webdriver
import yaml
import logging
import logging.config

            
            
              from
            
            
               selenium.common.exceptions import NoSuchElementException

file
            
            =open(
            
              '
            
            
              ./desired_caps.yaml
            
            
              '
            
            ,
            
              '
            
            
              r
            
            
              '
            
            
              )
data
            
            =
            
              yaml.load(file)

CON_LOG
            
            =
            
              '
            
            
              log.conf
            
            
              '
            
            
              
logging.config.fileConfig(CON_LOG)
logging
            
            =
            
              logging.getLogger()

desired_caps
            
            =
            
              {}
desired_caps[
            
            
              '
            
            
              platformName
            
            
              '
            
            ]=data[
            
              '
            
            
              platformName
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              platformVersion
            
            
              '
            
            ]=data[
            
              '
            
            
              platformVersion
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              deviceName
            
            
              '
            
            ]=data[
            
              '
            
            
              deviceName
            
            
              '
            
            
              ]

desired_caps[
            
            
              '
            
            
              app
            
            
              '
            
            ]=data[
            
              '
            
            
              app
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              appPackage
            
            
              '
            
            ]=data[
            
              '
            
            
              appPackage
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              appActivity
            
            
              '
            
            ]=data[
            
              '
            
            
              appActivity
            
            
              '
            
            
              ]
desired_caps[
            
            
              '
            
            
              noReset
            
            
              '
            
            ]=data[
            
              '
            
            
              noReset
            
            
              '
            
            
              ]

logging.info(
            
            
              '
            
            
              start app...
            
            
              '
            
            
              )
driver
            
            =webdriver.Remote(
            
              '
            
            
              http://
            
            
              '
            
            +str(data[
            
              '
            
            
              ip
            
            
              '
            
            ])+
            
              '
            
            
              :
            
            
              '
            
            +str(data[
            
              '
            
            
              port
            
            
              '
            
            ])+
            
              '
            
            
              /wd/hub
            
            
              '
            
            
              ,desired_caps)

def check_cancelBtn():
    logging.info(
            
            
              '
            
            
              check cancelBtn
            
            
              '
            
            
              )

    
            
            
              try
            
            
              :
        cancelBtn 
            
            = driver.find_element_by_id(
            
              '
            
            
              android:id/button2
            
            
              '
            
            
              )
    except NoSuchElementException:
        logging.info(
            
            
              '
            
            
              no cancelBtn
            
            
              '
            
            
              )
    
            
            
              else
            
            
              :
        cancelBtn.click()

def check_skipBtn():
    logging.info(
            
            
              '
            
            
              check skipBtn
            
            
              '
            
            
              )

    
            
            
              try
            
            
              :
        skipBtn 
            
            = driver.find_element_by_id(
            
              '
            
            
              com.tal.kaoyan:id/tv_skip
            
            
              '
            
            
              )
    except NoSuchElementException:
        logging.info(
            
            
              '
            
            
              no skipBtn
            
            
              '
            
            
              )
    
            
            
              else
            
            
              :
        skipBtn.click()

check_cancelBtn()
check_skipBtn()
            
          

?小結(jié)

元芳,今天分享的知識(shí)快要結(jié)束,你給總結(jié)一下,把結(jié)案文書(shū)寫(xiě)一下,交給我。元芳,你怎么看?日志的收集。

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第6張圖片

?好了好了,大人,元芳今天太累了,所以說(shuō)出如此大逆不道的話,求大人原諒他,結(jié)案文書(shū)我稍后交給大人。

結(jié)案文書(shū):

1.Logger是一個(gè)樹(shù)形層級(jí)結(jié)構(gòu)

Logger可以包含一個(gè)或多個(gè)Handler和Filter,即Logger與Handler或Fitler是一對(duì)多的關(guān)系;
一個(gè)Logger實(shí)例可以新增多個(gè)Handler,一個(gè)Handler可以新增多個(gè)格式化器或多個(gè)過(guò)濾器,而且日志級(jí)別將會(huì)繼承。

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第7張圖片

?

?

2.Logging工作流程

logging模塊使用過(guò)程

  1. 第一次導(dǎo)入logging模塊或使用reload函數(shù)重新導(dǎo)入logging模塊,logging模塊中的代碼將被執(zhí)行,這個(gè)過(guò)程中將產(chǎn)生logging日志系統(tǒng)的默認(rèn)配置。
  2. 自定義配置(可選)。logging標(biāo)準(zhǔn)模塊支持三種配置方式: dictConfig,fileConfig,listen。其中,dictConfig是通過(guò)一個(gè)字典進(jìn)行配置Logger,Handler,F(xiàn)ilter,F(xiàn)ormatter;fileConfig則是通過(guò)一個(gè)文件進(jìn)行配置;而listen則監(jiān)聽(tīng)一個(gè)網(wǎng)絡(luò)端口,通過(guò)接收網(wǎng)絡(luò)數(shù)據(jù)來(lái)進(jìn)行配置。當(dāng)然,除了以上集體化配置外,也可以直接調(diào)用Logger,Handler等對(duì)象中的方法在代碼中來(lái)顯式配置。
  3. 使用logging模塊的全局作用域中的getLogger函數(shù)來(lái)得到一個(gè)Logger對(duì)象實(shí)例(其參數(shù)即是一個(gè)字符串,表示Logger對(duì)象實(shí)例的名字,即通過(guò)該名字來(lái)得到相應(yīng)的Logger對(duì)象實(shí)例)。
  4. 使用Logger對(duì)象中的debug,info,error,warn,critical等方法記錄日志信息。
Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第8張圖片

?

您的肯定就是我進(jìn)步的動(dòng)力。 如果你感覺(jué)還不錯(cuò),就請(qǐng)鼓勵(lì)一下吧!記得點(diǎn)波? 推薦? 哦?。。。c(diǎn)擊右邊的小球即可!( ^__^ ) 嘻嘻……)
Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第9張圖片

? ? ? ?個(gè)人公眾號(hào)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 微信群 ?(微信群已滿100,可以加宏哥的微信拉你進(jìn)群,請(qǐng)備注:進(jìn)群)? ? ? ? ??

Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第10張圖片 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Appium+python自動(dòng)化(三十一)- 元芳,你怎么看? - 日志收集-logging(超詳解)_第11張圖片

?

?

?


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦?。。?/p>

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 山西省| 大理市| 肥乡县| 松原市| 五河县| 柯坪县| 泽库县| 临西县| 杭锦旗| 呼图壁县| 富裕县| 吐鲁番市| 岚皋县| 大足县| 常山县| 克拉玛依市| 洛扎县| 辉县市| 法库县| 犍为县| 涟水县| 永宁县| 旌德县| 成武县| 察隅县| 固阳县| 高唐县| 中卫市| 库尔勒市| 塔河县| 汪清县| 泰安市| 安龙县| 望都县| 诸暨市| 张家口市| 普定县| 九龙坡区| 宁明县| 甘南县| 资兴市|