『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
- 1 关于appium driver
- 2 安装appium driver
- 3 安装Appium Python Client
- 4 安装测试对象
- 5 获取测试对象信息
- 5.1 使用dumpsys
- 5.2 使用AndroidKiller
- 5.3 使用aapt
- 6 Capabilities详解
- 6.1 Capabilities介绍
- 6.2 automationName
- 6.3 platformName
- 6.4 platformVersion
- 6.5 deviceName
- 6.6 app
- 6.7 newCommandTimeout
- 6.8 noReset
- 6.9 fullReset
- 6.10 appPackage和appActivity
- 7 官方示例
- 8 测试示例
- 9 启动问题排查
- 9.1 urllib3 v2.0 only supports OpenSSL 1.1.1+
- 9.2 UnknownError: An unknown server-side error occurred
1 关于appium driver
- 在之前的文章我们已经完整的安装了
appium以及安装过程中相关问题的排查; - 我们启动下
appium的服务看看:
C:\Users\Administrator>appium
[Appium] Welcome to Appium v2.2.3
[Appium] Appium REST http interface listener started on http://0.0.0.0:4723
[Appium] You can provide the following URLs in your client code to connect to this server:
[Appium] http://172.16.1.33:4723/
[Appium] http://127.0.0.1:4723/ (only accessible from the same host)
[Appium] http://172.23.16.1:4723/
[Appium] No drivers have been installed in C:\Users\Administrator\.appium. Use the "appium driver" command to install the one(s) you want to use.
[Appium] No plugins have been installed. Use the "appium plugin" command to install the one(s) you want to use.

