appium的基本使用
appium的基本使用
- 一、appium的基本使用
- appium环境安装
- 1、安装Android SDK
- 2、安装Appium
- 3、安装手机模拟器
- 4、Pycharm安装 appium-python-alicent
- 5、连接appium和模拟器
- 6、Python代码调用appium软件,appium软件在通过adb命令调用android操作系统(模拟器/真机)
- appium的使用流程
- 1、 Appium Python API地址
- 2、准备工作
- Appium 服务器初始化参数
- Android 独有
- iOS 独有
- 3、启动参数配置及启动APP
- APP包名获取
- 启动时碰到的坑!!!
- 解决步骤
- 4、appium的功能介绍
- (1)三种模式
- Simple:简单模式
- Advanced:高级模式
- Presets:预设;可以存放已配置好的配置,直接用就可
- (2)启动界面
一、appium的基本使用
appium环境安装
1、安装Android SDK
- (1)配置环境变量
用户变量的path添加以下三个路径:
%ANDROID_HOME%\build-tools\31.0.0
%ANDROID_HOME%\platform-tools
%ANDROID_HOME%\tools

变量名:ANDROID_HONE
变量值:安装的具体路径

- (2)cmd中输入:android和adb来查看是否安装成功
2、安装Appium
全点下一步就行
3、安装手机模拟器
个人安装的是夜神模拟器【目前换成雷电了,感觉雷电更好用】
4、Pycharm安装 appium-python-alicent
终端里输入pip install Appium-Python-Client
5、连接appium和模拟器
有的模拟器会自动连上(雷电模拟器打开后,可以自动连接appium),如果需要手动连接,可尝试以下操作:
第一步:模拟器中打开“开发者选项”,设置-关于手机-版本号,连点五次版本号就可以打开
第二步:打开USB调试模式
第二步:cmd命令 运行 adb connect 127.0.0.1:xxx 模拟器运行的端口
连接中碰见的问题:
问题:error: protocol fault (couldn‘t read status): Connection reset by peer,则说明端口号被占用,5037是adb的默认端口号
解决方法:查看哪个程序占用了adb端口,结束这个程序,然后重启adb
解决步骤:
- 1:使用命令:netstat -aon|findstr “5037” 找到占用5037端口的进程PID。
- 2:使用命令:tasklist|findstr “30312” 通过PID找出进程。

- 3:使用命令:taskkill /pid 30312 /f 通过PID关闭进程。

- 4:使用命令:adb start-server 启动adb就行了

