Appium日志乱码终结指北
缘起
最近Android,IOS自动化多开群控都搞好了,但是Appium中的log 显示中文乱码问题像个苍蝇一样,看着感觉特别难受,挥之不去,抚之不平。论坛搜索了一下,很多帖子都反映过这个问题,但是都没给出解决策略。不知道这些小 伙伴最终有没有解决。遂决定,吃个大闸蟹,研究一下看能否解决。
特别声明
本文只针对解决Jenkins集成后Appium的log日志中文乱码问题。桌面版本人1.8.1版的未发现乱码,如您桌面版的乱码,我也解决不 了。另外命令执行时受限于机器,环境,开发语言,执行姿势等多方面影响,如果参考本帖未能解决您的问题,真诚的对您说声非常抱歉。没能终结您的乱码问题, 牛逼吹大了 。
工程代码编码设置
- 设置自己工程代码字符编码为UTF-8
- 设置Maven打包编译jar的编码为UTF-8
Jenkins环境变量设置
简而言之一句话:管理员账号登录后,设置全局属性 LANG :zh.CH.UTF-8
设置位置:【系统管理】--->【系统设置】--->【全局属性】
Java启动参数设置
设置java执行的环境变量,也即如下执行testng时设置一个编码的参数
java -Dfile.encoding=UTF-8 -classpath /Users/iosTest.jar org.testng.TestNG /Users/mytestng.xml
如果经过以上的几步骚操作后,您的log中文不乱码了,那下面的可以忽略了。
Appium的log采集处理
由于要命令起Appium服务,写一个java调用CMD或者shell的共通类。执行命令时,输出命令返回的log也即Appium服务日志信息。在接受命令执行输出时设置一下编码:UTF-8。
废话少说,放码过来。
/**
* 命令执行器
* @author Zhang
*
*/
public class CommandExecutorImpl implements CommandExecutor {
static final Logger logger = LoggerFactory.getLogger(CommandExecutorImpl.class);
static ExecutorService pool = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 3L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
public ExecuteResult executeCommand(long timeout,String ... commands) {
Process process = null;
InputStream pIn = null;
StreamManger outputManger = null;
try {
if(commands == null || commands.length == 0){
logger.error("执行的命令行语句不能为空!");
return new ExecuteResult(9999,"执行的命令行语句不能为空");
}
process = Runtime.getRuntime().exec(commands);
final Process p = process;
p.waitFor(timeout, TimeUnit.MILLISECONDS);
p.getOutputStream().close();
pIn = process.getInputStream();
outputManger = new StreamManger(pIn);
outputManger.start();
return new ExecuteResult(0, "命令执行成功!");
} catch (Exception ex) {
String errorMessage = "命令:" + commands + "执行失败!";
logger.error(errorMessage, ex);
return new ExecuteResult(-1, null);
}
}
}
输入输出流管理控制器,这里其实还可以做更多操作,自由控制输出某些内容,或者不输出某些内容。
/**
* 输入输出流管理
* @author Zhang
*
*/
public class StreamManger extends Thread {
private static Logger logger = LoggerFactory.getLogger(StreamManger.class);
private InputStream inputStream;
/**
* 构造方法
* 实例化输入流
* @param in 输入流
*/
public StreamManger(final InputStream in) {
this.inputStream = in;
}
/**
* 打印输出
*/
@Override
public void run() {
try {
// 设置默认编码为UTF-8
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
logger.debug(line);
}
} catch (Exception ex) {
logger.trace("打印输出流失败:", ex);
} finally {
synchronized (this) {
notify();
}
}
}
}
日志输出
贴个图吧。不然说解决了Jenkins的appium日志中文乱码问题,肯定会有人不信。
安卓:
IOS:
附录appium命令参数地址
社区真伟大,由本论坛翻译Appium官网中文参数介绍。中文参数介绍传送门
后记
感谢社区,给予很多精神食粮,感谢大师们的无私奉献。解决问题的方法,就像平X的妹子的R沟,挤一挤总归还是有点的,多来论坛逛逛,多多学习,多动手实践,总会有解决的方向。
分享一下自己解决这个问题的方法,反哺一下和我一样low的兄弟们。方法比较挫,也许不能解决您的问题,轻喷谢谢!
Appium日志乱码终结指北的更多相关文章
- log4j输出日志乱码(转)
log4j日志文件乱码问题的解决方法 log4j日志文件中文乱码处理方法 log4j 控制台和文件输出乱码问题解决 写在前面,第三篇文章中将原因解释的最清楚,为什么设置为UTF-8或者GBK就生效了, ...
- 解决CentOS7中文乱码(包括Tomcat日志乱码)问题
Linux系统中文语言乱码,是很多小伙伴在开始接触Linux时经常遇到的问题,而且当我们将已在Wndows部署好的项目搬到Linux上运行,Tomcat的输出日志中文全为乱码(在Windows上正常) ...
- git宝典—应付日常工作使用足够的指北手册
最近公司gitlab又迁移,一堆git的命令骚操作,然鹅git命令,感觉还是得复习下——其实,git现在界面操作工具蛮多,比如intellij 自带的git操作插件就不错,gitlab github ...
- 【app】Appium日志文件分析
Appium在和客户端及手机端进行通讯的时候会输出很多日志,可以通过点击主面板的Get Raw Logs得到其原始日志: 现在我们另存到其他路径,并且以notepad工具打开进行查看 Appium日志 ...
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- Python 简单入门指北(一)
Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...
- 可能比文档还详细--VueRouter完全指北
可能比文档还详细--VueRouter完全指北 前言 关于标题,应该算不上是标题党,因为内容真的很多很长很全面.主要是在官网的基础上又详细总结,举例了很多东西.确保所有新人都能理解!所以实际上很多东西 ...
- 关于supervisor的入门指北
关于supervisor的入门指北 在目前这个时间点(2017/07/25),supervisor还是仅支持python2,所以我们要用版本管理pyenv来隔离环境. pyenv 根据官方文档的讲解, ...
- 关于Gevent的使用指北
关于Gevent的使用指北 只是看了入门指南,和一个翻译文档.写一下个人读书心得. 其实看完之后,第一个反映就是asyncio这个系统库,感觉gevent现在所做的一些事情是与asyncio很像的,但 ...
随机推荐
- base64位代码转图片文件并保存到文件夹的解决方案
#region Base64 转图片方法 protected string Base64StringToImage(string strbase64) { try { string imgurl = ...
- mysql学习笔记--go使用mysql
一. 连接数据库 a. //用户名:密码@[连接方式](主机名:端口号)/数据库名 db,_:=sql.Open("mysql","root:7758521123jf@( ...
- Centos6安装和配置etcd3
etcd 是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现.etcd 的灵感来自于 ZooKeeper 和 Doozer,侧重于: 简单:支持 curl 方式的用户 API ( ...
- CentOS7+CDH5.14.0安装全流程记录,图文详解全程实测-3禁止交换和禁用大页面
1.禁止交换(每台机器都要做): 执行命令:vim /etc/sysctl.conf 增加一行:vm.swappiness=0 执行命令:sudo sysctl vm.swappiness=0 2.禁 ...
- pythone函数基础(13)发送网络请求
需要导入urllib模块,request模块发送网络请求有两种方法 第一种方法# from urllib.request import urlopen# from urllib.parse impor ...
- redis单例模式
看到好多面试都问设计模式,我就简单的了解了一下,顺便把之前封装好的Reis做了一次修改. 单例模式(Singleton Pattern 单件模式或单元素模式) 单例模式确保某个类只有一个实例,而且自行 ...
- maven项目引用时,导入类报错,选择两个项目同时执行Maven update
maven项目引用时,导入类报错,选择两个项目同时执行Maven update springboot引入第三方jar,需要扫描时加@ComponentScan("第三方的包名") ...
- AD16 PCB重新定义板型时没有Redefine Board Shape
1.高版本的AD都没有“Redefine Board Shape” 2.在Keep-Out-Layer层,做好了板子的外形,把外形都选中后,然后快捷键D-S-D即可.
- 递归,re,time,random
递归函数 1.在函数中调用自己 2.超过递归的最大深度报错,递归的最大深度:998大概 3.递归的缺点:占内存 4.优点:代码简单 import sys sys.setrecursionlimit(2 ...
- APP支付(.NET版)
---恢复内容开始--- APP支付(.NET版) 一. 支付宝支付 1. 有一个支付账号,在蚂蚁金服开放平台中登录账号→选择“管理中心”→在“开发者中心”下选择“网页&移动应用”→然后按 ...