python3+Appium自动化10-日志收集
日志概述
日志作用
日志是定位问题的重要手段
日志级别
| 级别 | 何时使用 |
| DEBUG | 调试信息,也是最详细的日志信息 |
| INFO | 证明事情按预期工作 |
| WARNING | 表明发生了一些意外,或者不就的将来(如磁盘满了)。软件还是正常工作 |
| ERROR | 由于更严重的问题,软件已不能执行一些功能了 |
| CRITICAL | 严重错误,表明软件已不能继续运行了 |
日志需要按照info、debug、error等级别来进行区分。一般情况,普通的输出直接用info类型,调试时用debug类型,如果预计有错误需要用error类型的日志,一般情况info级别最为合适。
logging模块
简介
Python中的logging模块提供了通用的日志系统,这个模块提供不同的日志级别,并可以采用不同的方式记录日志
#导入logging模块
import logging
logging构成
- Logger 记录器,用于设置日志采集
- Handler 处理器,将日志记录发送至合适的路径
- Filter 过滤器,提供了更好的控制,它可以决定输出哪些日志记录
- Formatter 格式化器,指明了最终输出中日志的格式
Logger记录器
Logger是一个树形层级结构,在使用接口debug,info,warn,error,critical;使用之前必须创建Logger实例,即创建一个记录器,如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),Handler和Formatter。
方法:
basicConfig(**kwargs) 为日志记录系统做基本配置。
部分参数:
filename 指定日志文件名称
filemode 指定打开文件的模式,如果指定了filename(如果文件模式未指定,则默认为'a)
Tips:文件读写模式
- w 以写方式打开,
- W 文件若存在,首先要清空,然后(重新)创建
- a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
- r+ 以读写模式打开
- w+ 以读写模式打开 (参见 w )
- a+ 以读写模式打开 (参见 a )
format 为处理程序使用指定的格式字符串。
datefmt 使用指定的日期/时间格式。样式如果指定了格式字符串,则使用它来指定 格式字符串的类型.
level 将根记录器级别设置为指定级别。
演示代码如下:
import logging # logging.basicConfig(level=logging.DEBUG)
logging.basicConfig(level=logging.INFO)
# logging.basicConfig() logging.debug('debug info')
logging.info('hello log!')
logging.warning('warning info')
logging.error('error info')
logging.critical('critical info')
Handle处理器
Handler 处理器,将日志记录发送至合适的路径,Handler处理器类型有很多种,比较常用的有三个:
- StreamHandler
将日志记录输出发送到诸如sys.stdout,sys.stderr或任何类似文件流的对象。上面例子就是输出到控制台
- FileHanlder
将日志记录输出发送到磁盘文件。 它继承了StreamHandler的输出功能
logging.basicConfig(filename='runlog.log',level=logging.DEBUG)
- NullHandler
不做任何格式化或输出。 它本质上是一个开发人员使用的“无操作”处理程序。
Filter过滤器
Handlers和Loggers可以使用Filters来完成比级别更复杂的过滤。
Formatter
使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S
|
格式 |
描述 |
|
%(levelno)s |
打印日志级别的数值 |
|
%(levelname)s |
打印日志级别名称 |
|
%(pathname)s |
打印当前执行程序的路径 |
|
%(filename)s |
打印当前执行程序名称 |
|
%(funcName)s |
打印日志的当前函数 |
|
%(lineno)d |
打印日志的当前行号 |
|
%(asctime)s |
打印日志的时间 |
|
%(thread)d |
打印线程id |
|
%(threadName)s |
打印线程名称 |
|
%(process)d |
打印进程ID |
|
%(message)s |
打印日志信息 |
使用方法:
logging.basicConfig(level=logging.INFO,filename='runlog.log',
format='%(asctime)s %(filename)s[line:%(lineno)d]%(levelname)s%(message)s')
实战操作:log.py
#coding=utf-8
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
import yaml
#导入logging模块
import logging
import time 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')
logging.info('start app...') driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub', data) #检测跳过按钮
def check_skipBtn():
print('check skipBtn')
try:
skipBtn=driver.find_element_by_id("com.baozhenart.artmall:id/tv_skip")
except NoSuchElementException:
print('no skipBtn')
else:
skipBtn.click()
#检测是否有叉号
def check_closeBtn():
print('check closeBtn')
try:
closeBtn=driver.find_element_by_id("com.baozhenart.artmall:id/iv_close")
except NoSuchElementException:
print('no closeBtn')
else:
closeBtn.click()
check_skipBtn()
time.sleep(5)
check_closeBtn()
打印日志内容
2018-07-12 19:05:11,214 log.py[line:13]INFOstart app...
日志格式配置
将log输出格式,输出路径等参数抽离出来作为一个配置表,如下所示:
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
在需要调用的模块增加如下代码
import logging
import logging.config CON_LOG='log.conf'#定义配置表的名称,将其放在常量中
#fileConfig(fname, defaults=None, disable_existing_loggers=True)
# 该放在作用是从ConfigParser格式的文件中读取日志配置,同时如果当前脚本有配置log参数,则覆盖当前log配置选项
logging.config.fileConfig(CON_LOG)
#定义采集器
logging=logging.getLogger()
实战代码:
#coding=utf-8
from appium import webdriver
from selenium.common.exceptions import NoSuchElementException
import yaml
import time
#导入logging模块
import logging
import logging.config file=open('desired_caps.yaml','r')
data=yaml.load(file) CON_LOG='log.conf'#定义配置表的名称,将其放在常量中
#fileConfig(fname, defaults=None, disable_existing_loggers=True)
# 该放在作用是从ConfigParser格式的文件中读取日志配置,同时如果当前脚本有配置log参数,则覆盖当前log配置选项
logging.config.fileConfig(CON_LOG)
#定义日志采集器
logging=logging.getLogger() logging.info('start app...')
driver = webdriver.Remote('http://'+str(data['ip'])+':'+str(data['port'])+'/wd/hub', data) #检测跳过按钮
def check_skipBtn():
logging.info('check_skipBtn')
try:
skipBtn=driver.find_element_by_id("com.baozhenart.artmall:id/tv_skip")
except NoSuchElementException:
logging.info('no skipBtn')
else:
skipBtn.click()
#检测是否有叉号
def check_closeBtn():
logging.info('check closeBtn')
try:
closeBtn=driver.find_element_by_id("com.baozhenart.artmall:id/iv_close")
except NoSuchElementException:
logging.info('no closeBtn')
else:
closeBtn.click()
check_skipBtn()
time.sleep(5)
check_closeBtn()
python3+Appium自动化10-日志收集的更多相关文章
- python3+Appium自动化02-Capability配置
基本参数 参数 描述 实例 automationName 自动化测试引擎 Appium或 Selendroid platformName 手机操作系统 iOS, Android, 或 FirefoxO ...
- python3+Appium自动化13-H5元素定位实践案例
测试场景 启动钉钉app进入工作H5页面,点击考勤签到 查看webview上元素 1.电脑上打开chrome浏览器输入:chrome://inspect/#devices 2.Discover USB ...
- python3+Appium自动化12-H5元素定位环境搭建
前言 在混合开发的App中,经常会有内嵌的H5页面.那么这些H5页面元素该如何进行定位操作呢? 针对这种场景直接使用前面所讲的方法来进行定位是行不通的,因为前面的都是基于Andriod原生控件进行元素 ...
- python3+Appium自动化07-滑动操作以及滑动方法封装
滑动解析 滑动主要分为:水平滑动.垂直滑动.任意方向滑动 滑动轨迹 在Appium中模拟用户滑动操作需要使用swipe方法,该方法定义如下: def swipe(self, start_x, star ...
- python3+Appium自动化04-Toast元素识别
什么是toast? 如下图,“再按一次退出程序”,这就是toast 如何定位toast元素? Appium1.6.3开始支持识别Toast内容,主要基于UiAutomator2 想定位toast元素, ...
- python+Appium自动化:日志logging模块
日志级别 debug.info.warn.error.critical五个级别 logging模块构成(四部分) logger(记录器,用于日志采集) Handler(处理器,将日志记录发送到合适的路 ...
- python3+Appium自动化09-Capability配置数据分离实践
代码实现 参数配置表:desired_caps.yaml platformName: Android deviceName: 192.168.175.101:5555 platformVersion: ...
- python3+Appium自动化06-屏幕截图
截图方法 save_screenshot() 该方法直接保存当前屏幕截图到当前脚本所在文件位置 driver.save_screenshot('login.png') get_screenshot_a ...
- python3+Appium自动化03-Appium元素检测
需要导入方法NoSuchElementException from appium import webdriver from selenium.common.exceptions import NoS ...
随机推荐
- 使用Notepad++与Dev_c++编译
1. 安装Dev.打开DEV安装目录下的 D:\app\DevCpp\Dev-Cpp\MinGW64\bin(因人而异). 2.添加环境变量,测试. 将上述路径D:\app\DevCpp\Dev-Cp ...
- Python--详解TKinter类库
为了学习python3.5的tkinter,于是我去官网找了找相关部件的一些文档,读起来有点绕口,觉得还是自己来实践实践,看看视频感觉用处会更大,然后就有了下面的一部分常用的总结, 查看tkinter ...
- 高效配置Linux代理服务器 Squid介绍
作为一种免费的网络操作系统,Linux越来越受到广大网络爱好者的欢迎,目前Internet上运行的主机有相当一部分采用的就是Linux,而且中国已经把Linux作为政府上网的指定网络操作系统.种种迹象 ...
- 扒一扒spring,dom4j实现模拟实现读取xml
今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率.我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒 ...
- Visual Studio 2015安装插件
VS2015可以通过安装各种插件增强自己的功能! 插件安装方法: 下载插件后,打开VS2015,双击插件就会出现对应插件安装界面了,对应安装一下就可以了! 插件网址: https://marketpl ...
- [转]10分钟梳理MySQL知识点:揭秘亿级高并发数据库调优与最佳实践法则
转:https://mp.weixin.qq.com/s/RYIiHAHHStIMftQT6lQSgA 做业务,要懂基本的SQL语句: 做性能优化,要懂索引,懂引擎: 做分库分表,要懂主从,懂读写分离 ...
- Java Web之数据库连接池
数据库连接池 一.数据库连接池 1. 数据库连接池就是存放数据库连接(Connection)的集合 2. 我们获取一个数据库连接是一个相对很麻烦的过程,如果我们获取一个数据库连接,使用一次以后就给它关 ...
- Oracle中merge into语法
merge into 语句就是insert和update的一个封装,简单来说就是: 有则更新,无则插入 下面说怎么使用 MERGE INTO table_Name T1(匿名) using (另外一 ...
- linux模式切换,进程切换
内核态和用户态的切换: 用户态到内核态的转换:1.进行系统调用,2.异步中断,3.外部硬件中断 检查特权级别的变化:当异常发生在用户态,而异常处理函数则必须运行在内核态,则此时必须调用内核态的堆栈(系 ...
- 对DeepLung数据预处理部分的详细展示
之前有解释预处理部分的函数,不过觉得还不够详细,同时文字解释还不够直观,所以现在想一步步运行下,打印输出 首先读取原始数据,包括相应的注释(即结节标签)[注意]注释文件中的标签是按x,y,z的顺序给的 ...