Python日志采集(詳細)

通常在前期調(diào)試代碼的時候咆耿,我們會使用print在IDE控制臺打印一些信息杆煞,判斷運行情況娩嚼。但在運行整個自動化測試項目的過程中,通過print打印信息的方式獲取運行情況顯然行不通滴肿。
這時就需要收集日志岳悟,每次運行后通過查看日志來獲取項目運行情況。那么我們該如何獲取日志泼差?

一贵少,日志概述

1,日志作用

在項目開發(fā)或測試過程中堆缘,項目運行一旦出現(xiàn)問題滔灶,記錄日志信息就顯得尤為重要。主要通過日志來定位問題吼肥,就好比偵探人員要根據(jù)現(xiàn)場留下的線索來推斷案情录平。

2麻车,日志級別

2.1,代碼在運行的過程中會出現(xiàn)不同的情況斗这,如調(diào)試信息动猬、警告信息、報錯等表箭,那么采集日志時就需要對這些日志區(qū)分級別管理赁咙,這樣才能更精確地定位問題。日志級別一般分類如下(以嚴重程度遞增排序):

級別 何時使用
DEBUG 調(diào)試信息免钻,也是最詳細的日志信息
INFO 證明事情按預期工作
WARNING 表明發(fā)生了一些意外彼水,或不久的將來會發(fā)生問題(如 磁盤滿了),軟件還是正常工作
ERROR 由于更嚴重的問題极舔,軟件已經(jīng)不能執(zhí)行一些工作了
CRITICAL 嚴重錯誤凤覆,表明軟件已經(jīng)不能繼續(xù)運行了

2.2,日志級別排序為:CRITICAL > ERROR > WARNING > INFO > DEBUG
日志采集時設置低級別的日志姆怪,能采集到更高級別的日志叛赚,但不能采集到更低級別的日志。
例如:設置的日志級別為info級別稽揭,就只能采集到info俺附、warning、error溪掀、critical級別的日志事镣,不能采集到debug級別的日志。設置的日志級別為debug級別的話則能采集到所有級別的日志揪胃。默認設置級別為WARNING璃哟。

2.3,在自動化測試項目中喊递,通常在一般情況時使用info日志随闪,預計報錯則使用error日志。

3骚勘,日志格式

將日志格式化是為了提高日志的可閱讀性铐伴,比如:時間+模塊+行數(shù)+日志級別+日志具體信息 的日志格式。如果輸出的日志信息雜亂無章俏讹,就不利于問題的定位当宴。如下所示就是日志格式化輸出,非常便于閱讀查看泽疆。

2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG this is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO this is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING this is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR this is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL this is critical message.

4户矢,日志位置

通常,在一個項目中會有很多的日志采集點殉疼,日志采集點的設置必須結(jié)合業(yè)務來確定梯浪。
比如在執(zhí)行修改登錄密碼用例前插入“開始執(zhí)行修改登錄密碼用例...”的日志信息捌年。再比如在登錄代碼執(zhí)行前可以插入“準備登錄...”日志信息。
如果在登錄完成后驱证,再設置登錄的提示日志就會給人造成誤解延窜,無法判斷到底是登錄之前的問題還是登錄之后的問題,因此日志采集點的位置很重要抹锄。

二逆瑞,logging模塊

1,簡介

logging為python自帶的日志模塊伙单,提供了通用的日志系統(tǒng)获高,包括不同的日志級別。logging可使用不同的方式記錄日志吻育,如使用文件念秧,HTTP GET/POST,SMTP布疼,Socket等方式記錄摊趾。通常情況下,我們使用文件記錄日志信息游两,文件格式一般為.txt或.log文件砾层。

2,文檔

詳細內(nèi)容可查看logging模塊官方文檔贱案,使用時需要導入:

import logging

三肛炮,logging第一種使用方法:簡單配置使用

1,使用方法

logging.basicConfig(**kwargs)

2宝踪,basicConfig()部分參數(shù)說明

filename 指定日志名稱或完整路徑侨糟,如:E:/app-ui-autotest/log/log.txt
filemode 指定打開文件的模式(如果文件打開模式未指定,則默認為'a')
常見的文件讀寫方式:

  • w 以寫的方式打開
  • W 清空后寫入(文件已存在)
  • r 以讀的方式打開
  • a 以追加模式打開(即在文件原有的數(shù)據(jù)后面添加)

format 指定日志輸出格式
level 將根記錄器級別設置為指定級別

3瘩燥,示例1:日志打印至控制臺

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

