appium的基本使用

news/2024/4/23 14:59:00/文章来源:https://blog.csdn.net/weixin_43936332/article/details/132007361

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 独有

描述
appActivityActivity 的名字是指从你的包中所要启动的 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 签名,默认值为 falsetrue或false
keystorePath自定义 keystore 的路径, 默认路径为 ~/.android/debug.keystore例如 /path/to.keystore
keystorePassword自定义 keystore 的密码例如 foo
keyAliaskey 的别名例如 androiddebugkey
keyPasswordkey 的密码例如 foo
chromedriverExecutablewebdriver 可执行文件的绝对路径(如果 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)。默认值为 falsetrue或false
unicodeKeyboard使用 Unicode 输入法。 默认值为 falsetrue或false
resetKeyboard在设定了 unicodeKeyboard 关键字的 Unicode 测试结束后,重置输入法到原有状态。如果单独使用,将会被忽略。默认值为 falsetrue或false
noSign跳过检查和对应用进行 debug 签名的步骤。仅适用于 UiAutomator,不适用于 selendroid。 默认值为 falsetrue或false
ignoreUnimportantViews调用 uiautomator 的函数 setCompressedLayoutHierarchy()。由于 Accessibility 命令在忽略部分元素的情况下执行速度会加快,这个关键字能加快测试执行的速度。被忽略的元素将不能够被找到,因此这个关键字同时也被实现成可以随时改变的 设置 ( settings )。 默认值为 falsetrue 或 false
disableAndroidWatchers禁用 android 监视器(watchers)。监视器用于见识应用程序的无响应状态(anr)和崩溃(crash),禁用会降低 Android 设备或模拟器的 CPU 使用率。该 capability 仅在使用 UiAutomator 时有效,不适用于 selendroid,默认设置为 false。true 或 false
chromeOptions允许对 ChromeDriver 传 chromeOptions 的参数。了解更多信息请查阅 chromeOptionschromeOptions: {args: [‘–disable-popup-blocking’]}
recreateChromeDriverSessions当移除非 ChromeDriver webview时,终止掉 ChromeDriver 的 session。默认设置为 falsetrue或false
nativeWebScreenshot在 web 的上下文(context),使用原生(native)的方法去截图,而不是用过代理的 ChromeDriver。默认值为 falsetrue或false
androidScreenshotPath在设备中截图被保存的目录名。默认值为 /data/local/tmp例如 /sdcard/screenshots/
autoGrantPermissions让Appium自动确定您的应用需要哪些权限,并在安装时将其授予应用。默认设置为 falsetrue或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 的日志中显示设备的日志。默认值为 falsetrue或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去进行定位

发送秘钥:对文本框进行输入
清空:清空文本框里的内容
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_337523.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 刷题 数据结构 数组 485 最大连续1的个数

给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,0,1,1,1] 输出&#xff1a;3 解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续 1 的个数是 3.示例 2: 输入&#xff1a;nums […

基于中文金融知识的 LLaMA 系微调模型的智能问答系统:LLaMA大模型训练微调推理等详细教学

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

《向量数据库指南》:向量数据库Pinecone如何集成Elasticsearch

目录 上传嵌入模型 上传数据集 创建嵌入 将Elasticsearch索引移动到Pinecone 概要 是一个强大的开源搜索引擎和分析平台,广泛用作基于关键字的文本搜索的文档存储。 Pinecone是一个广泛用于生产应用程序的向量数据库,例如语义搜索、推荐系统和威胁检测,需要在数亿甚…

68. 文本左右对齐

题目链接&#xff1a;力扣 解题思路&#xff1a;遍历单词数组&#xff0c;确定每一行的单词数量&#xff0c; 之后就可以得到每一个需要补充的空格数量。从而得到单词之间需要补充的空格数量。具体算法如下&#xff1a; 确定每一行的单词数量 初始值&#xff1a; num 0&…

【MQTT5】原生PHP对接Uni H5、APP、微信小程序实时通讯消息服务

文章目录 视频演示效果前言一、分析二、全局注入MQTT连接1.引入库2.写入全局连接代码 二、PHP环境建立总结 视频演示效果 【uniapp】实现买定离手小游戏 前言 Mqtt不同环境问题太多&#xff0c;新手可以看下 《【MQTT】Esp32数据上传采集&#xff1a;最新mqtt插件&#xff08;支…

用JavaScript和HTML实现聊天页面和功能(超详细)

文章目录 &#x1f680;一、介绍&#x1f680;二、开始编码&#x1f50e;2.1 创建一个HTML文件&#x1f50e;2.2 编写样式&#x1f50e;2.3 完善聊天页面&#x1f50e;2.4 编写按钮逻辑&#x1f50e;2.5 测试聊天效果&#x1f50e;2.6 优化对话显示&#x1f50e;2.7 设置一个自…

SQL-每日一题【1070. 产品销售分析 III】

题目 销售表 Sales&#xff1a; 产品表 Product&#xff1a; 编写一个 SQL 查询&#xff0c;选出每个销售产品 第一年 销售的 产品 id、年份、数量 和 价格。 结果表中的条目可以按 任意顺序 排列。 查询结果格式如下例所示&#xff1a; 示例 1&#xff1a; 解题思路 前置知…