最后再dbc devices 查看一下是否连上了
6、Python代码调用appium软件,appium软件在通过adb命令调用android操作系统(模拟器/真机)
appium的使用流程
1、 Appium Python API地址
Appium Python API 中文版:https://testerhome.com/topics/3711
appium官方文档地址:http://appium.io/docs/cn/about-appium/intro/#_1
2、准备工作
- (1)appium启动
- (2)连接手机或者启动模拟器
- (3)通过adb命令查看设备是否已连接
- (4)启动参数配置
Appium 服务器初始化参数
| 键 | 描述 | 值 |
|---|---|---|
| automationName | 自动化测试的引擎 | Appium (默认)或者 Selendroid |
| platformName | 使用的手机操作系统 | iOS, Android, 或者 FirefoxOS |
| platformVersion | 手机操作系统的版本 | 例如 7.1, 4.4 |
| deviceName | 使用的手机或模拟器类型 | iPhone Simulator, iPad Simulator, iPhone Retina 4-inch, Android Emulator, Galaxy S4, 等等… 在 iOS 上,使用 Instruments 的 instruments -s devices 命令可返回一个有效的设备的列表。在 Andorid 上虽然这个参数目前已被忽略,但仍然需要添加上该参数 |
| app | 本地绝对路径_或_远程 http URL 所指向的一个安装包(.ipa,.apk,或 .zip 文件)。Appium 将其安装到合适的设备上。请注意,如果您指定了 appPackage 和 appActivity 参数(见下文),Android 则不需要此参数了。该参数也与 browserName 不兼容。 | /abs/path/to/my.apk 或 http://myapp.com/app.ipa |
| browserName | 做自动化时使用的浏览器名字。如果是一个应用则只需填写个空的字符串 | ‘Safari’ 对应 iOS,‘Chrome’, ‘Chromium’, 或 ‘Browser’ 则对应 Android |
| newCommandTimeout | 用于客户端在退出或者结束 session 之前,Appium 等待客户端发送一条新命令所花费的时间(秒为单位) | 例如 60 |
| language | (Sim/Emu-only) 为模拟器设置语言 | 例如 fr |
| locale | (Sim/Emu-only) 为模拟器设置所在区域 | 例如 fr_CA |
| udid | 连接真机的唯一设备号 | 例如 1ae203187fc012g |
| orientation | (Sim/Emu-only) 模拟器当前的方向 | 竖屏 或 横屏 |
| autoWebview | 直接转换到 Webview 上下文(context)。 | 默认值为 false true, false |
| noReset | 在当前 session 下不会重置应用的状态。 | 默认值为 false true, false |
| fullReset | (iOS)删除所有的模拟器文件夹。 | (Android) 要清除 app 里的数据,请将应用卸载才能达到重置应用的效果。在 Android, 在 session 完成之后也会将应用卸载掉。默认值为 false true, false |
Android 独有
| 键 | 描述 | 值 |
|---|---|---|
| appActivity | Activity 的名字是指从你的包中所要启动的 Android acticity。他通常需要再前面添加. (例如 使用 .MainActivity 代替 MainActivity) | MainActivity, .Settings |
| appPackage | 运行的 Android 应用的包名 | com.example.android.myApp, com.android.settings |
| appWaitActivity | 用于等待启动的 Android Activity 名称 | SplashActivity |
| appWaitPackage | 用于等待启动的 Android 应用的包 | com.example.android.myApp, com.android.settings |
| appWaitDuration | 用于等待 appWaitActivity 启动的超时时间(以毫秒为单位)(默认值为 20000) | 30000 |
| deviceReadyTimeout | 用于等待模拟器或真机准备就绪的超时时间 | 5 |
| androidCoverage | 用于执行测试的 instrumentation 类。 | 传送 -w 参数到如下命令 adb shell am instrument -e coverage true -w com.my.Pkg/com.my.Pkg.instrumentation.MyInstrumentation |
| enablePerformanceLogging | (仅适用于 Chrome 与 webview)开启 Chromedriver 的性能日志。(默认值为 false) | true, false |
| androidDeviceReadyTimeout | 用于等待设备在启动应用后准备就绪的超时时间。以秒为单位。 | 例如 30 |
| androidInstallTimeout | 用于等待在设备中安装 apk 所花费的时间(以毫秒为单位)。默认值为 90000 | 例如 90000 |
| adbPort | 用来连接 ADB 服务器的端口(默认值为 5037) | 5037 |
| androidDeviceSocket | 开发工具的 socket 名称。 | 只有在被测应用是一个使用 Chromium 内核的浏览器时才需要。socket |
| avd | 被启动 avd 的名字 | 例如 api19 |
| avdLaunchTimeout | 用于等待 avd 启动并连接 ADB 的超时时间(以毫秒为单位),默认值为 120000。 | 300000 |
| avdReadyTimeout | 用于等待 avd 完成启动动画的超时时间(以毫秒为单位),默认值为 120000。 | 300000 |
| avdArgs | 启动 avd 时使用的额外参数 | 例如 -netfast |
| useKeystore | 使用自定义的 keystore 给 apk 签名,默认值为 false | true或false |
| keystorePath | 自定义 keystore 的路径, 默认路径为 ~/.android/debug.keystore | 例如 /path/to.keystore |
| keystorePassword | 自定义 keystore 的密码 | 例如 foo |
| keyAlias | key 的别名 | 例如 androiddebugkey |
| keyPassword | key 的密码 | 例如 foo |
| chromedriverExecutable | webdriver 可执行文件的绝对路径(如果 Chromium 内嵌一个自己提供的 webdriver,则应使用他去替换掉 Appium 自带的 chromedriver) | /abs/path/to/webdriver |
| autoWebviewTimeout | 用于等待 Webview 上下文(context)激活的时间(以毫秒为单位)。默认值为 2000 | 例如 4 |
| intentAction | 用于启动 activity 的 intent action(默认值为 android.intent.action.MAIN) | 例如 android.intent.action.MAIN, android.intent.action.VIEW |
| intentCategory | 用于启动 activity 的 intent category。 | (默认值为 android.intent.category.LAUNCHER) 例如 android.intent.category.LAUNCHER, android.intent.category.APP_CONTACTS |
| intentFlags | 用于启动 activity 的标识(flags)(默认值为 0x10200000) | 例如 0x10200000 |
| optionalIntentArguments | 用于启动 activity 的额外 intent 参数。请查看 Intent 参数 | 例如 --esn <EXTRA_KEY>, --ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE>, 等等。 |
| dontStopAppOnReset | 在使用 adb 启动应用之前,不要终止被测应用的进程。如果被测应用是被其他钩子(anchor)应用所创建的,设置该参数为 false 后,就允许钩子(anchor)应用的进程在使用 adb 启动被测应用期间仍然存在。换而言之,设置 dontStopAppOnReset 为 true 后,我们在 adb shell am start 的调用中不需要包含 -S标识(flag)。忽略该 capability 或 设置为 false 的话,就需要包含 -S 标识(flag)。默认值为 false | true或false |
| unicodeKeyboard | 使用 Unicode 输入法。 默认值为 false | true或false |
| resetKeyboard | 在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为 false | true或false |
| noSign | 跳过检查和对应用进行 debug 签名的步骤。仅适用于 UiAutomator,不适用于 selendroid。 默认值为 false | true或false |
| ignoreUnimportantViews | 调用 uiautomator 的函数 setCompressedLayoutHierarchy()。由于 Accessibility 命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 设置 ( settings )。 默认值为 false | true 或 false |
| disableAndroidWatchers | 禁用 android 监视器(watchers)。监视器用于见识应用程序的无响应状态(anr)和崩溃(crash),禁用会降低 Android 设备或模拟器的 CPU 使用率。该 capability 仅在使用 UiAutomator 时有效,不适用于 selendroid,默认设置为 false。 | true 或 false |
| chromeOptions | 允许对 ChromeDriver 传 chromeOptions 的参数。了解更多信息请查阅 chromeOptions | chromeOptions: {args: [‘–disable-popup-blocking’]} |
| recreateChromeDriverSessions | 当移除非 ChromeDriver webview时,终止掉 ChromeDriver 的 session。默认设置为 false | true或false |
| nativeWebScreenshot | 在 web 的上下文(context),使用原生(native)的方法去截图,而不是用过代理的 ChromeDriver。默认值为 false | true或false |
| androidScreenshotPath | 在设备中截图被保存的目录名。默认值为 /data/local/tmp | 例如 /sdcard/screenshots/ |
| autoGrantPermissions | 让Appium自动确定您的应用需要哪些权限,并在安装时将其授予应用。默认设置为 false | true或false |
iOS 独有
| 键 | 描述 | 值 |
|---|---|---|
| calendarFormat | (仅支持模拟器) 为iOS的模拟器设置日历格式 | 例如 gregorian |
| bundleId | 被测应用的 bundle ID 。用于在真实设备中启动测试,也用于使用其他需要 bundle ID 的关键字启动测试。在使用 bundle ID 在真实设备上执行测试时,你可以不提供 app 关键字,但你必须提供 udid 。 | 例如 io.appium.TestApp |
| udid | 连接的真实设备的唯一设备编号 (Unique device identifier) | 例如 1ae203187fc012g |
| launchTimeout | 以毫秒为单位,在 Appium 运行失败之前设置一个等待 instruments 的时间 | 例如 20000 |
| locationServicesEnabled | (仅支持模拟器)强制打开或关闭定位服务。默认值是保持当前模拟器的设定. | true或false |
| locationServicesAuthorized | (仅支持模拟器)通过修改 plist 文件设定是否允许应用使用定位服务,从而避免定位服务的警告出现。默认值是保持当前模拟器的设定。请注意在使用这个关键字时,你同时需要使用 bundleId 关键字来发送你的应用的 bundle ID。 | true或false |
| autoAcceptAlerts | 当警告弹出的时候,都会自动去点接受。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 XCUITest 的测试。 | true或false |
| autoDismissAlerts | 当警告弹出的时候,都会自动去点取消。包括隐私访问权限的警告(例如 定位,联系人,照片)。默认值为 false。不支持基于 XCUITest 的测试。 | true或false |
| nativeInstrumentsLib | 使用原生 intruments 库(即关闭 instruments-without-delay)。 | true或false |
| nativeWebTap | (仅支持模拟器)在Safari中允许“真实的",非基于 javascript 的 web 点击 (tap) 。 默认值:false。注意:取决于 viewport 大小/比例, 点击操作不一定能精确地点中对应的元素。 | true或false |
| safariInitialUrl | (仅支持模拟器) (>= 8.1) 初始化 safari 的时使用的地址。默认是一个本地的欢迎页面 | 例如 https://www.github.com |
| safariAllowPopups | (仅支持模拟器)允许 javascript 在 Safari 中创建新窗口。默认保持模拟器当前设置。 | true或false |
| safariIgnoreFraudWarning | (仅支持模拟器)阻止 Safari 显示此网站可能存在风险的警告。默认保持浏览器当前设置。 | true或false |
| safariOpenLinksInBackground | (仅支持模拟器)Safari 是否允许链接在新窗口打开。默认保持浏览器当前设置。 | true或false |
| keepKeyChains | (仅支持模拟器)当 Appium 会话开始/结束时是否保留存放密码存放记录 (keychains) 库(Library)/钥匙串(Keychains)) | true或false |
| localizableStringsDir | 从哪里查找本地化字符串。 | 默认值为 en.lproj en.lproj |
| processArguments | 通过 instruments 传递到 AUT 的参数 | 例如 -myflag |
| interKeyDelay | 以毫秒为单位,按下每一个按键之间的延迟时间 | 例如 100 |
| showIOSLog | 是否在 Appium 的日志中显示设备的日志。默认值为 false | true或false |
| sendKeyStrategy | 输入文字到文字框的策略。模拟器默认值:oneByOne(一个接着一个)。真实设备默认值:grouped (分组输入) | oneByOne, grouped或setValue |
| screenshotWaitTimeout | 以秒为单位,生成屏幕截图的最长等待时间。默认值为:10 | 例如 5 |
| waitForAppScript | 用于判断 "应用是否被启动” 的 iOS 自动化脚本代码。默认情况下系统等待直到页面内容非空。结果必须是布尔类型。 | 例如 true;, target.elements().length > 0;, $.delay(5000); true; |
| webviewConnectRetries | 用于获取 webview 失败时,发送连接信息到远程调试器的次数。默认次数为: 8 | 例如 12 |
| appName | 被测应用的名字。 用于支持 iOS 9 以上系统的应用的自动化。 | 例如 UICatalog |
| customSSLCert | (Sim/Emu-only) 给模拟器添加一个 SSL 证书。 | 例如-----BEGIN CERTIFICATE----- MIIFWjCCBEKg… -----END CERTIFICATE----- |
3、启动参数配置及启动APP
app启动参数及启动app的完整代码
from appium.webdriver import Remote #引入打开软件的包#app的启动参数
desired_cap={"platformName":"Android", #手机系统"platformVersion": "7.1.2", #手机系统版本"deviceName":'HUAWEI', #手机的名字,不会进行校验,但是没有会报错"automationName":"UiAutomator2",#自动化测试框架 (1.4以上的appium不用写)"appPackage":"com.taobao.taobao",#app包名"appActivity":"com.taobao.tao.welcome.Welcome",#app的启动页面
}driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_cap)
APP包名获取
第一步:打开apk所在的文件夹,文件夹的路径上输入cmd,回车

