【初级教程】Appium 启动应用 log 日志分析
刚开始学习 appium 时,老师给我布置了 appium 启动应用 log 分析的作业。由于工作比较忙,再者自己想先动手用 appium 写个公司的 app 的 UI 测试(目前简单的框架基本完成,在不断完善用例管理中)。写这篇文章是为了完成课堂作业,也为了让自己理清楚 appium 的运行原理。
启动 REST http 服务器,默认监听本地 4723 端口
这里可通过 ip 配置 appium server 的地址) 用于接收客户端(Test Case+Selenium/Appium Driver) 发送的 JSON 格式的 POST 请求
[Appium] Welcome to Appium v1.7.2
[Appium] Appium REST http interface listener started on 0.0.0.0:4723
脚本将 desiredCapabilities 参数 通过 post 请求发送到 Appium 服务器
[HTTP] --> POST /wd/hub/session {"desiredCapabilities":{"appActivity":"com.****.MainActivity","appPackage":"com.****.d","deviceName":"192.168.96.101:5555 ","platformName":"Android","platformVersion":"6.0","newCommandTimeout":0,"connectHardwareKeyboard":true}}
[MJSONWP] Calling AppiumDriver.createSession() with args: [{"appActivity":"com.****.MainActivity","appPackage":"com.****.d","deviceName":"192.168.96.101:5555 ","platformName":"Android","platformVersion":"6.0","newCommandTimeout":0,"connectHardwareKeyboard":true},null,null]
[BaseDriver] Event 'newSessionRequested' logged at 1520258266730 (21:57:46 GMT+0800 (中国标准时间))
[Appium] Creating new AndroidDriver (v1.37.0) session
[Appium] Capabilities:
[Appium] appActivity: com.****.MainActivity
[Appium] appPackage: com.****.d
[Appium] deviceName: 192.168.96.101:5555
[Appium] platformName: Android
[Appium] platformVersion: 6.0
[Appium] newCommandTimeout: 0
[Appium] connectHardwareKeyboard: true
[BaseDriver] The following capabilities were provided, but are not recognized by appium: connectHardwareKeyboard.
创建一个 session id
Android Sesision 用于跟客户端通信
[BaseDriver] Session created with session id: e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6
获取 Java 版本
[AndroidDriver] Getting Java version
[AndroidDriver] Java version is: 1.8.0_161
检查 adb 是否存在
通过配置的环境变量 ANDROID_HOME 去固定路径下查找
[ADB] Checking whether adb is present
[ADB] Using adb.exe from C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe
查找当前连接的设备,通过【adb devices】命令
[AndroidDriver] Retrieving device list
[ADB] Trying to find a connected android device
[ADB] Getting connected devices...
查询到一个设备连接,使用这个设备并设置 udid(唯一标识符)
[ADB] 1 device(s) connected
[AndroidDriver] Looking for a device with Android '6.0'
[ADB] Setting device id to 192.168.96.101:5555
获取设备的 Android 系统版本
[ADB] Getting device platform version
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","getprop","ro.build.version.release"]
[ADB] Current device property 'ro.build.version.release': 6.0
没有给出 APP 文件路径,将会运行软件包,先检查这个软件包是否存在,存在则继续
[AndroidDriver] App file was not listed, instead we're going to run com.****.d directly on the device
[AndroidDriver] Checking whether package is present on the device
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","list","packages","com.****.d"]
检查设备是否能够正常响应 adb 命令
通过【adb shell echo ping】来检查,设备能够正常响应打印出"ping"则认为设备正常,这里响应有个超时时间(默认是 5 秒)
[AndroidDriver] Starting Android session
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","wait-for-device"]
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","echo","ping"]
获取设备的语言或国家
[AndroidDriver] setDeviceLanguageCountry requires language or country.
[AndroidDriver] Got language: 'undefined' and country: 'undefined'
[Logcat] Starting logcat capture
在设备上安装 io.appium.settings,并检查是否安装
[AndroidDriver] Pushing settings apk to device...
[ADB] Getting install status for io.appium.settings
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","list","packages","io.appium.settings"]
[ADB] App is installed
[ADB] Getting package info for io.appium.settings
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","dumpsys","package","io.appium.settings"]
[ADB] Checking whether aapt is present
[ADB] Using aapt.exe from C:\Users\PigHead\AppData\Local\Android\Sdk\build-tools\27.0.3\aapt.exe
[ADB] The installed 'io.appium.settings' package does not require upgrade (5 >= 5)
获取 Android 系统 API 版本号
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","getprop","ro.build.version.sdk"]
[ADB] Current device property 'ro.build.version.sdk': 23
[ADB] Device API level: 23
查看 io.appium.setting 的系统信息和 dump 信息,并授予 io.appium.settings 访问权限 (允许改变网络连接状态、读写系统设置、创建模拟位置)
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","dumpsys","package","io.appium.settings"]
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","dump","io.appium.settings"]
[ADB] Got the following command chunks to execute: pm,grant,io.appium.settings,android.permission.CHANGE_NETWORK_STATE,;,pm,grant,io.appium.settings,android.permission.WRITE_SETTINGS,;,pm,grant,io.appium.settings,android.permission.ACCESS_MOCK_LOCATION,;
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","grant","io.appium.settings","android.permission.CHANGE_NETWORK_STATE",";","pm","grant","io.appium.settings","android.permission.WRITE_SETTINGS",";","pm","grant","io.appium.settings","android.permission.ACCESS_MOCK_LOCATION",";"]
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","appops","set","io.appium.settings","android:mock_location","allow"]
安装 io.appium.unlock,辅助设备解锁
[AndroidDriver] Pushing unlock helper app to device...
[ADB] Getting install status for io.appium.unlock
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","list","packages","io.appium.unlock"]
[ADB] App is installed
[ADB] Getting package info for io.appium.unlock
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","dumpsys","package","io.appium.unlock"]
[ADB] Checking whether aapt is present
[ADB] The installed 'io.appium.unlock' package does not require upgrade (2 >= 2)
获取设备的 Android 系统版本、屏幕尺寸,API 版本和屏幕分别率、生产商
[ADB] Getting device platform version
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","getprop","ro.build.version.release"]
[ADB] Current device property 'ro.build.version.release': 6.0
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","wm","size"]
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","getprop","ro.product.model"]
[ADB] Current device property 'ro.product.model': Custom Phone - 6.0.0 - API 23 - 768x1280
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","getprop","ro.product.manufacturer"]
[ADB] Current device property 'ro.product.manufacturer': Genymotion
强制停止与清理测试软件包
[AndroidDriver] No app sent in, not parsing package/activity
[AndroidDriver] No app capability. Assuming it is already on the device
[AndroidDriver] Running fast reset (stop and clear)
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","am","force-stop","com.****.d"]
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","pm","clear","com.****.d"]
建立 Appium Server 到设备上的 4724 端口转发,并开启设备上的基于 appiumbootstrap 的 socket 服务
[AndroidBootstrap] Watching for bootstrap disconnect
[ADB] Forwarding system: 4724 to device: 4724
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","forward","tcp:4724","tcp:4724"]
[UiAutomator] Starting UiAutomator
[UiAutomator] Moving to state 'starting'
[UiAutomator] Parsing uiautomator jar
[UiAutomator] Found jar name: 'AppiumBootstrap.jar'
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","push","C:\\Users\\PigHead\\AppData\\Local\\Programs\\appium-desktop\\resources\\app\\node_modules\\appium\\node_modules\\appium-android-bootstrap\\bootstrap\\bin\\AppiumBootstrap.jar","/data/local/tmp/"]
[ADB] Attempting to kill all uiautomator processes
[ADB] Getting all processes with uiautomator
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","ps"]
[ADB] No uiautomator process found to kill, continuing...[UiAutomator] Starting UIAutomator
[ADB] Creating ADB subprocess with args: ["-P",5037,"-s","192.168.96.101:5555","shell","uiautomator","runtest","AppiumBootstrap.jar","-c","io.appium.android.bootstrap.Bootstrap","-e","pkg","com.****.d","-e","disableAndroidWatchers",false,"-e","acceptSslCerts",false]
[UiAutomator] Moving to state 'online'
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] json loading complete.
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Registered crash watchers.
[AndroidBootstrap] Android bootstrap socket is now connected
[ADB] Getting connected devices...
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Client connected
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","dumpsys","window"]
[AndroidDriver] Screen already unlocked, doing nothing
[ADB] Device API level: 23
启动测试应用
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","am","start","-W","-n","com.****.d/com.****.MainActivity","-S"]
创建新的 AndroidDriver Session
[Appium] New AndroidDriver session created successfully, session e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6 added to master session list
[BaseDriver] Event 'newSessionStarted' logged at 1520258288513 (21:58:08 GMT+0800 (中国标准时间))
[MJSONWP] Responding to client with driver.createSession() result: {"platform":"LINUX","webStorageEnabled":false,"takesScreenshot":true,"javascriptEnabled":true,"databaseEnabled":false,"networkConnectionEnabled":true,"locationContextEnabled":false,"warnings":{},"desired":{"appActivity":"com.****.MainActivity","appPackage":"com.****.d","deviceName":"192.168.96.101:5555 ","platformName":"Android","platformVersion":"6.0","newCommandTimeout":0,"connectHardwareKeyboard":true},"appActivity":"com.****.MainActivity","appPackage":"com.****.d","deviceName":"192.168.96.101:5555","platformName":"Android","platformVersion":"6.0","newCommandTimeout":0,"connectHardwareKeyboard":true,"deviceUDID":"192.168.96.101:5555","deviceScreenSize":"768x1280","deviceModel":"Custom Phone - 6.0.0 - API 23 - 768x1280","deviceManufacturer":"Genymotion"}
[HTTP] <-- POST /wd/hub/session 200 21786 ms - 887
设置 Appium Driver 运行时的上下文
[HTTP] --> POST /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/context {"name":"NATIVE_APP"}
[MJSONWP] Calling AppiumDriver.setContext() with args: ["NATIVE_APP","e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6"]
获取当前的 WebView
[AndroidDriver] Getting a list of available webviews
[ADB] Getting connected devices...
[ADB] 1 device(s) connected
[ADB] Running 'C:\Users\PigHead\AppData\Local\Android\Sdk\platform-tools\adb.exe' with args: ["-P",5037,"-s","192.168.96.101:5555","shell","cat","/proc/net/unix"]
[AndroidDriver] Found webviews: []
[AndroidDriver] Available contexts: ["NATIVE_APP"]
[MJSONWP] Responding to client with driver.setContext() result: null
[HTTP] <-- POST /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/context 200 775 ms - 76
获取当前页面元素
appium 服务端接收 Get 请求,解析参数并将参数通过 4724 端口发送给 AndroidBootstrap,AndroidBootstrap 发送命令到 bootstrap,bootstrap 完成操作后,结果再逐层返回
[HTTP] --> GET /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/source {}
[MJSONWP] Calling AppiumDriver.getPageSource() with args: ["e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6"]
[AndroidBootstrap] Sending command to android: {"cmd":"action","action":"source","params":{}}
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got data from client: {"cmd":"action","action":"source","params":{}}
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command of type ACTION
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Got command action: source
[AndroidBootstrap] Received command result from bootstrap
[AndroidBootstrap] [BOOTSTRAP LOG] [debug] Returning result: {"status":0,"value":"<\/android.widget.LinearLayout><\/android.widget.LinearLayout><\/android.widget.LinearLayout><\/android.widget.ScrollView><\/android.widget.FrameLayout><\/android.widget.LinearLayout><\/android.widget.LinearLayout><\/android.widget.FrameLayout><\/android.widget.FrameLayout><\/android.widget.FrameLayout><\/hierarchy>"}
[MJSONWP] Responding to client with driver.getPageSource() result: "
[HTTP] <-- GET /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/source 200 804 ms - 5979
[HTTP] --> GET /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/screenshot {}
[MJSONWP] Calling AppiumDriver.getScreenshot() with args: ["e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6"]
[ADB] Device API level: 23
[MJSONWP] Responding to client with driver.getScreenshot() result: "iVBORw0KGgoAAAANSUhEUgAAAwAAAAUACAYAAADwUTW0AACAAElEQVR4AezBC7idZ0Hg+//7ft9a+5qd+z07TdMmpaFNiwUppIMM4SIKPopSvD0oHS3DVJQ51DPiUc9RB6aPd2EOczxTSz3jGX0KiAjCGaBVKVJogba09pKml7RJm/tlZ9/X+r73zN5xp02btHvvrLWT+P1/v7DuqmsTkiRJkiohIkmSJKkyIpIkSZIqIyJJkiSpMiKSJEmSKiMiSZIkqTIikiRJkiojIkmSJKkyIpIkSZIqI0eSJEn6Z3me0WwWtNof/Np72Lh+Naey85n9/OGffo6HH9uF2itHkiRJ0/bqyzeyaUM/mzasYc2KJfT1drFpQz/P9cAjTzEwOMLO3ft54JGdPPDIU3zznm2c7TZt6OeZvQc5dGSIVtu4fjUv39DPqfR2dTCvpxO1X44kSZJe1Juuuow3v+5y3vyvLqevt5uXsmlDP8dshLcyaWBwmC/dfg9f+uo9fPlr93K22bShn5XLFvLM3oPoX7aw7qprE5IkSTpBX283P/rW13DN1VtZs2IxrbRz9wFuuuVWPv3FOxgYHOZM27Shn5XLFjLhO/c/yqEjQ5yOP/i197Bx/Wqe6/z+ZXR3dnAqY+MNdu0+yMjYOFN2PrOff/u//V+otXIkSZJ0gl96z9u45uqt9PV20w5rVizmN37xaj5wzdv4o5s+zyc+eStnyqYN/axctpBW2rh+NS/f0M9MdNRrrF+7nOfq7epArZcjSZKkSVe+YiO/+6s/y5oVi5kLfb3d/MYvXs01V2/llz9yM9+4extzadOGflYuW4haY+WyhZy3eillmXhi5172HjjCTKxdtYT+lUsoypIndu5l977DtEOOJEmS+PX3X801V2/lTFizYjF/8dEP8kc3fY4//sTnmQubNvSzctlC/qVas2Ixn7/p15ipB7fv5Cd+8feZiXf/6L/mp3/4+7jwvBWEEJhQlCUPP7qLmz55K5/+4h28mF949w/wY299...
[HTTP] <-- GET /wd/hub/session/e400eb0c-4b20-4ddf-ac87-cdab8a3e9fa6/screenshot 200 226
下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础