import logging

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

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

控制臺輸出結(jié)果:

2020-09-30 10:45:05,119 logging_test.py[line:7] DEBUG This is debug message.
2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.

4秕重,示例2:日志保存至文件

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

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')
logging.error('This is error message')
logging.critical('This is critical message')

輸出格式:

2020-09-30 10:45:05,119 logging_test.py[line:9] INFO This is info message.
2020-09-30 10:45:05,119 logging_test.py[line:11] WARNING This is warning message.
2020-09-30 10:45:05,120 logging_test.py[line:13] ERROR This is error message.
2020-09-30 10:45:05,120 logging_test.py[line:15] CRITICAL This is critical message.

注意
1,相較于控制臺打印日志厉膀,文件保存日志的區(qū)別在于basicConfig()方法中加入了filename參數(shù)(即文件的完整路徑)悲幅。

2,保存日志至文件示例中站蝠,因為參數(shù)level=logging.INFO,所以DEBUG級別的日志未輸出

四卓鹿,logging的第二種使用方式:日志流處理流程

1菱魔,logging四大組件介紹

logging模塊包括Logger,Handler吟孙,F(xiàn)ilter澜倦,F(xiàn)ormatter四個部分聚蝶。

  • Logger 記錄器,用于設置日志采集藻治。
  • Handler 處理器碘勉,將日志記錄發(fā)送至合適的路徑。
  • Filter 過濾器桩卵,提供了更好的粒度控制验靡,它可以決定輸出哪些日志記錄。
  • Formatter 格式化器雏节,指明了最終輸出中日志的格式胜嗓。

2,Logger 記錄器

使用日志流采集日志時钩乍,須先創(chuàng)建Logger實例辞州,即創(chuàng)建一個記錄器(如果沒有顯式的進行創(chuàng)建,則默認創(chuàng)建一個root logger寥粹,并應用默認的日志級別WARNING变过,Handler和Formatter),然后做以下三件事:

  • 為程序提供記錄日志的接口
  • 根據(jù)過濾器設置的級別對日志進行過濾
  • 將過濾后的日志根據(jù)級別分發(fā)給不同handler

3涝涤,Handler 處理器

Handler處理器作用是媚狰,將日志記錄發(fā)送至合適的路徑。如發(fā)送至文件或控制臺妄痪,此時需要使用兩個處理器哈雏,用于輸出控制臺的處理器,另一個是用于輸出文件的處理器衫生。通過 addHandler() 方法添加處理器 裳瘪。常用的處理器類型有以下兩種:

3.1,StreamHandler

3.1.1罪针,將日志信息發(fā)送至sys.stdout彭羹、sys.stderr或任何類似文件流對象,如在Pycharm IDE上顯示的日志信息泪酱。

3.1.2派殷,構(gòu)造函數(shù)為:StreamHandler(strm)。
參數(shù)strm是一個文件對象墓阀,默認是sys.stderr毡惜。

3.2,F(xiàn)ileHandler

3.2.1斯撮,將日志記錄輸出發(fā)送至磁盤文件经伙。 它繼承了StreamHandler的輸出功能,不過FileHandler會幫你打開這個文件勿锅,用于向一個文件輸出日志信息帕膜。

3.2.2枣氧,構(gòu)造函數(shù)為:FileHandler(filename, mode)。
參數(shù)filename為文件名(文件完整路徑)垮刹,參數(shù)mode為文件打開方式达吞,默認為'a'即在文末追加。

自動化測試使用這兩種類型就夠了荒典,其他還有RotatingFileHandler酪劫、TimedRotatingFileHandler、NullHandler等處理器种蝶,有興趣可以查找資料了解契耿。

4,F(xiàn)ilter 過濾器

顧名思義是用于過濾螃征,Handlers 與 Loggers 使用 Filters 可以完成比級別更復雜的過濾搪桂。不多做介紹,有興趣可以查找資料了解盯滚。

5踢械,F(xiàn)ormatter 格式化器

Formatter用于設置日志的格式與內(nèi)容,默認的時間格式為%Y-%m-%d %H:%M:%S魄藕,更多格式如下:

格式 描述
%(levelno)s 打印日志級別的數(shù)值
%(levelname)s 打印日志級別的名稱
%(pathname)s 打印當前執(zhí)行程序的路徑
%(filename)s 打印當前執(zhí)行程序的名稱
%(funcName)s 打印日志的當前函數(shù)
%(lineno)d 打印日志的當前行號
%(asctime)s 打印日志的時間
%(thread)d 打印線程ID
%(threadName)s 打印線程名稱
%(process)d 打印進程ID
%(message)s 打印日志信息

