Hypium纯血鸿蒙系统 HarmonyOS NEXT自动化测试框架
1、什么是Hypium
Hypium是华为官方为鸿蒙操作系统开发的一款以python为语言的自动化测试框架。
引用华为官网介绍如下:
DevEco Testing Hypium(以下简称Hypium)是HarmonyOS平台的UI自动化测试框架,支持开发者使用python语言为应用编写UI自动化测试脚本,主要包含以下特性:
- Hypium提供了原生控件/图像/比例坐标等多种控件定位能力,支持多窗口操作以及触摸屏/鼠标/键盘等多种模拟输入功能,支持多设备并行操作,能够覆盖各类场景和多种形态设备上的自动化用例编写需求。
- Hypium包含配套用例编写辅助插件, 支持控件查看/投屏操作等多种用例开发辅助功能,提升用例开发体验和效率。
- Hypium能够为执行的用例生成详细的用例执行报告,并且自动记录设备日志以及执行步骤截图,为开发者和测试人员提供高效和专业的测试用例执行和结果分析体验。
2、环境安装
1、python环境
官网推荐使用python3.10版本
2、下载安装hdc
类似于Android的adb工具包,并配置环境变量
配置鸿蒙HDC环境(等价于 android 端的 adb)
下载 Command Line Tools 并解压
hdc文件在command-line-tools/sdk/HarmonyOS-NEXT-DB2/openharmony/toolchains目录下
配置环境变量,macOS 为例,在~/.bash_profile 或者 ~/.zshrc 文件中添加
export HM_SDK_HOME="/Users/develop/command-line-tools/sdk/HarmonyOS-NEXT-DB2" //请以sdk实际安装目录为准
export PATH=$PATH:$HM_SDK_HOME/hms/toolchains:$HM_SDK_HOME/openharmony/toolchains
export HDC_SERVER_PORT=7035
详情请参考DevEco Studio使用指南及调试工具-hdc
手机端也要先开启开发者选项,在设置--关于本机---软件版本,连点到出现开发者选项打开
然后到设置--系统--开发者选项--打开usb调试开关,并信任
配置完成可以在终端执行,hdc list targets 命令,如果能返回手机设备序列号,说明成功
3、Hypium安装
去
下载中心 | 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态,下载
在页面最底部下载Hypium安装包,解压后找到其中的其中的hypium-5.0.7.200.zip(请以实际版本号为准)。
解压后该文件后得到的4个tar.gz格式的pip安装包,使用pip install命令安装。
Hypium安装对xdevice有依赖,优先安装xdevice,以下版本号仅做示例,请以实际版本号为准。
pip install xdevice-5.0.7.200.tar.gz
pip install xdevice-devicetest-5.0.7.200.tar.gz
pip install xdevice-ohos-5.0.7.200.tar.gz
pip install hypium-5.0.7.200.tar.gz
pycharm安装hypium插件
如果使用的是pycharm高版本,需要去Other Versions - PyCharm
下载旧版本pycharm,新版还不兼容,已提交问题给官方,官方建议下载旧版本hypium,下载了一个不行。需要降低pycharm版本,当前使用的是2024-2版本
安装后重启pycahrm即可
4、创建工程
pycharm新建工程选择hypium插件,填写工程名称和位置即可创建新工程
3、框架了解
1、工程目录介绍
2、配置文件介绍
<?xml version="1.0" encoding="UTF-8"?>
<user_config><environment><!-- type: 设备连接方式,usb-hdc表示使用hdc命令控制设备(默认) --><device type="usb-hdc"><!-- ip: 远端设备地址,ip和port为空时使用本地设备,非空时使用远端设备 --><ip></ip> <!-- port: 远端设备端口号 --><port></port> <!-- sn: 设备SN号列表,SN之间用分号";"分隔,sn字段为空时使用所有本地设备,非空时使用指定的sn设备 --><sn></sn> </device></environment><testcases><!-- 指定测试用例目录,为空则默认设置为当前项目下的testcase文件夹 --><dir></dir></testcases><resource><!-- 指定资源目录,为空则默认设置为当前项目下的resource文件夹 --><dir></dir></resource><!-- 默认为INFO,如需更详细信息可设置为DEBUG --><loglevel>DEBUG</loglevel><devicelog><!--在测试用例结束后额外后拉取以下路径的日志到报告下--><dir>/data/log/tee;/data/log/test</dir><!--控制hilog日志等级,默认值为INFO--><loglevel>DEBUG</loglevel> <!--控制是否在拉取日志后设备端的日志,默认值为true--><clear></clear> <!--控制是否抓取设备日志,默认值为ON,OFF时候上述两个标签不生效--><enable>ON</enable> </devicelog>
</user_config>
3、测试用例介绍
Hypium测试用例由两部分组成,分别是测试用例配置文件以及测试用例文件。其中测试用例的形态分两种模式,单个用例模式(一个测试用例py文件,一个测试配置json文件)以及测试套模式(一个测试套py文件、N个测试用例py文件、一个测试配置json文件),开发者可以根据业务的需要自行选择开发模式。
两种模式可以理解为,单条用例执行,和多条用例执行。
测试用例的生命周期函数主要有三个,分别是setup、process、teardown
# !/usr/bin/env python
# coding: utf-8
"""
#!!================================================================
#版权 (C) 2023, Huawei Technologies Co.
#==================================================================
#文 件 名: Example.py
#文件说明: Example TestScript
#作 者: author
#生成日期: 2023-07-13
#!!================================================================
"""from devicetest.core.test_case import TestCase, Step
from hypium import *class Example(TestCase):def __init__(self, controllers):self.TAG = self.__class__.__name__TestCase.__init__(self, self.TAG, controllers)self.driver = UiDriver(self.device1)def setup(self):Step('1.回到桌面')self.driver.swipe_to_home()def process(self):Step('2.启动设置应用')self.driver.start_app(package_name="com.huawei.hmos.settings", page_name="com.huawei.hmos.settings.MainAbility")def teardown(self):Step('3.关闭设置应用')self.driver.stop_app("com.huawei.hmos.settings")
测试用例配置文件介绍
{"description": "Config for OpenHarmony app test suites",//environment字段主要描述测试用例需要的环境信息,如需要多少个设备"environment": [{"type": "device", //device表示OpenHarmony设备"label": "phone" //设备类型,phone为手机,tablet为平板,默认不填写则对设备无要求},{"type": "device", //多个设备时填写"label": "phone"}],// driver字段主要描述测试用例的测试驱动是什么,以及具体要执行的py脚本文件在哪(填写与当前json文件的相对路径即可)// 不填写则在当前json文件下寻找同名py文件// 注意:“py_file”字段当前只能填写一个py文件"driver": {"type": "DeviceTest","py_file": ["Test.py"]}
}
测试套生命周期及配置文件介绍
from devicetest.core.test_case import Step
from devicetest.core.suite.test_suite import TestSuite
class Testsuite1(TestSuite):# 测试套的前置步骤,会在所有的测试用例执行前先运行,对于批量测试用例有共同的前置步骤的诉求可以写在这def setup(self):Step("TestSuite: setup")# 测试套的清理步骤,会在所有测试用例执行完后运行def teardown(self):Step("TestSuite: teardown")
{"description": "Config for OpenHarmony app test suites",//environment字段主要描述测试用例需要的环境信息,如需要多少个设备"environment": [{"type": "device","label": "phone"}],// driver字段主要描述测试用例的测试驱动是什么,以及具体要执行的py脚本文件在哪(填写与当前json文件的相对路径即可)"driver": {"type": "DeviceTestSuite",// 指定测试套json文件对应的py文件路径(可以不加py后缀),可以为相对路径或者绝对路径,如果使用相对路径,需要指定相对测试工程根目录的路径。可以不指定,不指定则直接查找和当前json同目录下同名的py文件"testsuite": "TS_001/TS_001",//指定测试套中的测试用例列表,有两种方式//方式一,定义suitecases字段,然后明确定义好当前测试套下有哪些测试用例(相对路径或者是绝对路径,使用相对路径时根目录为测试套目录)"suitecases": ["XXX_001.py","/path/to/XXX_002.py"]//方式二,测试用例的py文件放在testsuite1文件夹中,并且命名以"TC_"开头,框架即可自动扫描所有用例并执行},// kits字段主要描述测试用例需要的测试公共kit,如pushkit、shellkit等"kits": []
}
测试用例的编写可以有两种方式。
第一种、框架自动扫描的测试用例脚本,需要满足以下规则。
- 与测试套py文件在同一个文件夹目录下;
- 文件名的开头必须是以“TC_”开头;
第二种、需要在json中指定py文件
4、测试用例执行
可以使用IDE执行单条用例,或多条用例,右键放到单条用例上执行单条,放到文件夹上执行当前目录下所有用例
命令行执行
打开命令行窗口,并进入到测试脚本工程的根目录;执行以下命令进入Hypium控制台,即可完成Hypium框架启动:
python -m hypium
Hypium框架指令可以分为三组:help、list、run
help查询命令使用,list指令用来展示设备和相关的任务信息
run指令主要用于执行测试任务
4、常用Api
Api类型
Hypium测试框架提供了两大类API来支持用例的编写。第一类是需要被测设备参数执行的API,第二类是无需被测设备,在PC端可独立调用的API。
设备相关的API主要包括四个基础API类:UiDriver,BY,UiComponent,UiWindow。
- UiDriver类为UI测试的入口,代表了一个被测设备,提供控件查找、控件检查、用户操作模拟、执行shell命令、安装卸载应用等等Ui测试核心能力。
- BY对象用于描述需要操作的控件属性,实现控件定位。
- UiComponent为UiDriver查找返回的控件对象,提供控件属性查询、控件点击、滑动查找等触控/检视能力。
- UiWindow为UiDriver查找返回的窗口对象,提供窗口属性查询、窗口拖动、大小调整等触控能力
from hypium import UiDriver,BY,UiComponent,UiWindow
from hypium.model import WindowFilter# 创建driver对象(self.device1对象在测试用例类中提供)
driver = UiDriver(self.device1)
# 查找控件
component = driver.find_component(BY.text("蓝牙"))
# 查找窗口
window = driver.find_window(WindowFilter().bundle_name("com.huawei.hmos.settings"))
设备无关的API当前主要包括两个基础API类: host 和CV。
- host 提供基础值断言, PC端shell命令执行等PC端基础操作能力。
- CV 提供图像查找,图像比较,压缩,清晰度计算等基础图像操作能力。
from hypium import host, CV# 执行PC端命令
echo = host.shell("a.bat")
# 调用图像接口
brightness = CV.calculate_brightness("/path/to/image.jpeg")
uiviewer使用
选择设备号,点击刷新和确定
元素定位
Hypium中的定位操作目标的方式主要分三大类型,包括控件属性定位,图片匹配定位以及比例坐标定位。根据操作目标的定位准确性,首选方式为控件属性定位,次选图片匹配定位。当无法使用前两类方式定位时,可以选择比例坐标定位操作目标。
属性定位
# 查找text属性为"控件文本"的控件
component = driver.find_component(BY.text("蓝牙"))
# 读取控件的的边框位置
bounds = component.getBounds()
# 直接点击控件
component = driver.touch(BY.text("蓝牙"))
# 点击text属性以`今天星期`开头的控件
driver.touch(BY.text("今天星期", MatchPattern.STARTS_WITH))# 点击文本为"蓝牙", 类型为"Button", 并且key为"bluetooth_switch"的按钮
driver.touch(BY.text("蓝牙").type("Button").key("bluetooth_switch"))# 同样,在查找以及其他可以传入BY对象的接口中可以使用相同的用法
component = driver.find_component(BY.text("蓝牙").type("Button").key("bluetooth_switch"))# 查找在text属性为"显示通知图标"的控件之后的type属性为"Button"的控件
component = driver.find_component(BY.type("Button").isAfter(BY.text("显示通知图标")))
# 查找在text属性为"账号"的控件之前的type属性为"Image"的控件
component = driver.find_component(BY.type("Image").isBefore(BY.text("账号")))
# 查找在key为"nav_container"内部的类型为"Image"的控件
component = driver.find_component(BY.type("Image").within(BY.key("nav_container")))
# 查找包名为"com.huawei.hmos.settings"的应用内部的text属性为"蓝牙"的控件
component = driver.find_component(BY.text("蓝牙").inWindow("com.huawei.hmos.settings"))xpath定位
# 查找上图中红框所示的图标,并点击
comp = driver.find_component(BY.xpath("//*[@text='可用 WLAN']/ancestor::List/ListItemGroup/ListItem[1]//Text/following::Image"))
comp.click()# 查找text属性为WLAN的控件
driver.find_component(BY.xpath("//*[@text='WLAN']"))
driver.find_all_components(BY.xpath("//*[@text='WLAN']"))
driver.wait_for_component(BY.xpath("//*[@text='WLAN']"))
# 点击text属性为WLAN的控件
driver.touch(BY.xpath("//*[@text='WLAN']"))查找多个元素
# 查找所有type属性为"Button"的控件, 如果有匹配的结果,components为列表,包含多个满足条件的UiComponent对象
components = driver.find_all_components(BY.type("Button"))
# 点击所有的控件
for component in components:driver.touch(component)
# 点击第2个控件
driver.touch(component[1])坐标定位
# 点击屏幕上(0.52 * 屏幕宽度, 0.98 * 屏幕高度)的位置
driver.touch((0.52, 0.98))
图片定位需要先安装opencv库
pip install opencv-python# 点击屏幕上和模板图片template.jpeg匹配的位置
driver.touch_image("/path/to/template.jpeg")# 查找屏幕上和模板图片template.jpeg匹配的位置, bounds为Rect类型,记录了控件上下左右边框的位置
bounds = driver.find_image("template.jpeg")
print(bounds.top, bounds.left, bounds.bottom, bounds.right)
窗口查找
# 查找标题为日历的窗口
window = driver.find_window(WindowFilter().title("日历"))
# 查找包名为com.ohos.calender,并且处于活动状态的窗口
window = driver.find_window(WindowFilter().bundle_name("com.ohos.calendar").actived(True))
# 查找处于活动状态的窗口
window = driver.find_window(WindowFilter().actived(True))
# 查找聚焦状态的窗口
window = driver.find_window(WindowFilter().focused(True))
元素操作
touch操作
# 点击文本为"hello"的控件
driver.touch(BY.text("hello"))
# 点击(100, 200)的位置
driver.touch((100, 200))
# 点击比例坐标为(0.8, 0.9)的位置
driver.touch((0.8, 0.9))
# 双击确认按钮(控件文本为"确认", 类型为"Button")
driver.touch(BY.text("确认").type("Button"), mode=UiParam.DOUBLE)
# 在类型为Scroll的控件上滑动查找文本为"退出"的控件并点击
driver.touch(BY.text("退出"), scroll_target=BY.type("Scroll"))
# 长按比例坐标为(0.8, 0.9)的位置
driver.touch((0.8, 0.9), mode="long")多指操作
# 执行多指点击操作, 同时点击屏幕(0.1, 0.2), (0.3, 0.4)的位置
driver.multi_finger_touch([(0.1, 0.2), (0.3, 0.4)])
# 执行多指点击操作, 设置点击按下时间为1秒
driver.multi_finger_touch([(0.1, 0.2), (0.3, 0.4)], duration=2)
# 查找Image类型控件
comp = driver.find_component(BY.type("Image"))
# 在指定的控件区域内执行多指点击(点击坐标为控件区域内的比例坐标)
driver.multi_finger_touch([(0.5, 0.5), (0.6, 0.6)], area=comp.getBounds())滑动
# 在屏幕上向上滑动, 距离40
driver.swipe(UiParam.UP, distance=40)
# 在屏幕上向右滑动, 滑动事件为0.1秒
driver.swipe(UiParam.RIGHT, swipe_time=0.1)
# 在屏幕起始点为比例坐标为(0.8, 0.8)的位置向上滑动,距离30
driver.swipe(UiParam.UP, 30, start_point=(0.8, 0.8))
# 在屏幕左边区域向下滑动, 距离30
driver.swipe(UiParam.DOWN, 30, side=UiParam.LEFT)
# 在屏幕右侧区域向上滑动,距离30
driver.swipe(UiParam.UP, side=UiParam.RIGHT)
# 在类型为Scroll的控件中向上滑动
driver.swipe(UiParam.UP, area=BY.type("Scroll"))精准滑动
# 从类型为Slider的控件滑动到文本为最大的控件
driver.slide(BY.type("Slider"), BY.text("最大"))
# 从坐标100, 200滑动到300,400
driver.slide((100, 200), (300, 400))
# 从坐标100, 200滑动到300,400, 滑动时间为3秒
driver.slide((100, 200), (300, 400), slide_time=3)
# 在类型为Slider的控件上从(0, 0)滑动到(100, 0)
driver.slide((0, 0), (100, 0), area = BY.type("Slider"))执行hdc命令# 执行hdc命令list targets
echo = driver.hdc("list targets")
# 执行hdc命令hilog, 设置30秒超时
echo = driver.hdc("hilog", timeout = 30)执行shell命令
# 在设备shell中执行命令ls -l
echo = driver.shell("ls -l")
# 在设备shell中执行命令top, 设置10秒超时时间
echo = driver.shell("top", timeout=10)安装卸载
# 安装路径为test.hap的安装包到手机
driver.install_app(r"test.hap")
# 替换安装路径为test.hap的安装包到手机(增加-r参数指定替换安装)
driver.install_app(r"test.hap", "-r")
driver.uninstall_app(driver, "com.ohos.devicetest")清除缓存
# 清除包名为com.tencent.mm的应用的缓存数据
driver.clear_app_data("com.tencent.mm")启动app/停止app
# 启动浏览器
driver.start_app("com.huawei.hmos.browser", "MainAbility")# 停止com.ohos.settings
driver.stop_app("com.ohos.settings")
断言
# 检查a等于b
host.check(a, b, "a != b")
# 检查a大于b
host.check_greater(a, b)# 检查类型为Button的控件存在
driver.check_component_exist(BY.type("Button"))
# 检查类型为Button的控件存在,如果不存在等待最多5秒
driver.check_component_exist(BY.type("Button"), wait_time=5)
# 在类型为Scroll的控件上滚动检查文本为"hello"的控件存在
driver.check_component_exist(BY.text("hello"), scroll_target=BY.type("Scroll"))
# 检查文本为确认的控件不存在
driver.check_component_exist(BY.text("确认"), expect_exist=False)# 检查id为xxx的控件的checked属性为True
driver.check_component(BY.key("xxx"), checked=True)
# 检查id为check_button的按钮enabled属性为True
driver.check_component(BY.key("checked_button"), enabled=True)
# 检查id为container的控件文本内容为正在检查
driver.check_component(BY.key("container"), text="正在检查")
# 检查id为container的控件文本内容不为空
driver.check_component(BY.key("container"), text="", expect_equal=False)# 检查图片存在
driver.check_image_exist("test.jpeg")
# 检查图片不存在
driver.check_image_exist("test.jpeg", expect_exist=False)
# 检查图片存在, 图片相似度要求95%, 重复检查时间5秒
driver.check_image_exist("test.jpeg", timeout=5, similarity=0.95)
# 检查图片不存在, 重复检查时间5秒
driver.check_image_exist("test.jpeg", timeout=5, expect_exist=False)
# 使用sift算法检查图片存在, 设置最少匹配特征点数量为16
driver.check_image_exist("test.jpeg", mode="sift", min_match_point=16)
5、小demo
# !/usr/bin/env python
# coding: utf-8
"""
#!!================================================================
#版权 (C) 2023, Huawei Technologies Co.
#==================================================================
#文 件 名: Example.py
#文件说明: Example TestScript
#作 者: author
#生成日期: 2023-07-13
#!!================================================================
"""
import timefrom devicetest.core.test_case import TestCase, Step
from hypium import *
from hypium.model import UiParamclass Example(TestCase):def __init__(self, controllers):self.TAG = self.__class__.__name__TestCase.__init__(self, self.TAG, controllers)self.driver = UiDriver(self.device1)def setup(self):Step('1.回到桌面')self.driver.swipe_to_home()def process(self):Step('2.启动设置应用')self.driver.start_app(package_name="com.huawei.hmos.settings", page_name="com.huawei.hmos.settings.MainAbility")//上滑40self.driver.swipe(UiParam.UP,40)//点击系统self.driver.find_component(BY.text("系统")).click()//返回self.driver.go_back()//下滑time.sleep(1)self.driver.swipe(UiParam.DOWN,40)//找到蓝牙控件点击进入lanYa = self.driver.find_component(BY.key("bluetooth_entry.title"))lanYa.click()//点击打开蓝牙开关lanYaKaiGuan = self.driver.find_component(BY.type("Toggle"))lanYaKaiGuan.click()//断言蓝牙开关是否打开self.driver.check_component(lanYaKaiGuan,checked=True)self.driver.go_back()def teardown(self):Step('3.关闭设置应用')self.driver.stop_app("com.huawei.hmos.settings")
6、报告及日志
执行完毕后,会在当前目录下生成对应的reports文件夹,打开对应的报告,下边有个summary_report.html文件用浏览器打开,可以查看日志
报告总结,可以看到多少成功和失败
每个用例详情,可以看到是哪一步出错了,还有具体截图和报错日志
相关文章:
Hypium纯血鸿蒙系统 HarmonyOS NEXT自动化测试框架
1、什么是Hypium Hypium是华为官方为鸿蒙操作系统开发的一款以python为语言的自动化测试框架。 引用华为官网介绍如下: DevEco Testing Hypium(以下简称Hypium)是HarmonyOS平台的UI自动化测试框架,支持开发者使用python语言为应用编写UI自动化测试脚本…...
李宏毅机器学习课程笔记01 | 1.Introduction of Machine/Deep Learning
笔记是在语雀上面做的,粘贴在CSND上可能存在格式错误 机器学习的本质就是借助机器寻找一个转换函数 根据函数的输出类型,可以将机器学习进行分类 regression 回归任务:函数输出时一个数值classification 分类任务:人类设定好选项…...
探索Docker Compose:轻松管理多容器应用
探索Docker Compose:轻松管理多容器应用 在现代软件开发中,容器化已经成为构建、部署和扩展应用的主流方式。而Docker Compose作为Docker生态系统的重要组成部分,可以简化多容器应用的管理。本文将深入探讨Docker Compose的核心功能及应用场…...
java中static和const和final的区别
static 关键字 static 关键字用于声明类的成员(方法或变量)为静态成员。静态成员属于类本身,而不是类的实例。换句话说,静态成员可以通过类名直接访问,而不需要实例化对象。 静态变量:属于类的所有对象共…...
[Win32/ATL]_[初级]_[处理WM_PAINT消息注意事项]
场景 在开发Win32/WTL程序时,遇到了使用CFolderDialog(atldlgs.h)打不开目录选择对话框的情况。具体表现是执行了窗口的DoModal,却没有窗口弹出来。 可以确定执行操作是在主线程,并不是工作线程。调试时暂停看堆栈,知道到DoModal方法里的SHB…...
【DevOps】Jenkins项目发布
Jenkins项目发布 文章目录 Jenkins项目发布前言资源列表基础环境一、Jenkins发布静态网站1.1、项目介绍1.2、部署Web1.3、准备gitlab1.4、配置gitlab1.5、创建项目1.6、推送代码 二、Jenkins中创建gitlab凭据2.1、创建凭据2.2、在Jenkins中添加远程主机2.3、获取gitlab项目的UR…...
Lua迭代器如何使用?
在Lua中,迭代器是一种用于遍历集合元素的重要工具。掌握迭代器的使用方法,对于提高Lua编程的效率和代码的可读性具有重要意义。 1.迭代器概述 12.1.1 迭代器介绍 迭代器是一种设计模式,它提供了一种访问集合元素的方法,而不需要…...
cesium小知识:3D tiles 概述、特点、示例
Cesium 的 3D Tiles 是一种高效的、流式传输的三维地理空间数据格式,专为在Web浏览器中快速渲染大规模三维场景而设计。3D Tiles 支持多种几何类型,包括点云、多边形、模型等,并且可以包含丰富的属性信息和层次细节(LOD, Level of Detail)结构,以确保不同设备和网络条件下…...
PTA DS 基础实验3-2.1 一元多项式求导
基础实验3-2.1 一元多项式求导 分数 20 全屏浏览 切换布局 作者 DS课程组 单位 浙江大学 设计函数求一元多项式的导数。 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 注意:…...
【玩转全栈】----用户管理案例
目录 案例需求: 成果显示: 源码展示: 部分源码解释及注意 1、info_list.html文件 2、info_add.html文件 3、models.py文件 4、views.py文件 经过前面的学习,相信您对Django、MySQL,以及他们之间的连接已经非常熟悉了&a…...
文件上传漏洞利用与绕过姿势总结
文章目录 攻击与绕过方式一、条件竞争二、二次渲染结合文件包含绕过1、gif2、png3、jpg 三、.htaccess解析绕过四、文件后缀名绕过1、文件特殊后缀名大小写绕过2、::$DATA绕过3、双后缀名绕过4、点绕过5、空格绕过 五、文件头绕过六、短标签绕过七、MIME(Content-Type)绕过八、…...
Java十六
2-9-1Request和Response介绍 Request继承体系 ServletRequest————Java提供的请求对象根接口 Http ServletRequest————Java提供的对Http协议封装的请求对象接口 RequestFacade————Tomcat定义的实现类 1.Tomcat需要解析请求数据,封装为request对象,并且创建requ…...
人工智能在事件管理中的应用
随着科技的不断发展,人工智能(AI)正在深入到各行各业,运维领域也不例外。在事件管理中,AI通过其强大的数据分析和自动化能力,帮助团队更高效地处理系统事件,提升业务的稳定性和用户体验。 什么是事件管理? 事件管理是IT运维的重要组成部分,其核心目标是快速响应和处…...
Launcher3版本确定
Launcher3有几个不同的版本,引入的代码和资源文件有所不同,我们需要确认当前设备中使用的是哪个 查看bp脚本可以看到会生成四个app /packages/apps/Launcher3$ grep -nr -E "android\_app\ \{" -A 1 ./Android.bp 184:android_app { 185- …...
算法题(25):只出现一次的数字(三)
审题: 该题中有两个元素只出现一次并且其他元素都出现两次,需要返回这两个只出现一次的数,并且不要求返回顺序 思路: 由于对空间复杂度有要求,我们这里不考虑哈希表。我们采用位运算的方法解题 方法:位运算 首先&#…...
atrust异常导致ERR_NETWORK_CHANGED
首先因为工作需要不断安装卸载不同版本深信服的atrust。那么可能遇到和我一样的问题。 深信服的这种东西有点毛病,以前只是偶尔导致我局域网无法访问,我停止atrust后,他还有后台程序在后台不断更改我的适配器,在我局域网需要固定…...
【Infineon AURIX】AURIX缓存(CACHE)变量访问指南
AURIX缓存变量访问指南 引言 本文分析Infineon AURIX控制器在调试过程中访问缓存内存变量的问题及解决方案重点探讨了变量缓存对调试的影响以及多种解决方法的优劣第1部分:问题描述与成因分析 主要症状 变量值发生变化,但实时内存访问显示初始值Watch窗口和Memory窗口中的变…...
轻量级通信协议 JSON-RPC 2.0 详解
目录 JSON-RPC 2.0 简介 请求对象 响应对象 通知 批量请求 错误码 使用场景 文档和版本控制 社区和支持 小结 参考资料 JSON-RPC 2.0 简介 JSON-RPC (JavaScript Object Notation - Remote Procedure Call) 是一种轻量级的远程过程调用协议,使用 JSON&am…...
[读书日志]从零开始学习Chisel 第一篇:书籍介绍,Scala与Chisel概述,Scala安装运行(敏捷硬件开发语言Chisel与数字系统设计)
简介:从20世纪90年代开始,利用硬件描述语言和综合技术设计实现复杂数字系统的方法已经在集成电路设计领域得到普及。随着集成电路集成度的不断提高,传统硬件描述语言和设计方法的开发效率低下的问题越来越明显。近年来逐渐崭露头角的敏捷化设…...
深入了解 StarRocks 表类型:解锁高效数据分析的密码
在当今数字化浪潮下,大数据分析成为企业决策、优化业务流程的关键利器。StarRocks 作为一款备受瞩目的高性能分析型数据库,其多样化的表类型为复杂的数据处理需求提供了精准解决方案。今天,就让我们一同深入探索 StarRocks 中的主键表、明细表…...
spring mvc源码学习笔记之四
pom.xml 内容如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/P…...
Spring Boot + Redis + Sa-Token
参考文献 Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)-腾讯云开发者社区-腾讯云 介绍 StpInterface 是 Sa-Token 框架中的一个接口,属于 Sa-Token 身份认证与授权框架的一部分。该接口提供了一些方法来实现自定义的身份认证和授权管…...
【顶刊TPAMI 2025】多头编码(MHE)之Part 6:极限分类无需预处理
目录 1 标签分解方法的消融研究2 标签分解对泛化的影响3 讨论4 结论 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https:…...
Spring Certified Professional 2024 (2V0-72.22)
关于认证 Spring Certified Professional (2V0-72.22) 认证可证明您在 Spring Framework 方面的专业知识,Spring Framework 是构建企业级 Java 应用程序的领先平台。此认证在全球范围内得到认可,并证明您在 Spring 的各个方面都具有熟练程度,…...
asp.net core框架搭建4-部署IIS/Nginx/Docker
文章目录 系列文章一、Linux上部署Nginx1.1 Centos 安装配置环境1.2 使用Systemctl 控制Nginx 二、部署IIS三、部署Docker3.1 创建 Dockerfile 文件3.2 构建 Docker 镜像3.3 运行 Docker 容器3.4 检查容器运行情况 结束语 作者:xcLeigh 文章地址:https:/…...
改善 Kibana 中的 ES|QL 编辑器体验
作者:来自 Elastic Marco Liberati 随着新的 ES|QL 语言正式发布,Kibana 中开发了一种新的编辑器体验,以帮助用户编写更快、更好的查询。实时验证、改进的自动完成和快速修复等功能将简化 ES|QL 体验。 我们将介绍改进 Kibana 中 ES|QL 编辑器…...
webpack5基础(上篇)
一、基本配置 在开始使用 webpack 之前,我们需要对 webpack 的配置有一定的认识 1、5大核心概念 1)entry (入口) 指示 webpack 从哪个文件开始打包 2)output(输出) 制视 webpack 打包完的…...
C#设计模式(行为型模式):观察者模式
C#设计模式:观察者模式,让对象间通信更优雅 在软件开发中,我们经常会遇到一个对象的状态发生改变,其他对象需要自动更新或做出相应反应的场景。例如: GUI事件处理: 当用户点击按钮时,按钮需要…...
pg_wal 目录下 wal 日志文件异常累积过大
文章目录 背景当前配置分析解决过程1. 活动事务未完成2. 备份滞后或归档未完成3. 保留了过多的 WAL 文件4. 逻辑复制槽未释放5. 文件系统问题6. 强制触发 WAL 清理结果lsof D 是啥意思检查进程从名字来看, 该 wal 文件是最小的文件(一般也是最老的 wal 文件)pg_archivecleanup …...
【人工智能】用Python实现深度卷积生成对抗网络(DCGAN):原理、实现与优化
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 深度卷积生成对抗网络(DCGAN)是一种结合了卷积神经网络(CNN)和生成对抗网络(GAN)的深度学习模型,广泛应用于图像生成、图像增强、以…...
领域驱动设计(4)—绑定模型与实现
(4)—绑定模型与实现 模式:MODEL-DRIVEN DESIGN为什么模型对用户至关重要?模式:HANDS-ON MODELER 很多项目设计之初只考虑到模型如何设计,没有将模型如何实现、数据关系如何存储这些实现考虑在内,往往设计…...
logback日志框架源码分析
目录 (一)入口:slf4j选择日志框架 (二)日志框架初始化 (1)logback的3种配置方式 a、BasicConfigurator默认配置 b、SPI方式配置的Configurator实现类 c、通过配置文件初始化 (2)xml配置文件初始化 (三)Logger的创建 (四)打印日志 本文源码基于:logback版…...
Airflow:HttpSensor实现API驱动数据流程
数据管道工作流通常依赖于api来访问、获取和处理来自外部系统的数据。为了处理这些场景,Apache Airflow提供了HttpSensor,这是一个内置的Sensor,用于监视HTTP请求的状态,并在满足指定条件时触发后续任务。在这篇博文中,…...
在Mac电脑上搭建Gradle
1. 检查是否已安装Homebrew 打开终端,输入以下命令检查Homebrew是否已安装: brew -v如果显示版本号,则表示已安装。如果未安装,请运行以下命令安装Homebrew: /bin/bash -c "$(curl -fsSL https://raw.githubus…...
登录的几种方式
使用Session完成登录 1. 手机号发送验证码 逻辑步骤: 校验手机号格式是否正确。生成验证码(例如使用Hutool工具类)。将手机号和验证码存入Session。返回验证码发送成功的响应。 2. 用户登录逻辑 逻辑步骤: 从Session中获取存…...
Python学习(5):数据结构
1 列表 1.1 列表方法 列表数据类型支持很多方法,列表对象的所有方法所示如下: list.append(x):在列表末尾添加一项。 类似于 a[len(a):] [x]。list.extend(iterable):通过添加来自 iterable 的所有项来扩展列表。 类似于 a[len…...
第五届电网系统与绿色能源国际学术会议(PGSGE 2025)
2025年第五届电网系统与绿色能源国际学术会议(PGSGE 2025) 定于2025年01月10-12日在吉隆坡召开。 第五届电网系统与绿色能源国际学术会议(PGSGE 2025) 基本信息 会议官网:www.pgsge.org【点击投稿/了解会议详情】 会议时间:202…...
【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机
目录 1 简单概括2 几个重要发现3 主要贡献4 背景知识5 方法简介 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https://gi…...
ruckus R510升级到Unleashe后不能访问
ruckus R510 是IPQ4019,升级到Unleashe,它弹窗提示 但是这个IP没办法用,访问不了AP。 必应了一下,官方提示用advance ip scanner扫描。 扫描持续好久,发现IP竟然是从主路由获得。 9090的端口不用填,甚至不…...
初学stm32 --- FSMC驱动LCD屏
目录 FSMC简介 FSMC框图介绍 FSMC通信引脚介绍 FSMC_NWE 的作用 FSMC_NWE 的时序关系 FSMC_NOE 的含义 FSMC_NOE 的典型用途 FSMC_NOE 的时序关系 使用FSMC驱动LCD FSMC时序介绍 时序特性中的 OE ILI9341重点时序: FSMC地址映射 HADDR与FSMC_A关系 LCD的…...
【2025最新计算机毕业设计】基于Spring Boot+Vue影院购票系统(高质量源码,提供文档,免费部署到本地)
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
Java 内存溢出(OOM)问题的排查与解决
在 Java 开发中,内存溢出(OutOfMemoryError,简称 OOM)是一个常见且棘手的问题。相比于数组越界、空指针等业务异常,OOM 问题通常更难定位和解决。本文将通过一次线上内存溢出问题的排查过程,分享从问题表现…...
Android14 CTS-R6和GTS-12-R2不能同时测试的解决方法
背景 Android14 CTS r6和GTS 12-r1之后,tf-console默认会带起OLC Server,看起来olc server可能是想适配ATS(android-test-station),一种网页版可视化、可配置的跑XTS的方式。这种网页版ATS对测试人员是比较友好的,网页上简单配置下…...
周末总结(2024/01/04)
工作 人际关系核心实践: 要学会随时回应别人的善意,执行时间控制在5分钟以内 坚持每天早会打招呼 遇到接不住的话题时拉低自己,抬高别人(无阴阳气息) 朋友圈点赞控制在5min以内,职场社交不要放在5min以外 职场的人际关系在面对利…...
《Rust权威指南》学习笔记(二)
枚举enum 1.枚举的定义和使用如下图所示: 定义时还可以给枚举的成员指定数据类型,例如:enum IpAddr{V4(u8, u8, u8, u8),V6(String),}。枚举的变体都位于标识符的命名空间下,使用::进行分隔。 2.一个特殊的枚举Option࿰…...
Docker 远程访问完整配置教程以及核心参数理解
Docker 远程访问完整配置教程 以下是配置 Docker 支持远程访问的完整教程,包括参数说明、配置修改、云服务器安全组设置、主机防火墙配置,以及验证远程访问的详细步骤。 1. 理解 -H fd:// 参数的作用(理解了以后容易理解后面的操作ÿ…...
在ros2 jazzy和gazebo harmonic下的建图导航(cartographer和navigation)实现(基本)
我的github分支!!! 你可以在这里找到相对应的源码。 DWDROME的MOGI分支 来源于!! MOGI-ROS/Week-3-4-Gazebo-basics 学习分支整理日志 分支概述 这是一个用于个人学习的新分支,目的是扩展基本模型并添加…...
常见的显示器分辨率及其对应的像素数量
显示器的像素数量通常由其分辨率决定,分辨率表示为水平像素数乘以垂直像素数。 720P(1280720): 像素数量:约92.16万特点:这是高清标准的一个分辨率,通常用于手机、平板电脑或小型显示器。900P&…...
浅谈分布式共识算法
分布式共识算法 基础概念1、容错2、共识3、拜占庭将军问题4、多数派5、共识算法分类6、ACID&BASE&CAP Paxos1、相关概念2、三种角色3、运行阶段4、Multi Paxos5、总结6、演化 ZAB1、相关概念2、三种角色3、成员状态4、运行阶段5、ZooKeeper流程6、总结 Raft1、相关概念…...
[Linux]redis5.0.x升级至7.x完整操作流程
1. 从官网下载最新版redis: 官网地址:https://redis.io/download 注:下载需要的登录,如果选择使用github账号登录,那么需要提前在github账号中取消勾选“Keep my email addresses private”(隐藏我的邮箱…...