干货 | 读懂 Appium 日志,让测试效率翻倍!

news2025/1/14 18:37:22

Appium 服务器运行时会产生很多日志,但是很多人并不了解其中的意义,也无法掌握有用的信息。本文将详细解读如何读懂 Appium 日志,并让你的测试效率翻倍。

开启服务

日志第一行显示了 Appium 版本和运行地址。

$ appium[Appium] Welcome to Appium v1.8.0-beta3 (REV 40e40975ebd3593d08c3f83de2546258f7ddf11d)[Appium] Appium REST http interface listener started on 0.0.0.0:4723

如果你在 Appium 上添加了参数,他们会在日志中展示,如果添加了 defaultCapabilities,日志也会显示出来。

Appium 参数:
http://appium.io/docs/en/writing-running-appium/server-args/
defaultCapabilities详见:
http://appium.io/docs/en/writing-running-appium/default-capabilities-arg/
$ appium --address 172.19.131.113 --port 8000 --default-capabilities '{"showIOSLog": true}'[Appium] Welcome to Appium v1.8.0-beta3 (REV 40e40975ebd3593d08c3f83de2546258f7ddf11d)[Appium] Non-default server args:[Appium] address: 172.19.131.113[Appium] port: 8000[Appium] defaultCapabilities: {[Appium] showIOSLog: true[Appium] }[Appium] Default capabilities, which will be added to each request unless overridden by desired capabilities:[Appium] showIOSLog: true[Appium] Appium REST http interface listener started on 172.19.131.113:8000

对于自动化测试来说,这个信息很重要,因为不同的 Appium 版本有不同的功能和问题,必须要知道自己的 Appium 版本。

创建 Session

为了自动化测试跑起来,session 要做很多事,日志提供了一些基本的 session 信息,特别是 desired capabilities 和 default capabilities。应该时刻注意 Appium 服务是否正确接收了请求内容,日志列出了创建 automation session(不懂 automation session 的看下面的链接)。