#aapt:安卓资源打包工具
aapt dump badging app应用.apk #apk的名字最好是英文,否则会出问题
例如:aapt dump badging taobao.apk


启动时碰到的坑!!!
错误提示:
D:\pycharm\Python\Scripts\python.exe C:/Users/Wheat/PycharmProjects/pythonProject/app_01day_project/demo1_appium入门.py
Traceback (most recent call last):File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 175, in _new_conn(self._dns_host, self.port), self.timeout, **extra_kwFile "D:\pycharm\Python\lib\site-packages\urllib3\util\connection.py", line 96, in create_connectionraise errFile "D:\pycharm\Python\lib\site-packages\urllib3\util\connection.py", line 86, in create_connectionsock.connect(sa)
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。During handling of the above exception, another exception occurred:Traceback (most recent call last):File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 706, in urlopenchunked=chunked,File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 394, in _make_requestconn.request(method, url, **httplib_request_kw)File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 239, in requestsuper(HTTPConnection, self).request(method, url, body=body, headers=headers)File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1262, in requestself._send_request(method, url, body, headers, encode_chunked)File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1308, in _send_requestself.endheaders(body, encode_chunked=encode_chunked)File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1257, in endheadersself._send_output(message_body, encode_chunked=encode_chunked)File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 1028, in _send_outputself.send(msg)File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\http\client.py", line 968, in sendself.connect()File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 205, in connectconn = self._new_conn()File "D:\pycharm\Python\lib\site-packages\urllib3\connection.py", line 187, in _new_connself, "Failed to establish a new connection: %s" % e
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPConnection object at 0x00000168E72F4588>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。During handling of the above exception, another exception occurred:Traceback (most recent call last):File "C:/Users/Wheat/PycharmProjects/pythonProject/app_01day_project/demo1_appium入门.py", line 13, in <module>driver = Remote(command_executor='http://127.0.0.1:4444/wd/hub',desired_capabilities=desired_cap)File "D:\pycharm\Python\lib\site-packages\appium\webdriver\webdriver.py", line 274, in __init__AppiumConnection(command_executor, keep_alive=keep_alive), desired_capabilities, browser_profile, proxyFile "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 268, in __init__self.start_session(capabilities, browser_profile)File "D:\pycharm\Python\lib\site-packages\appium\webdriver\webdriver.py", line 364, in start_sessionresponse = self.execute(RemoteCommand.NEW_SESSION, parameters)File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 422, in executeresponse = self.command_executor.execute(driver_command, params)File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 421, in executereturn self._request(command_info[0], url, body=data)File "D:\pycharm\Python\lib\site-packages\selenium\webdriver\remote\remote_connection.py", line 443, in _requestresp = self._conn.request(method, url, body=body, headers=headers)File "D:\pycharm\Python\lib\site-packages\urllib3\request.py", line 79, in requestmethod, url, fields=fields, headers=headers, **urlopen_kwFile "D:\pycharm\Python\lib\site-packages\urllib3\request.py", line 170, in request_encode_bodyreturn self.urlopen(method, url, **extra_kw)File "D:\pycharm\Python\lib\site-packages\urllib3\poolmanager.py", line 375, in urlopenresponse = conn.urlopen(method, u.request_uri, **kw)File "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen**response_kwFile "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen**response_kwFile "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 796, in urlopen**response_kwFile "D:\pycharm\Python\lib\site-packages\urllib3\connectionpool.py", line 756, in urlopenmethod, url, error=e, _pool=self, _stacktrace=sys.exc_info()[2]File "D:\pycharm\Python\lib\site-packages\urllib3\util\retry.py", line 574, in incrementraise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='127.0.0.1', port=4444): Max retries exceeded with url: /wd/hub/session (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000168E72F4588>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))Process finished with exit code 1
解决步骤
- 第一步:
driver = Remote(command_executor='http://127.0.0.1:4723/wd/hub',desired_capabilities=desired_cap)
command_executor的端口号一定要与appium上给你一致;这样就解决一部分的bug了