LLaMA:开放和高效的基础语言模型

Part1前言 我们介绍了LLaMA&#xff0c;这是一个参数范围从7B到65B的基础语言模型集合。我们在数以万亿计的标记上训练我们的模型&#xff0c;并表明有可能完全使用公开可用的数据集来训练最先进的模型&#xff0c;而不必求助于专有的和不可获取的数据集。特别是&#xff0c;L…

PDF.js实现搜索关键词高亮显示效果

在static\PDF\web\viewer.js找到定义setInitialView方法 大约是在1202行&#xff0c;不同的pdf.js版本不同 在方法体最后面添加如下代码&#xff1a; // 高亮显示关键词---------------------------------------- var keyword new URL(decodeURIComponent(location)).searchP…

单链表的多语言表达:C++、Java、Python、Go、Rust

单链表 是一种链式数据结构&#xff0c;由一个头节点和一些指向下一个节点的指针组成。每个节点包含一个数据元素和指向下一个节点的指针。头节点没有数据&#xff0c;只用于表示链表的开始位置。 单链表的主要操作包括&#xff1a; 添加元素&#xff1a;在链表的头部添加新…

sqlSugar应用表值函数

一、新建表值函数 TableIntSplit 二、新建类 var employees _sqlSugarClient.Queryable<Employees>().InnerJoin(_sqlSugarClient.SqlQueryable<TableID>("select * from dbo.TableIntSplit(ids,split)").AddParameters(new { ids "1,2", s…

Spring源码(四)— 创建BeanDefinition

在第一章序言的图示中有提到&#xff0c;Spring中的配置文件都是通过各种的BeanDefinition来进行解析&#xff0c;并且支持不同类型的文件进行扩展。所以在创建完DefaultListableBeanFactory后&#xff0c;会通过BeanDefinition来解析传入的xml配置文件。 loadBeanDefinitions…

【业务功能篇59】Springboot + Spring Security 权限管理 【下篇】

UserDetails接口定义了以下方法&#xff1a; getAuthorities(): 返回用户被授予的权限集合。这个方法返回的是一个集合类型&#xff0c;其中每个元素都是一个GrantedAuthority对象&#xff0c;表示用户被授予的权限。getPassword(): 返回用户的密码。这个方法返回的是一个字符…

打开域名跳转其他网站,官网被黑解决方案(Linux)

某天打开网站&#xff0c;发现进入首页&#xff0c;马上挑战到其他赌博网站。 事不宜迟&#xff0c;不能让客户发现&#xff0c;得马上解决 我的网站跳转到这个域名了 例如网站跳转到 k77.cc 就在你们部署的代码的当前文件夹下面&#xff0c;执行下如下命令 find -type …

【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

文章目录 前言一、反向迭代器封装&#xff08;reverseiterator&#xff09;1.构造函数1解引用操作.3.->运算符重载4.前置&#xff0c;后置5.前置--&#xff0c;后置--6.不等号运算符重载7.完整代码 二、rbegin&#xff08;&#xff09;以及rend&#xff08;&#xff09;1.rb…

CRM如何进行数据分析?有什么用?

什么是CRM数据分析软件&#xff1f;CRM数据分析软件可以对数据进行挖掘、统计和分析&#xff0c;帮助企业从大量的客户数据中提取有价值的信息&#xff0c;分析数据背后的含义&#xff0c;从而帮助企业更好地运营的一种工具。 1、提高客户满意度 CRM数据分析软件可以通过对客户…

Java的第十五篇文章——网络编程(后期再学一遍)

目录 学习目的 1. 对象的序列化 1.1 ObjectOutputStream 对象的序列化 1.2 ObjectInputStream 对象的反序列化 2. 软件结构 2.1 网络通信协议 2.1.1 TCP/IP协议参考模型 2.1.2 TCP与UDP协议 2.2 网络编程三要素 2.3 端口号 3. InetAddress类 4. Socket 5. TCP网络…

前端调用合约如何避免出现transaction fail

前言&#xff1a; 作为开发&#xff0c;你一定经历过调用合约的时候发现 gas fee 超出限制&#xff0c;但是不知道报了什么错。这个时候一般都是触发了require错误合约校验。对于用户来说他不理解为什么一笔交易会花费如此大的gas&#xff0c;那我们作为开发如何尽量避免这种情…

基于注解手写Spring的IOC(上)

一、思路 先要从当前类出发找到对应包下的所有类文件&#xff0c;再从这些类中筛选出类上有MyComponent注解的类&#xff1b;把它们都装入Map中&#xff0c;同时类属性完成MyValue的赋值操作。 二、具体实现 测试类结构&#xff1a; 测试类&#xff1a;myse、mycontor、BigSt…

【Linux】线程互斥 -- 互斥锁 | 死锁 | 线程安全

引入互斥初识锁互斥量mutex锁原理解析 可重入VS线程安全STL中的容器是否是线程安全的? 死锁 引入 我们写一个多线程同时访问一个全局变量的情况(抢票系统)&#xff0c;看看会出什么bug&#xff1a; // 共享资源&#xff0c; 火车票 int tickets 10000; //新线程执行方法 vo…