- 发现提示
appium driver没有安装,我们安装下吧; appium driver测试驱动是分开管理的,默认不会安装任何的测试驱动,通过appium driver子命令管理所有的驱动;- 官方可用的驱动如下:
C:\Users\Administrator>appium driver list- Listing available drivers
✔ Listing available drivers- uiautomator2 [not installed]- xcuitest [not installed]- mac2 [not installed]- espresso [not installed]- safari [not installed]- gecko [not installed]- chromium [not installed]
- 我们的环境是Android,所以需要安装下
uiautomator2,其他的按照情况来安装即可。
2 安装appium driver
- 我们使用以下
appium driver install uiautomator2命令安装,但是报错了:
C:\Windows\System32>appium driver install uiautomator2
- Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
× Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
Error: × Encountered an error when installing package: npm command 'install --save-dev --omit=peer --save-exact --global-style --no-package-lock appium-uiautomator2-driver --json' failed with code 1.STDOUT:
{"error": {"code": "ETIMEDOUT","summary": "request to https://registry.npmjs.org/appium-uiautomator2-driver failed, reason: ","detail": "This is a problem related to network connectivity.\nIn most cases you are behind a proxy or have bad network settings.\n\nIf you are behind a proxy, please make sure that the\n'proxy' config is set properly. See: 'npm help config'"
- 解决方法是修改npm的镜像源:
# 1.查看npm镜像设置
npm config get registry
# 2.将npm设置为淘宝镜像
npm config set registry https://registry.npm.taobao.org
# 3.再次查看npm镜像设置
npm config get registry

- 再次安装就成功了:
C:\Windows\System32>appium driver install uiautomator2- Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
√ Installing 'uiautomator2' using NPM install spec 'appium-uiautomator2-driver'
i Driver uiautomator2@2.34.2 successfully installed- automationName: UiAutomator2- platformNames: ["Android"]
3 安装Appium Python Client
Python Client针对不同的语言有不同的安装方法,我们使用的python版本的;- 关于appium的安装过程的步骤之前已经介绍,也可参考管放文档:Quickstart Intro;
- 安装
Appium Python Client:
pip install Appium-Python-Client
Successfully built Appium-Python-Client
Installing collected packages: sortedcontainers, urllib3, sniffio, pysocks, pycparser, idna, h11, certifi, attrs, wsproto, outcome, cffi, trio, trio-websocket, selenium, Appium-Python-Client
Successfully installed Appium-Python-Client-3.1.0 attrs-23.1.0 certifi-2023.11.17 cffi-1.16.0 h11-0.14.0 idna-3.6 outcome-1.3.0.post0 pycparser-2.21 pysocks-1.7.1 selenium-4.16.0 sniffio-1.3.0 sortedcontainers-2.4.0 trio-0.23.1 trio-websocket-0.11.1 urllib3-2.1.0 wsproto-1.2.0
4 安装测试对象
- 下载一个支持安卓6.0的
扣扣,因为我们模拟器是安卓6.0的; - 把下载的
扣扣传到模拟器中,本地保存在如下:
F:\monkey_test\QQv5.apk

- 我们先卸载之前装的:
adb uninstall com.tencent.mobileqqi

F:\monkey_test>adb uninstall com.tencent.mobileqqi
Success
- 重新安装:
adb install QQv5.apk /data/temp
F:\monkey_test>adb install QQv5.apk /data/temp
Performing Push Install
QQv5.apk: 1 file pushed, 0 skipped. 13.1 MB/s (22506899 bytes in 1.634s)pkg: /data/local/tmp/QQv5.apkver: /data/temp
Success
5 获取测试对象信息
- 以下有三种方式获取应用程序的信息;
- 我们需要获取的重要信息为:
当前app的包名和活动窗口名; - 三种方式都可以,选择自己方便的即可。
5.1 使用dumpsys
- 前提是需要先打开需要测试的
app; - 我们启动
APP后在命令行输入:
adb shell dumpsys | find "mFocusedActivity"
- 可以看到如下:
mFocusedActivity: ActivityRecord{54035c5 u0 com.tencent.mobileqqi/com.tencent.mobileqq.activity.InstallActivity t4}
- 那么重要信息有两个:
# 包名:com.tencent.mobileqqi
# 活动窗口名:com.tencent.mobileqq.activity.LoginActivity
5.2 使用AndroidKiller
AndroidKiller主要是对apk进行反编译操作获取相关信息;- 这里不说了,自行搜索吧。
5.3 使用aapt
- 这个相对来说会方便点,直接找到安装包的路径,使用命令查看即可;
- 比如我的安装包在本地的
F:\monkey_test下:
aapt dump badging QQv5.apk
- 查看的信息如下:
F:\monkey_test>aapt dump badging QQv5.apk
package: name='com.tencent.mobileqqi' versionCode='6062' versionName='5.1.1'
install-location:'auto'
sdkVersion:'7'
targetSdkVersion:'15'
uses-permission: name='com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.VIBRATE'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.CHANGE_CONFIGURATION'
uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='android.permission.SYSTEM_ALERT_WINDOW'
uses-permission: name='android.permission.RECORD_AUDIO'
uses-permission: name='com.tencent.msf.permission.account.sync'
uses-permission: name='android.permission.MODIFY_AUDIO_SETTINGS'
uses-permission: name='android.permission.CAMERA'
uses-permission: name='android.permission.CHANGE_WIFI_STATE'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.READ_PHONE_STATE'
uses-permission: name='android.permission.KILL_BACKGROUND_PROCESSES'
uses-permission: name='android.permission.CALL_PHONE'
uses-permission: name='com.android.launcher.permission.READ_SETTINGS'
uses-permission: name='com.android.launcher.permission.UNINSTALL_SHORTCUT'
uses-permission: name='android.permission.PERSISTENT_ACTIVITY'
uses-permission: name='android.permission.WRITE_SETTINGS'
uses-permission: name='android.permission.SEND_SMS'
uses-permission: name='android.permission.READ_SMS'
uses-permission: name='android.permission.GET_TASKS'
uses-permission: name='com.tencent.permission.VIRUS_SCAN'
uses-permission: name='android.permission.READ_LOGS'
uses-permission: name='android.permission.READ_CONTACTS'
uses-permission: name='android.permission.FLASHLIGHT'
uses-permission: name='android.permission.BLUETOOTH'
uses-permission: name='android.permission.BLUETOOTH_ADMIN'
uses-permission: name='android.permission.BROADCAST_STICKY'
uses-permission: name='android.permission.WRITE_CONTACTS'
uses-permission: name='android.permission.WRITE_OWNER_DATA'
uses-permission: name='android.permission.SYSTEM_OVERLAY_WINDOW'
uses-permission: name='android.permission.CHANGE_NETWORK_STATE'
uses-permission: name='com.android.launcher.permission.WRITE_SETTINGS'
uses-permission: name='com.android.launcher3.permission.READ_SETTINGS'
uses-permission: name='com.android.launcher3.permission.WRITE_SETTINGS'
uses-permission: name='com.htc.launcher.permission.READ_SETTINGS'
uses-permission: name='com.htc.launcher.permission.WRITE_SETTINGS'
uses-permission: name='com.huawei.launcher3.permission.READ_SETTINGS'
uses-permission: name='com.google.android.launcher.permission.READ_SETTINGS'
uses-permission: name='com.google.android.launcher.permission.WRITE_SETTINGS'
uses-permission: name='android.permission.READ_CALENDAR'
uses-permission: name='android.permission.WRITE_CALENDAR'
uses-permission: name='com.sonyericsson.home.permission.BROADCAST_BADGE'
uses-permission: name='com.sec.android.provider.badge.permission.READ'
uses-permission: name='com.sec.android.provider.badge.permission.WRITE'
uses-permission: name='android.permission.GET_ACCOUNTS'
uses-permission: name='android.permission.MANAGE_ACCOUNTS'
uses-permission: name='android.permission.AUTHENTICATE_ACCOUNTS'
uses-permission: name='android.permission.WRITE_CONTACTS'
uses-permission: name='android.permission.READ_SYNC_SETTINGS'
uses-permission: name='android.permission.WRITE_SYNC_SETTINGS'
uses-permission: name='android.permission.DISABLE_KEYGUARD'
uses-permission: name='android.permission.CHANGE_WIFI_MULTICAST_STATE'
uses-permission: name='com.qq.qcloud.permission.ACCESS_ALBUM_BACKUP_LIST'
uses-permission: name='com.android.vending.BILLING'
uses-permission: name='android.permission.RESTART_PACKAGES'
uses-permission: name='android.permission.NFC'
application-label:'QQi'
application-label-de:'QQi'
application-label-es:'QQi'
application-label-fr:'QQi'
application-label-ja:'QQi'
application-label-ko:'QQi'
application-label-zh-CN:'QQi'
application-label-zh-TW:'QQi'
application-icon-120:'R/m/hcw.png'
application-icon-160:'R/m/hcw.png'
application-icon-240:'R/m/hcw.png'
application-icon-320:'R/m/hcw.png'
application-icon-480:'R/m/hcw.png'
application-icon-65535:'R/m/hcw.png'
application: label='QQi' icon='R/m/hcw.png'
launchable-activity: name='com.tencent.mobileqq.activity.SplashActivity' label='QQi' icon=''
uses-library-not-required:'com.google.android.media.effects'
uses-library-not-required:'com.motorola.hardware.frontcamera'
uses-permission: name='com.tencent.photos.permission.DATA'
uses-permission: name='com.tencent.msf.permission.account.sync'
uses-permission: name='com.tencent.music.data.permission'
uses-permission: name='com.tencent.msf.permission.ACCOUNT_NOTICE'
uses-permission: name='android.permission.CHANGE_WIFI_STATE'
uses-permission: name='android.permission.INTERNET'
uses-permission: name='android.permission.ACCESS_WIFI_STATE'
uses-permission: name='android.permission.ACCESS_NETWORK_STATE'
uses-permission: name='android.permission.ACCESS_FINE_LOCATION'
uses-permission: name='android.permission.ACCESS_COARSE_LOCATION'
uses-permission: name='android.permission.CAMERA'
uses-permission: name='android.permission.READ_PHONE_STATE'
uses-permission: name='android.permission.WAKE_LOCK'
uses-permission: name='com.android.launcher.permission.INSTALL_SHORTCUT'
uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'
uses-permission: name='com.tencent.msg.permission.pushnotify'
uses-permission: name='com.tencent.msf.permission.account.sync'
uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission: name='android.permission.READ_EXTERNAL_STORAGE' reason='requested WRITE_EXTERNAL_STORAGE'
uses-permission: name='android.permission.READ_CALL_LOG'
uses-implied-permission: name='android.permission.READ_CALL_LOG' reason='targetSdkVersion < 16 and requested READ_CONTACTS'
uses-permission: name='android.permission.WRITE_CALL_LOG'
uses-implied-permission: name='android.permission.WRITE_CALL_LOG' reason='targetSdkVersion < 16 and requested WRITE_CONTACTS'
feature-group: label=''uses-feature-not-required: name='android.hardware.camera'uses-feature-not-required: name='android.hardware.camera.autofocus'uses-feature-not-required: name='android.hardware.location'uses-feature-not-required: name='android.hardware.location.gps'uses-feature-not-required: name='android.hardware.location.network'uses-feature-not-required: name='android.hardware.telephony'uses-feature: name='android.hardware.bluetooth'uses-implied-feature: name='android.hardware.bluetooth' reason='requested android.permission.BLUETOOTH permission, requested android.permission.BLUETOOTH_ADMIN permission, and targetSdkVersion > 4'uses-feature: name='android.hardware.faketouch'uses-implied-feature: name='android.hardware.faketouch' reason='default feature for all apps'uses-feature: name='android.hardware.microphone'uses-implied-feature: name='android.hardware.microphone' reason='requested android.permission.RECORD_AUDIO permission'uses-feature: name='android.hardware.screen.portrait'uses-implied-feature: name='android.hardware.screen.portrait' reason='one or more activities have specified a portrait orientation'uses-feature: name='android.hardware.wifi'uses-implied-feature: name='android.hardware.wifi' reason='requested android.permission.ACCESS_WIFI_STATE permission, requested android.permission.CHANGE_WIFI_MULTICAST_STATE permission, and requested android.permission.CHANGE_WIFI_STATE permission'
main
other-activities
other-receivers
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'de' 'es' 'fr' 'ja' 'ko' 'zh-CN' 'zh-TW'
densities: '120' '160' '240' '320' '480' '65535'
native-code: 'armeabi'
- 需要的重要信息为:
name='com.tencent.mobileqqi'launchable-activity: name='com.tencent.mobileqq.activity.SplashActivity'
- 如果
aapt提示找不到命令,需要把它的安装路径加入到系统环境变量中,aapt的路径在:
D:\android-sdk-windows\build-tools\29.0.3

6 Capabilities详解
6.1 Capabilities介绍
-
Capabilities是启动appium服务端的参数设置; -
关于
Capabilities可以参考官方文档:Appium capabilities;

-
以下重点了解几个
Capabilities参数。
6.2 automationName
automationName表示自动化测试引擎,好比测试驱动一样;- 可供选择的有
Appium、Selendriod、uiautomator2等; - 本文及后续都使用的是
uiautomator2。
6.3 platformName
platformName表示手机或模拟器使用的操作系统;- 一般包括
iOS、Android等; - 本文使用
Android。
6.4 platformVersion
platformVersion表示真机或模拟器操作系统的版本;- 本文为
Android6.0。
6.5 deviceName
deviceName表示使用的测试设备类型;- 可以使用
adb devices查看设备类型名称:
C:\Windows\System32>adb devices
List of devices attached
emulator-5554 device
- 比如我的是
emulator-5554。
6.6 app
app表示安装包;- 如果指定这个参数就会把指定的
app安装到指定的路径。
6.7 newCommandTimeout
newCommandTimeout表示两条Appium命令间的最长时间间隔;- 如果超时,会自动退出
app。
6.8 noReset
noReset表示不需要在会话前重置应用状态;- 默认为
false。
6.9 fullReset
fullReset可通过卸载而不清空数据来重置应用状态;- 默认为
false。
6.10 appPackage和appActivity
- 启动待测试
app的appPackage和appActivity; appPackage是app的包名;appActivity是app的活动窗口名;- 这两个参数的获取已经在第五章节说明了。
还有几个参数,这个不一一说明了,直接看官方文档即可。
7 官方示例
- 以下这个是官方的一个示例,是
python版本的;
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBycapabilities = dict(platformName='Android',automationName='uiautomator2',deviceName='Android',appPackage='com.android.settings',appActivity='.Settings',language='en',locale='US'
)appium_server_url = 'http://localhost:4723'class TestAppium(unittest.TestCase):def setUp(self) -> None:self.driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))def tearDown(self) -> None:if self.driver:self.driver.quit()def test_find_battery(self) -> None:el = self.driver.find_element(by=AppiumBy.XPATH, value='//*[@text="Battery"]')el.click()if __name__ == '__main__':unittest.main()
8 测试示例
- 这里我们写一个我们自己的测试示例;
- 之前我们已经安装了测试对象
扣扣,且已经获取到了它的相关信息; - 我们启动
appium服务,直接在命令行输入appium即可:

- 设计如下脚本:
# -*- coding:utf-8 -*-
# 作者:虫无涯
# 日期:2023/12/12
# 文件名称:test_qq.py
# 作用:appium启动一个应用程序
# 联系:VX(NoamaNelson)
# 博客:https://blog.csdn.net/NoamaNelsonfrom appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
import timecapabilities = dict(platformName='Android',automationName='uiautomator2',deviceName='emulator-5554',appPackage='com.tencent.mobileqqi',appActivity='com.tencent.mobileqq.activity.SplashActivity',language='en',locale='US'
)print("start....")
# 创建driver对象
appium_server_url = 'http://localhost:4723'
driver = webdriver.Remote(appium_server_url, options=UiAutomator2Options().load_capabilities(capabilities))# 启动应用程
print(driver.capabilities)
# driver.launch_app()time.sleep(1)
print("已经连接到模拟器了~")driver.quit()
- 执行脚本:
D:\Python37\python.exe F:/python_study/appium_test/test_qq.py
start....
{'platformName': 'Android',
'automationName': 'uiautomator2',
'deviceName': 'emulator-5554',
'appPackage': 'com.tencent.mobileqqi',
'appActivity': 'com.tencent.mobileqq.activity.SplashActivity',
'language': 'en',
'locale': 'US',
'platform': 'LINUX',
'webStorageEnabled': False,
'takesScreenshot': True,
'javascriptEnabled': True,
'databaseEnabled': False,
'networkConnectionEnabled': True,
'locationContextEnabled': False,
'warnings': {},
'desired': {'platformName': 'Android', 'automationName': 'uiautomator2', 'deviceName': 'emulator-5554', 'appPackage': 'com.tencent.mobileqqi', 'appActivity': 'com.tencent.mobileqq.activity.SplashActivity', 'language': 'en', 'locale': 'US'},
'deviceUDID': 'emulator-5554', 'pixelRatio': '2', 'statBarHeight': 48, 'viewportRect': {'left': 0, 'top': 48, 'width': 768, 'height': 1136},
'deviceApiLevel': 23, 'platformVersion': '6.0', 'deviceManufacturer': 'unknown', 'deviceModel': 'sdk_phone_armv7', 'deviceScreenSize': '768x1280', 'deviceScreenDensity': 320}
已经连接到模拟器了~
- 这时候
appium的服务端也给出了启动信息:
[AndroidUiautomator2Driver@455c (f190abfc)] Proxying [DELETE /] to [DELETE http://127.0.0.1:8200/session/f9cc13f6-4c4e-4ab5-a2eb-8dfb44f05100] with no body
[AndroidUiautomator2Driver@455c (f190abfc)] Got response with status 200: {"sessionId":"f9cc13f6-4c4e-4ab5-a2eb-8dfb44f05100","value":null}
[ADB] Running 'D:\android-sdk-windows\platform-tools\adb.exe -P 5037 -s emulator-5554 shell am force-stop com.tencent.mobileqqi'
[Instrumentation] .
[Instrumentation] Time: 74.226
[Instrumentation]
[Instrumentation] OK (1 test)
- 同时模拟器中也打开了
扣扣应用程序。
9 启动问题排查
9.1 urllib3 v2.0 only supports OpenSSL 1.1.1+
- 如果启动过程出现这个错误:
DEPRECATION: celery 5.0.5 has a non-standard dependency specifier pytz>dev. pip 24.0 will enforce this behaviour change. A possible replacement is to upgrade to a newer version of celery or contact the author to suggest that they release a version with a conforming dependency specifiers. Discussion can be found at https://github.com/pypa/pip/issues/12063
- 则说明
Python环境使用的是OpenSSL 1.1.0h,而urllib3 v2.0需要使用OpenSSL 1.1.1; - 解决方法是:
# 要么升级 OpenSSL 到 1.1.1 或更高版本。
# 要么降级 urllib3 到 v1.x 版本,可以通过命令 pip install urllib3==1.* 来实现。
- 本文使用降级
urllib3来解决的,但是可能会导致其他依赖包问题。
pip install urllib3==1.26.15
9.2 UnknownError: An unknown server-side error occurred
- 如果出现以下错误:
UnknownError: An unknown server-side error occurred while processing the command. Original error: Error executing adbExec. Original error: 'Command 'D:\\android-sdk-windows\\platform-tools\\adb.exe -P 5037 -s emulator-5554 shell pm install -r /data/local/tmp/appium_cache/72200c7819db015d5717d05800401c19b35842d5.apk' timed out after 20000ms'. Try to increase the 20000ms adb execution timeout represented by 'uiautomator2ServerInstallTimeout' capability
- 说明
adb安装appium服务的时候报错; - 解决方法是先卸载:
adb uninstall /data/local/tmp/appium_cache/72200c7819db015d5717d05800401c19b35842d5.apk
- 再原样使用命令安装即可:
adb -P 5037 -s emulator-5554 shell pm install -r /data/local/tmp/appium_cache/72200c7819db015d5717d05800401c19b35842d5.apk

相关文章:
『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用
App自动化测试之Appium基础篇』| Desired Capabilities详解与使用 1 关于appium driver2 安装appium driver3 安装Appium Python Client4 安装测试对象5 获取测试对象信息5.1 使用dumpsys5.2 使用AndroidKiller5.3 使用aapt 6 Capabilities详解6.1 Capabilities介绍6.2 automat…...
vscode插件webview和插件通信
如果你要在 VS Code 插件的 WebView 中调用插件中的方法,可以使用 vscode.postMessage API。具体步骤如下: 在插件中,在创建 WebView 时,指定一个 onDidReceiveMessage 回调方法,该方法会在 WebView 中调用 vscode.po…...
【STM32单片机】贪吃蛇游戏设计
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用STM32F103C8T6单片机控制器,使用IIC OLED模块、按键等。 主要功能: 系统运行后,OLED显示游戏界面,可通过K1-K4键控制蛇的方向,当蛇吃…...
【Java 基础】32 定时调度
文章目录 Timer 类创建 Timer注意事项 ScheduledExecutorService 接口创建 ScheduledExecutorService注意事项 选择合适的定时调度方式Timer 的适用场景ScheduledExecutorService 的适用场景 总结 在软件开发中,定时任务是一种常见的需求,用于周期性地执…...
C++ 教程 - 02 复合数据类型
文章目录 数组vector字符串输入输出结构体枚举指针引用综合案例 数组 相同类型的数据的集合{ },通过索引访问元素;在内存中连续存储,属于顺序表;插入、删除时间复杂度 O ( n ) O(n) O(n),访问复杂度 O ( 1 ) O(1) O(1…...
【数据处理】NumPy数组的合并操作,如何将numpy数组进行合并?
,NumPy中的合并操作是指将两个或多个数组合并成一个数组的操作。这种操作可以通过不同的函数来实现。 一、横向合并(水平合并) 横向合并是指将两个具有相同行数的数组按列方向合并成一个数组的操作。在NumPy中,可以使用hstack()…...
JavaScript实现飘窗功能
实现飘窗功能很简单 html代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title…...
Docker笔记:容器转换成镜像,导出导入镜像,数据拷贝,查看日志
docker commit 将容器转换成镜像 可以把容器转换成镜像镜像没有写入权限,但可以通过修改容器把容器制作成新镜像启动容器后,就给容器提供了一个可写层, 在容器里,可安装软件,可创建文件 …转换成镜像,之后…...
串行计时芯片D1380/D1381,2.0V~5.5V 工作电流: 2V时 与TTL 兼容,采用DIP8、SOP8封装
D1380/D1381是一个带秒、分、时、日、日期、月、年的串行时钟保持芯片,每个月多少天以及闰年能自动调节, D1380/D1381低功耗工作方式, D1380/D1381用若干寄存器存储对应信息,一个32.768kHz 的晶振校准时钟,为了使用最小弓|脚,D1380/D1381使用…...
中间件系列 - Redis入门到实战(基础篇)
前言 1.学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 2. 本内容仅用于个人学习笔记,如有侵扰,联系删除 3. 本章学习目标: 初始Redis 认识NoSQL认识Redi…...
项目经理和产品经理该如何选择?
最近很多人咨询“项目经理跟产品经理该怎么选,我更适合哪个?”“项目经理跟产品经理哪个更有钱途 ”“项目经理转产品经理好转吗”等等,今天就一次性说清楚项目经理跟产品经理有什么区别,应该怎么选择。 不想看长篇大论的&#x…...
java WebSocket带参数处理使用
1、webSocket实现代码 Component public class WebSocketStompConfig {//这个bean的注册,用于扫描带有ServerEndpoint的注解成为websocket// ,如果你使用外置的tomcat就不需要该配置文件Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpoi…...
OkHttp: 拦截器和事件监听器
文章目录 1. 拦截器1. 拦截器链2. 实际案例1. 注册为应用拦截器2. 注册为网络拦截器 3. 如何选择用哪种拦截器1. 应用拦截器2. 网络层拦截器3. 重写请求4. 重写响应 4. 可用性 2. 事件监听器1. 请求的生命周期2. EventListener使用案例3. EventListener.Factory4. 调用失败的请…...
总结一些vue3小知识2
1.el-tree-select和el-tree组件报错(有的下拉选项选择不了,一点击就报错,但是有的却能选择,不会报错) 原因:就如同v-for一样,需要添加key才不会出现渲染错误,而el-tree-select和el-tree组件需要…...
【Excel设置动态图表】
设置系列,设置水平轴标签。 效果如图: 经验总结: 方法1:如果设置A、B列为水平轴标签,目前无法设置只是日期为横轴,店铺名称只在最下面显示一个,只能并排1列显示。 优点:如果多选…...
用 C 写一个卷积神经网络
用 C 写一个卷积神经网络 深度学习领域最近发展很快,前一段时间读transformer论文《Attention Is All You Need》时,被一些神经网络和深度学习的概念搞得云里雾里,其实也根本没读懂。发现深度学习和传统的软件开发工程领域的差别挺大…...
直面双碳目标,优维科技携手奥意建筑打造绿色低碳建筑数智云平台
优维“双碳”战略合作建筑 为落实创新驱动发展战略,增强深圳工程建设领域科技创新能力,促进技术进步、科技成果转化和推广应用,根据《深圳市工程建设领域科技计划项目管理办法》《深圳市住房和建设局关于组织申报2022年深圳市工程建设领域科…...
docker 基础入门
docker 基础入门 引言 在当今快速演进的软件开发领域,Docker 已经成为一个革命性的工具,它极大地改变了我们构建、部署和管理应用程序的方式。作为一种开源容器化平台,Docker 提供了一个轻量级且一致的环境,使得软件能够在几乎任…...
HarmonyOS:NativeWindow 开发指导
场景介绍 NativeWindow 是 HarmonyOS 本地平台化窗口,表示图形队列的生产者端。开发者可以通过 NativeWindow 接口进行申请和提交 Buffer,配置 Buffer 属性信息。 针对 NativeWindow,常见的开发场景如下: ● 通过 NativeWindow…...
汉威科技传感器为农业加点“智慧”
农业是国家之根本,历来受到高度重视,在央视《传感中国》系列节目中,智慧农业独占一期,重要性不言而喻。 随着传感器、物联网、GIS、大数据、5G、人工智能、区块链等技术的快速发展,智慧农业成为种植、养殖行业的新趋势…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