- 第二步:
Encountered internal error running command: Error: activity and pkg are required to start an application
原因:启动参数的名称写错了
正确的应该是 “appActivity”
4、appium的功能介绍
(1)三种模式
Simple:简单模式

Edit Configurations:可以配置android sdk和Java sdk的环境地址,如果之前已经配置好,会有默认的地址
Advanced:高级模式


Presets:预设;可以存放已配置好的配置,直接用就可
(2)启动界面



如果某处有id,元素id值是唯一的,所以可用id去进行定位
发送秘钥:对文本框进行输入
清空:清空文本框里的内容


相关文章:
appium的基本使用
appium的基本使用 一、appium的基本使用appium环境安装1、安装Android SDK 2、安装Appium3、安装手机模拟器4、Pycharm安装 appium-python-alicent5、连接appium和模拟器6、Python代码调用appium软件,appium软件在通过adb命令调用android操作系统(模拟器…...
Dockerfile构建nginx镜像(编译安装)
Dockerfile构建nginx镜像 1、建立工作目录 [rootdocker ~]# mkdir nginx [rootdocker ~]# cd nginx/ 2、编写Dockerfile文件 [rootdocker nginx]# vim run.sh [rootdocker nginx]# vim Dockerfile #基于的基础镜像 FROM centos:7#镜像作者信息 MAINTAINER Crushlinux <…...
手机屏幕视窗机器视觉定位软硬件-康耐德
【检测目的】 手机屏幕视窗视觉定位 【效果图片】 【安装示意图】 【硬件配置】...
Databend 开源周报第 104 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 从 Kafka 载入数…...
用于医学图像分类的双引导的扩散网络
文章目录 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification摘要本文方法实验结果 DiffMIC: Dual-Guidance Diffusion Network for Medical Image Classification 摘要 近年来,扩散概率模型在生成图像建模中表现出了显著的性能…...
8.2day03 Redis入门+解决员工模块
概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景࿰…...
通过案例实战详解elasticsearch自定义打分function_score的使用
前言 elasticsearch给我们提供了很强大的搜索功能,但是有时候仅仅只用相关度打分是不够的,所以elasticsearch给我们提供了自定义打分函数function_score,本文结合简单案例详解function_score的使用方法,关于function-score-query…...
SpringBoot第28讲:SpringBoot集成MySQL - MyBatis-Plus方式
SpringBoot第28讲:SpringBoot集成MySQL - MyBatis-Plus方式 本文是SpringBoot第28讲,MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyB…...
AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解
本文使用工具,作者:秋葉aaaki 免责声明: 工具免费提供 无任何盈利目的 大家好,我是风雨无阻。 今天为大家带来的是 AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解。 目前,AI 绘画Stable Diffusion的…...
Docker 命令没有提示信息
问题描述 提示:这里描述项目中遇到的问题: linux安装docker后发现使用docker命令没有提示功能,使用 Tab 键的时候只是提示已有的文件 解决方案: 提示:这里填写该问题的具体解决方案: Bash命令补全 Docke…...
springboot第33集:nacos图
./startup.sh -m standalone Nacos是一个内部微服务组件,需要在可信的内部网络中运行,不可暴露在公网环境,防止带来安全风险。Nacos提供简单的鉴权实现,为防止业务错用的弱鉴权体系,不是防止恶意攻击的强鉴权体系。 鉴…...
学习gRPC(一)
gRPC 简介 根据官网的介绍,gRPC 是开源高性能远程过程调用(RPC)框架,可以在任何环境中运行。它可以有效地连接数据中心内部和数据中心之间的服务,并为负载平衡、跟踪、运行状况检查和身份验证提供支持。同时由于其建立…...
【二进制安全】堆漏洞:Double Free原理
参考:https://www.anquanke.com/post/id/241598 次要参考:https://xz.aliyun.com/t/6342 malloc_chunk 的源码如下: struct malloc_chunk { INTERNAL_SIZE_T prev_size; /*前一个chunk的大小*/ INTERNAL_SIZE_T size; /*当前chunk的…...
python之open,打开文件时,遇到解码错误处理方式
在Python中,当我们打开一个文件时,我们可以指定文件的编码方式。如果文件的编码方式与我们指定的编码方式不同,那么就会出现解码错误。为了避免这种情况,我们可以使用errors参数来指定如何处理解码错误。 errors参数用于指定解码…...
STM32 CAN通信-CubeMX环境下CAN通信程序的编程与调试经验
文章目录 STM32 CAN通信-CubeMX环境下CAN通信程序的编程 STM32 CAN通信-CubeMX环境下CAN通信程序的编程 STM32F103ZE芯片 CAN通信测试代码: #include "main.h" #include "can.h"CAN_HandleTypeDef hcan1;void SystemClock_Config(void);int ma…...
windows创建不同大小的文件命令
打开命令窗口(windowsR输入cmd打开) 输入:fsutil file createnew C:\Users\Desktop\fileTran\10M.txt 10240000,创建10M大小的文件。 文件若存在需要先删除。...
Attention Is All You Need
Attention Is All You Need 摘要1. 简介2. Background3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 缩放的点积注意力(Scaled Dot-Product Attention)3.2.2 Multi-Head Attention3.2.3 Attention 在我们模型中的应用 3.3 Position-wise前馈网络…...
手写线程池 - C++版 - 笔记总结
1.线程池原理 创建一个线程,实现很方便。 缺点:若并发的线程数量很多,并且每个线程都是执行一个时间较短的任务就结束了。 由于频繁的创建线程和销毁线程需要时间,这样的频繁创建线程会大大降低 系统的效率。 2.思考 …...
PHP 容器化引发线上 502 错误状态码的修复
最后更新时间 2023-01-24. 背景 笔者所在公司技术栈为 Golang PHP,目前部分项目已经逐步转 Go 语言重构,部分 PHP 业务短时间无法用 Go 重写。 相比 Go 语言,互联网公司常见的 Nginx PHP-FPM 模式,经常会出现性能问题—— 特…...
QT中UDP之UDPsocket通讯
目录 UDP: 举例: 服务器端: 客户端: 使用示例: 错误例子并且改正: UDP: (User Datagram Protocol即用户数据报协议)是一个轻量级的,不可靠的࿰…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