资料获取方式 :

相关文章:
【初级教程】Appium 启动应用 log 日志分析
刚开始学习 appium 时,老师给我布置了 appium 启动应用 log 分析的作业。由于工作比较忙,再者自己想先动手用 appium 写个公司的 app 的 UI 测试(目前简单的框架基本完成,在不断完善用例管理中)。写这篇文章是为了完成…...
FANUC机器人SRVO-300机械手断裂故障报警原因分析及处理办法
FANUC机器人SRVO-300机械手断裂故障报警原因分析及处理办法 首先,我们查看报警说明书上的介绍: 总结:即在机械手断裂设置为无效时,机器人检测出了机械手断裂信号(不该有的信号,现在检测到了,所以报警) 使机械手断裂设定为无效/有效的具体方法: 按下示教器的MENU菜单…...
MobPush iOS SDK iOS实时活动
开发工具:Xcode 功能需要: SwiftUI实现UI页面,iOS16.1以上系统使用 功能使用: 需应用为启动状态 功能说明 iOS16.1 系统支持实时活动功能,可以在锁定屏幕上实时获知各种事情的进展,MobPushSDK iOS 4.0.3版本已完成适配…...
c++开发模式,组合模式
组合模式,顾名思义,通过组合关系定义类间的关联关系,实现了将对象组合成树形结构,最终实现类的复用。可能是由于设计模式看的多了,初看组合模式的类图,感觉和装饰者模式类图很相似,都是使用继承…...
【GITHUB】FlipIt – Windows的开源翻页时钟
FlipIt 是一款免费开源的翻页时钟应用,专为 Windows 平台设计。该应用灵感来源于备受喜爱的老牌翻页时钟应用 Fliqlo,后者被公认为经典的翻页时钟屏保。然而,由于 Fliqlo 是基于 Flash 技术开发的,随着微软最近正式禁用 Flash&…...
基于 Flink Paimon 实现 Streaming Warehouse 数据一致性管理
摘要:本文整理自字节跳动基础架构工程师李明,在 Apache Paimon Meetup 的分享。本篇内容主要分为四个部分: 背景 方案设计 当前进展 未来规划 点击查看原文视频 & 演讲PPT 一、背景 早期的数仓生产体系主要以离线数仓为主…...
云游戏App简记
注:在安卓手机端使用。其他端不做分析。 App手机游戏PC和主机游戏免费时长(手机游戏)是否排队备注咪咕快游支持。数量一般,和腾讯还有合作,有不少腾讯的游戏支持每日登录签到送30-60分钟,当天失效…...
ChatGPT已打破图灵测试,新的测试方法在路上
生信麻瓜的 ChatGPT 4.0 初体验 偷个懒,用ChatGPT 帮我写段生物信息代码 代码看不懂?ChatGPT 帮你解释,详细到爆! 如果 ChatGPT 给出的的代码不太完善,如何请他一步步改好? 全球最佳的人工智能系统可以通过…...
Flask学习笔记_异步CMS(五)
Flask学习笔记_异步CMS(五) 1.环境1.安装nvm2.安装node 2.使用vue-cli创建项目3.安装相关插件4.后台CMS开发1.页面结构1.app.vue搭建结构2.element-icon组件的使用3.iconfont组件的使用 2.使用[Vue-router](https://router.vuejs.org/installation.html)…...
争夺年度智能汽车「中间件」方案提供商TOP10,谁率先入围
进入2023年,整车电子架构升级进入新周期,无论是智能驾驶、智能座舱、车身控制还是信息网络安全,软件赋能仍是行业的主旋律。 作为智能汽车赛道的第三方研究咨询机构,高工智能汽车研究院持续帮助车企、投资机构挖掘具备核心竞争力…...
【Spring Cloud一】微服务基本知识
系列文章目录 微服务基本知识 系列文章目录前言一、系统架构的演变1.1单体架构1.2分层架构1.3分布式架构1.4微服务架构1.5分布式、SOA、微服务的异同点 二、CAP原则三、RESTfulRESTful的核心概念: 四、共识算法 前言 在实际项目开发过程中,目前负责开发…...
swift - 如何在数组大小更改后刷新 ForEach 显示元素的数量(SwiftUI、Xcode 11 Beta 5)
我正在尝试实现一个 View ,该 View 可以在内容数组的大小发生变化时更改显示项目的数量(由 ForEach 循环创建),就像购物应用程序可能会在用户下拉刷新后更改其可用项目的数量一样 这是我到目前为止尝试过的一些代码。如果我没记错的话,这些适…...
编程导航算法村第七关 |二叉树的遍历
编程导航算法村第七关 | 二叉树的遍历 前序遍历(递归) public List<Integer> preorderTraversal(TreeNode root) {ArrayList<Integer> result new ArrayList<Integer>();preorder(root, result);return result;}public void preorde…...
【docker】docker-compose安装带ui页面的kafka集群
docker-compose 安装带kafka-ui 的kafka集群 在日常的工作当中,kafka集群作为常用的中间件,其搭建过程略显繁琐,需要配置的文件颇多,为了方便各位初学者快速体验kafka的魅力,本文采取一键式安装kafka-3.3.1࿰…...
java实现多级菜单
/** * 查询所有菜单 */ public BaseWebResponse<Object> getAllMenus() { List<SystemMenuInfo> systemMenuInfoList menuInfoMapper.getAllMenus(); List<SystemMenuInfo> menuTree buildMenuTree(systemMenuInfoList); return setResultSuccess(&q…...
HTML中元素和标签有什么区别?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 标签(Tag)⭐元素(Element)⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&a…...
android 如何分析应用的内存(十三)——perfetto
android 如何分析应用的内存(十三) 本篇文章是native内存的最后一篇文章——perfetto perfetto简介 从2018年始,android开发者峰会正式推出perfetto工具。从此perfetto成为安卓最重要的工具之一。在2018年以前,android使用syst…...
Chapter20 音乐
目录 音乐 琴键 哆来咪 振动与调式 利萨如曲线 和声与音调与和弦 音乐 在音乐理论中,一个八音度(octave)是一个频率范围相差二倍的区间。在大多数西洋乐器中,一个八音度被分为12个频率比相等的半音程(semitone&a…...
详解Nodejs中的模块化
Nodejs是一个基于Chrome V8引擎的JavaScript运行时环境,它允许开发者使用JavaScript在服务器端运行代码。在Nodejs中,模块化是一种组织和重用代码的重要方式。模块化允许我们将代码拆分成小块,使得代码结构更清晰、易于维护,并促进…...
debug思路 - maven构建报错
问题:maven面板中,进行compile、deploy操作时报错。 debug步骤: 1、鼠标右键选择“修改运行配置”。在运行命令中添加参数-X,用于产生执行调试输出。例如:compile -f -X pom.xml。 2、再次进行compile、deploy操作&…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