6内列,使用示例:將日志輸出至控制臺,同時保存至文件

根據(jù)logging的模塊化來編寫代碼背率,思路參考如下话瞧。

目錄結(jié)構(gòu)

logging_test.py

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

import logging

# 第一步,創(chuàng)建日志記錄器
# 1寝姿,創(chuàng)建一個日志記錄器logger
logger = logging.getLogger()
# 2交排,設置日志記錄器的日志級別,這里的日志級別是日志記錄器能記錄到的最低級別饵筑,區(qū)別于后面Handler里setLevel的日志級別
logger.setLevel(logging.DEBUG)

# 第二步埃篓,創(chuàng)建日志處理器Handler。這里創(chuàng)建一個Handler根资,用于將日志寫入文件
# 3架专,創(chuàng)建一個Handler,用于寫入日志文件玄帕,日志文件的路徑自行定義
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
# 4部脚,設置保存至文件的日志等級
fh.setLevel(logging.INFO)

# 第三步,定義Handler的輸出格式
# 5裤纹,日志輸出格式定義如下
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
# 6睛低,設置 寫入日志文件的Handler 的日志格式
fh.setFormatter(format)

# 第四步,將Handler添加至日志記錄器logger里
logger.addHandler(fh)

# 同樣的,創(chuàng)建一個Handler用于控制臺輸出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)

# 輸出日志
logger.info("This is info message")
logger.warning("This is warning message")
logger.error("This is error message")
logger.critical("This is critical message")

Pycharm運行l(wèi)ogging_test.py模塊钱雷,log.txt以及Pycharm控制臺得到如下結(jié)果:

2020-10-07 15:54:04,752 test.py[line:3] INFO This is info message
2020-10-07 15:54:04,752 test.py[line:4] WARNING This is warning message
2020-10-07 15:54:04,752 test.py[line:5] ERROR This is error message
2020-10-07 15:54:04,752 test.py[line:6] CRITICAL This is critical message

五,logging 實戰(zhàn)

1吹零,測試場景

給登錄今日頭條app的操作添加日志采集罩抗。

2,簡單配置代碼示例

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

import logging
from appium import webdriver

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

