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即用户数据报协议)是一个轻量级的,不可靠的࿰…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...