desired capabilities:
http://appium.io/docs/en/writing-running-appium/caps/
[Appium] Creating new XCUITestDriver (v2.68.0) session[Appium] Capabilities:[Appium] app: /Users/isaac/apps/UICatalog-iphonesimulator.app[Appium] platformName: iOS[Appium] platformVersion: 11.3[Appium] deviceName: iPhone 6[Appium] automationName: XCUITest[Appium] noReset: true[Appium] maxTypingFrequency: 30[Appium] clearSystemFiles: true[Appium] showXcodeLog: false[debug] [BaseDriver][debug] [BaseDriver] Creating session with MJSONWP desired capabilities: {"app":"/Users/isaac/code/a...

Appium 指令

Appium 是一个 REST 服务,接收 HTTP 请求,展示请求内容,返回某种结果。Appium 服务端日志用线和箭头展示了请求和返回的内容。在两个箭头之间是 Appium 服务端执行请求命令的日志信息:

什么是REST服务:
https://en.wikipedia.org/wiki/Representational_state_transfer
[HTTP] --> GET /wd/hub/status {}[debug] [MJSONWP] Calling AppiumDriver.getStatus() with args: [][debug] [MJSONWP] Responding to client with driver.getStatus() result: {"build":{"version":"1.8.0-beta3","revision":"30e7b45bdc5668124af33c41492aa5195fcdf64d"}}[HTTP] <-- GET /wd/hub/status 200121 ms - 126

错误排查

利用日志可以非常方便的排查错误,错误通常发生在 automation session 之后。但有时,如果 session 持续存在,错误也可能发生。所以第一步是找出错误在哪。

下面的例子可以看出,每个指令用 [HTTP] --> 和 [HTTP] <-- 标记。这些标记之间是指令细节,包含了错误输出:

[HTTP] --> POST /wd/hub/session<SNIP>[debug] [AndroidDriver] Shutting down Android driver[debug] [AndroidDriver] Called deleteSession but bootstrap wasn't active[debug] [Logcat] Stopping logcat capture[debug] [ADB] Getting connected devices...[debug] [ADB] 1 device(s) connected[debug] [ADB] Running '/home/user/Android/Sdk/platform-tools//adb' with args: ["-P",5037,"-s","ec8c4df","shell","am","force-stop","io.appium.unlock"][debug] [AndroidDriver] Not cleaning generated files. Add `clearSystemFiles` capability if wanted.[MJSONWP] Encountered internal error running command: Error: Cannot stop and clear com.company.app. Original error: Error executing adbExec. Original error: 'Command '/home/user/Android/Sdk/platform-tools//adb -P 5037 -s ec8c4df shell pm clear com.company.app' exited with code 1'; Stderr: 'Error: java.lang.SecurityException: PID 22126 does not have permission android.permission.CLEAR_APP_USER_DATA to clear data of package com.company.app'; Code: '1'at Object.wrappedLogger.errorAndThrow (../../lib/logging.js:63:13)at ADB.callee$0$0$ (../../../lib/tools/adb-commands.js:334:9)at tryCatch (/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:67:40)at GeneratorFunctionPrototype.invoke [as _invoke] (/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:315:22)at GeneratorFunctionPrototype.prototype.(anonymous function) [as throw] (/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:100:21)at GeneratorFunctionPrototype.invoke (/home/linuxbrew/.linuxbrew/lib/node_modules/appium/node_modules/babel-runtime/regenerator/runtime.js:136:37)at <anonymous>at process._tickCallback (internal/process/next_tick.js:188:7)[HTTP] <-- POST /wd/hub/session 500 40811 ms - 557

用户试图用 Android driver 启动一个 session,但发生了错误。Appium 为准备 session 而关掉并清除 AUT 时发现了错误,这个错误让我们知道两件事:

  1. Appium 正在尝试做什么

  1. 哪里出错了

在这个例子中,Appium 尝试运行 adb 命令(adb shell am force-stop),adb 参数在错误信息中也有显示。发生了 Android 系统权限错误。此时,我们可以手动运行这个 adb 命令,看看错误是不是可以重现。如果错误重现,上网查错吧!如果 adb 命令成功运行,可能是 Appium 的 bug,应该去 Github 的 issue 上查看或者提交这个 bug 。(例子中的错误是设备制造商的安全模型造成的)

这个例子只是众多错误中的一个,但它说明至关重要的一点,当错误发生时,日志可以提供更多的信息,如果没有完整的日志信息,对 Appium 排错难上加难。

可以改变日志输出的参数

通常,默认的日志内容已经足够,如果你想去 Github 上寻求帮助,信息当然越多越好!下面一些参数可以改变 Appium 服务端的日志行为:

  • --log-level - 改变Appium日志显示级别。

Appium 默认展示所有日志,它有以下一些选项:'info', 'info:debug', 'info:info', 'info:warn', 'info:error', 'warn', 'warn:debug', 'warn:info', 'warn:warn', 'warn:error', 'error', 'error:debug', 'error:info', 'error:warn', 'error:error', 'debug', 'debug:debug', 'debug:info', 'debug:warn', 'debug:error'。

  • --log-no-colors - 如果你的控制台没有颜色(日志可能会产生一些奇怪的字符,比如"TODO: find the color"),你可以用这个参数关闭颜色。

  • --log-timestamp - 在日志前添加时间戳,在排查超时错误时有奇效,展示如下:

2018-03-15 13:17:58:663 - [Appium] Welcome to Appium v1.8.0-beta3 (REV 30e7b45bdc5668124af33c41492aa5195fcdf64d)2018-03-15 13:17:58:664 - [Appium] Non-default server args:2018-03-15 13:17:58:665 - [Appium] logTimestamp: true2018-03-15 13:17:58:732 - [Appium] Appium REST http interface listener started on 0.0.0.0:4723

58appiumexecuting排查

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141315.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

曾经对程序员最好的公司,倒下了

硅谷有一家公司&#xff0c;它发明了同时代最好的CPU&#xff0c;最好的操作系统&#xff0c;最好的编程语言&#xff0c;但是由于傲慢和目光短浅&#xff0c;在短短二十多年间就走到了尽头。它就是Sun Microsystems&#xff0c;硅谷最让人惋惜的公司。1Sun的出现是个巧合。80年…

运动蓝牙耳机哪个品牌好、2023年最出色运动蓝牙耳机推荐

上班通勤、娱乐和运动时间都需要一款耳机的陪伴。相信音乐是许多健身爱好者锻炼时的必备&#xff0c;在枯燥的运动中用音乐分散注意力&#xff0c;不仅可以提高运动的积极性&#xff0c;还能让身体产生一种非常奇妙的愉悦感。不过&#xff0c;想要在运动中获得更好的聆听体验&a…

【图像处理OpenCV(C++版)】——3.2 几何变换之投影变换

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…

前端高频vue面试题总结

created和mounted的区别 created:在模板渲染成html前调用&#xff0c;即通常初始化某些属性值&#xff0c;然后再渲染成视图。mounted:在模板渲染成html后调用&#xff0c;通常是初始化页面完成后&#xff0c;再对html的dom节点进行一些需要的操作。 如何从真实DOM到虚拟DOM …

springboot 全局 Date参数接收 String格式 转换异常报错

报错&#xff1a; .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.util.Date from String "2022-12-13 11:22:11": not a v…

C语言实现c++对象和私有成员

C语言实现c对象和私有成员 C语言实现c对象 类是C中面向对象编程思想中比较重要的组成部分&#xff0c;与结构体一样类只是一个模板只有在创建对象时才会申请内存空间&#xff0c;类其实是把具有共同特性的数据或方法&#xff08;面向对象编程中&#xff0c;一般把函数称为方法…

录屏软件哪个好用?10个免费好用的「录屏软件」推荐

想知道如何录制自己的流媒体视频吗&#xff1f;有几个选项可以让您免费录制流媒体视频&#xff1a;桌面屏幕录像机、在线工具、浏览器扩展、iOS 应用程序和 Android 应用程序。 查看下表以获取有关不同直播流媒体录像机的更多信息&#xff1a;它们的主要用途和运行的操作系统。…

基于YOLOV5的火灾检测系统(含模型)+GUI界面

基于YOLOV5的火灾检测系统 本期我们带来的内容是基于YOLOV5的火灾检测系统&#xff0c;火灾检测系统还是比较有实际意义的&#xff0c;也方便大家在背景描述中展开。废话不多说&#xff0c;还是先看效果。 完整代码下载地址:基于YOLOV5的火灾检测系统&#xff08;含模型&…

MySQL高级 SQL优化【limitcountupdate优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;limit优化 1.2&#xff1a;count优化 1.2.1&#xff1a;概述 1.2.2&#xff1a;count用法 1.3&#xff1a;update优化 1&#xff1a;SQL优化 1.1&#xff1a;limit优化 在数据量比较大时&#xff0c;如果进行limit分页查询&a…

拉伯配资|战略新兴产业火了,高增长低估值股曝光

导读&#xff1a;2022年&#xff0c;A股商场值得记录的前史性大事件不断。这一年&#xff0c;A股商场上市公司数量正式打破5000家&#xff0c;战略新兴工业上市公司数量打破2500家&#xff0c;占比初次打破50%大关。这一年&#xff0c;A股商场顶住杂乱的外部环境要素&#xff0…

一文读懂:什么是CRM?企业如何通过CRM盈利?

今天和大家分享一篇干货文章&#xff0c;主要探讨什么是CRM&#xff0c;用大白话解释企业究竟如何通过CRM盈利。文章有点长&#xff0c;但看完&#xff0c;相信你会有所收获。 一、什么是CRM CRM——客户关系管理系统&#xff0c;它不仅是一个系统&#xff0c;一个技术解决方案…

云原生安全系列 4:6个 Kubernetes 安全最佳实践

引言&#xff1a; Kubernetes为我们提供了一套很好的核心软件安全原则&#xff0c;但我们仍然需要理解并实施它们。对于 Kubernetes 集群分布式部署&#xff0c;攻击向量的数量也会增加&#xff0c;了解并尽可能限制这些攻击面的最佳实践非常重要。 即使在使用托管的 Kuberne…

以系统思维推进零信任架构演进

声明 本文是学习零信任数据动态授权桔皮书. 下载地址 http://github5.com/view/55013而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 以工程化思维推进零信任架构演进 前文所述零信任数据动态授权能力&#xff0c;是围绕数据本身的库、表、字段构建安…

光点数据中台能干啥?怎么做?用在哪?_光点科技

如今&#xff0c;数据营销已经成为许多公司数字化转型的必要选择。数据中台的支持是企业中任何高层次的业务应用不可或缺的。数据中心面向的公司业务不再是单一业务线&#xff0c;而是从公司整体角度审视业务全景&#xff0c;寻找可重用的沉淀能力。 今天&#xff0c;让我们来了…

一个 Qml MenuBar 的问题

基本情况 使用 QQuick.Control 中的 MenuBar 实现主菜单栏。菜单栏包括 File、Edit、View、Help 菜单项。点击菜单项&#xff0c;会弹出对应的菜单。 ApplicationWindow {id: windowwidth: 320height: 260visible: truemenuBar: MenuBar {Menu {title: qsTr("&File&…

List集合

首先看这个框架图&#xff1a; List集合代表一个元素有序&#xff0c;可重复的集合&#xff0c;集合中每个元素都有对应的顺序索引。List接口中增加了一些根据索引操作元素的方法&#xff1a; void add(int index,E element ) 在列表的指定位置插入该元素。 boolean addAll(in…

【数据结构】LinkedList模拟实现与简单使用

文章目录模拟实现LinkedListLinkedList的简单使用LinkedList的一些方法LinkedList的遍历简单对比一下LinkedList和ArrayList模拟实现LinkedList 在上一篇的博客中&#xff0c;我们讲解了链表的基础知识&#xff0c;并且模拟实现了一个无头单向不循环链表&#xff0c;链表的基础…

12.动态内存

文章目录动态内存12.1动态内存和智能指针12.1.1shared_ptr类make_shared函数shared_ptr的拷贝和赋值shared_ptr自动销毁所管理的对象shared_ptr还自动释放相关联的内存使用了动态生存期的资源的类12.1.2直接管理内存使用new动态分配和初始化对象动态分配的const对象内存耗尽指针…

Java集合类ArrayList应用 | 如何在字符串s1中删除有在字符串s2出现的字符?

目录 一、题干 二、题解 1. 思路 ArrayList实现 2. 代码 ArrayList实现 StringBuilder实现-1 StringBuilder实现-2 三、总结 一、题干 面试的编程题&#xff1a; s1: "welcome to Zhejiang" s2: "come" 要求输出从字符串s1删除s2中存在的字符之后…

如何更好使用markdown输出pdf

如何更好的使用markdown输出PDF 背景&#xff1a;当前很多人比较常用的 markdown 编辑方式是用vscode编写&#xff0c;再使用 vscode 中 的 MPE 的进行预览。有时候会出现这种情况&#xff1a;想要最终输出PDF给客户&#xff0c;但是通过 vscode 中的markdown 转 PDF插件生成 P…