def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logging.info("啟動今日頭條APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver

def login_opera(driver):
    '''登錄今日頭條操作'''
    logging.info("開始登陸今日頭條APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
        driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“灿椅。套蒂。∶S迹”
        driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 輸入賬號
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 輸入密碼
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
    except Exception as e:
        logging.error("登錄錯誤操刀,原因為:{}".format(e))
    else:
        logging.info("登陸成功...")

driver = android_driver()
login_opera(driver)

登錄成功則日志輸出如下:

2020-09-30 18:20:05,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2020-09-30 18:20:10,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2020-09-30 18:21:07,120 logging_test.py[line:41] INFO 登陸成功...

3,拋出問題

上面示例代碼成功地獲取了日志信息婴洼,但這種寫法只能作用于當前模塊骨坑。而一個自動化測試項目往往有多個模塊,如果在每個需要獲取日志的模塊都使用這樣的方式柬采,顯然是不方便維護的欢唾。那么我們需要怎么解決呢?

4粉捻,解決思路

使用日志流處理流程礁遣。提供以下兩種思路:

思路1:使用python代碼實現(xiàn)日志配置。先創(chuàng)建日志記錄器肩刃,并設置好Handler與日志格式祟霍,如上面的logging_test.py模塊構(gòu)造logger,其他模塊采集日志時直接調(diào)用盈包。

思路2:將日志的格式沸呐、輸出路徑等參數(shù)抽離出來放置在專門的配置文件里,如logging.conf续语,使用專門的模塊處理球榆,使用時直接在模塊調(diào)用即可。

5撬呢,思路1:使用python代碼實現(xiàn)日志配置示例

目錄結(jié)構(gòu)

test.py中需要采集日志時员咽,從logging_test.py導入logger即可。也可以將logging_test.py里的代碼進行進一步的封裝力试,再調(diào)用徙邻,這里僅僅只是示例。
logging_test.py

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

import logging

# 創(chuàng)建日志記錄器
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

# 設置日志輸出格式
format= logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

# 創(chuàng)建一個Handler用于將日志寫入文件
logFile = './log.txt'
fh = logging.FileHandler(logFile, mode='a', encoding='utf-8')
fh.setLevel(logging.INFO)
fh.setFormatter(format)
logger.addHandler(fh)

# 同樣的畸裳,創(chuàng)建一個Handler用于控制臺輸出日志
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(format)
logger.addHandler(ch)

test.py

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

from appium import webdriver
from log.logging_test import logger

def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logger.info("啟動今日頭條APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver

def login_opera(driver):
    '''登錄今日頭條操作'''
    logger.info("開始登陸今日頭條APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
        driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“缰犁。。∷荩”
        driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 輸入賬號
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 輸入密碼
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
    except Exception as e:
        logger.error("登錄錯誤颇象,原因為:{}".format(e))
    else:
        logger.info("登陸成功...")

driver = android_driver()
login_opera(driver)

運行test.py,結(jié)果如下:

2020-10-07 18:45:05,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2020-10-07 18:45:11,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2020-10-07 18:45:20,120 logging_test.py[line:41] INFO 登陸成功...

6并徘,思路2:日志格式配置示例

6.1遣钳,logger.conf文件

[loggers]   # loggers日志器對象列表,必須包含
keys=root, exampleLogger    # 一定要包含root這個值麦乞,當使用無參函數(shù)logging.getLogger()時蕴茴,默認返回root這個logger,其他自定義logger可以通過logging.getLogger("exampleLogger")方式進行調(diào)用

[handlers] # handlers處理器對象列表姐直,必須包含
keys=consoleHandler, fileHandler    # 定義聲明handlers信息

[formatters] # formatters格式對象列表倦淀,必須包含
keys=form01,form02

[logger_root] # 對loggers中聲明的logger進行逐個配置,且要一一對應,在所有的logger中声畏,必須制定lebel和handlers這兩個選項撞叽。對于非roothandler,還需要添加一些額外的option砰识,如qualname能扒、propagate等。handlers可以指定多個辫狼,中間用逗號隔開初斑,比如handlers=fileHandler,consoleHandler,同時制定使用控制臺和文件輸出日志
level=DEBUG
handlers=consoleHandler, fileHandler

[logger_exampleLogger]  # 配置日志處理器exampleLogger:設置日志級別膨处、日志輸出指定的處理器配置文件见秤,如consoleHandler,fileHandler
level=DEBUG
handlers=consoleHandler, fileHandler
qualname=exampleLogger  # qualname 表示它在logger層級中的名字,在應用代碼中通過這個名字制定所使用的handler
propagate=0 # 可選項真椿,其默認是為1鹃答,表示消息將會傳遞給高層次logger的handler

[handler_consoleHandler]    # 日志處理器consoleHandler的配置文件
class=StreamHandler   # 定控制臺輸出。將日志消息發(fā)送到輸出到Stream突硝,如std.out, std.err或任何file-like對象
level=DEBUG   # 日志級別
formatter=form01    # 輸出格式
args=(sys.stdout,)

[handler_fileHandler]   # 日志處理器fileHandler的配置文件
class=FileHandler    # 將日志輸出至磁盤文件
level=DEBUG # 日志級別
formatter=form02    # 輸出格式
args=('./log.txt', 'a', 'UTF-8') # 參數(shù)如未設置絕對路徑测摔,則默認生成在執(zhí)行文件log.py的工作目錄。指定日志文件的打開模式解恰,默認為’a’

[formatter_form01]  # 格式配置1
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

[formatter_form02]  # 格式配置2
format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s

注意
1锋八,為了說明配置結(jié)構(gòu),這里的配置文件 logger.conf 里加了中文注釋护盈,實際使用時需要將注釋去掉或改寫成英文注釋挟纱,否則會報編碼錯誤。

2腐宋,配置文件中包含三大主要模塊:loggers紊服,handlers檀轨,formatters。這三個主要模塊包含的內(nèi)容都是通過keys進行指定欺嗤,然后通過logger_key参萄、handler_key、formatter_key對里面的key進行具體的設置煎饼。

3拧揽,配置handlers中的handler_consoleHandler的參數(shù):指定日志輸出到控制臺、級別腺占、輸出格式、參數(shù)痒谴。

4衰伯,配置handlers中的handler_fileHandlers的參數(shù):指定將日志輸出至磁盤文件、設置日志級別积蔚、輸出格式意鲸、參數(shù)等。

5尽爆,配置日志輸出格式formatter_xxx怎顾,可配置多個,如:form01漱贱,form02槐雾。

6.2,讀取配置文件幅狮,創(chuàng)建日志記錄器logger

baseLog.py

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

import logging.config

CON_LOG='./logger.conf' # 配置文件路徑
logging.config.fileConfig(CON_LOG)  # '讀取日志配置文件'
logger = logging.getLogger('exampleLogger') # 創(chuàng)建一個日志器logger

6.3募强,調(diào)用示例

目錄結(jié)構(gòu)如下

test.py

# -*- coding:utf-8 -*-
# @author: 給你一頁白紙

from appium import webdriver
from log.baseLog import logger

def android_driver():
    desired_caps = {
        "platformName": "Android",
        "platformVersion": "10",
        "deviceName": "PCT_AL10",
        "appPackage": "com.ss.android.article.news",
        "appActivity": ".activity.MainActivity",
        "unicodeKeyboard": True,
        "resetKeyboard": True,
        "noReset": True,
    }
    logger.info("啟動今日頭條APP...")
    driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
    return driver

def login_opera(driver):
    '''登錄今日頭條操作'''
    logger.info("開始登陸今日頭條APP...")
    try:
        driver.find_element_by_id("com.ss.android.article.news:id/cji").click() # 點擊【我知道了】
        driver.find_element_by_id("android:id/button1").click() # 點擊權(quán)限管理-確定按鈕
        driver.find_element_by_xpath("http://android.widget.TabWidget/android.widget.RelativeLayout[@index=3]").click() # 點擊未登錄
        driver.find_element_by_id("com.ss.android.article.news:id/a10").click() # 未登錄頁點擊登錄按鈕
        driver.find_element_by_id("com.ss.android.article.news:id/bgh").click() # 登錄頁點擊“。崇摄。擎值。”
        driver.find_element_by_xpath("http://android.widget.LinearLayout[@index=4]").click() # 選擇密碼登錄
        driver.find_element_by_id("com.ss.android.article.news:id/bu").send_keys("18768124236")   # 輸入賬號
        driver.find_element_by_id("com.ss.android.article.news:id/c5").send_keys("xiaoqq3915172")   # 輸入密碼
        driver.find_element_by_id("com.ss.android.article.news:id/a2o").click() # 點擊登錄
    except Exception as e:
        logger.error("登錄錯誤逐抑,原因為:{}".format(e))
    else:
        logger.info("登陸成功...")

driver = android_driver()
login_opera(driver)

控制臺鸠儿、log.txt輸出結(jié)果如下:

2020-10-07 19:30:35,119 logging_test.py[line:21] INFO 啟動今日頭條APP...
2020-10-07 19:30:40,119 logging_test.py[line:27] INFO 開始登陸今日頭條APP...
2020-10-07 19:31:12,120 logging_test.py[line:41] INFO 登陸成功...

7,總結(jié)

在實際使用python做自動化測試過程中兩種解決思路都可以使用厕氨,且都挺方便进每。其中對于思路1,還可以將代碼進行更進一步的封裝腐巢。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末品追,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子冯丙,更是在濱河造成了極大的恐慌肉瓦,老刑警劉巖遭京,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泞莉,居然都是意外死亡哪雕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鲫趁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斯嚎,“玉大人,你說我怎么就攤上這事挨厚”てВ” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵疫剃,是天一觀的道長钉疫。 經(jīng)常有香客問我,道長巢价,這世上最難降的妖魔是什么牲阁? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮壤躲,結(jié)果婚禮上城菊,老公的妹妹穿的比我還像新娘。我一直安慰自己碉克,他們只是感情好凌唬,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著棉胀,像睡著了一般法瑟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唁奢,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天霎挟,我揣著相機與錄音,去河邊找鬼麻掸。 笑死酥夭,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的脊奋。 我是一名探鬼主播熬北,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼诚隙!你這毒婦竟也來了讶隐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤久又,失蹤者是張志新(化名)和其女友劉穎巫延,沒想到半個月后效五,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡炉峰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年畏妖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼阔。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡戒劫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出婆廊,到底是詐尸還是另有隱情迅细,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布淘邻,位于F島的核電站疯攒,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏列荔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一枚尼、第九天 我趴在偏房一處隱蔽的房頂上張望贴浙。 院中可真熱鬧,春花似錦署恍、人聲如沸崎溃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽袁串。三九已至,卻和暖如春呼巷,著一層夾襖步出監(jiān)牢的瞬間囱修,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工王悍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留破镰,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓压储,卻偏偏與公主長得像鲜漩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子集惋,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344