『App自动化测试之Appium基础篇』| Desired Capabilities详解与使用

news2024/11/24 4:33:04

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.apk
        ver: /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

  • 启动待测试appappPackageappActivity
  • appPackage是app的包名;
  • appActivityapp的活动窗口名;
  • 这两个参数的获取已经在第五章节说明了。

还有几个参数,这个不一一说明了,直接看官方文档即可。

7 官方示例

  • 以下这个是官方的一个示例,是python版本的;
import unittest
from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy

capabilities = 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/NoamaNelson

from appium import webdriver
from appium.options.android import UiAutomator2Options
from appium.webdriver.common.appiumby import AppiumBy
import time

capabilities = 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

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【VTK】VTK中的光标样式

很高兴在雪易的CSDN遇见你 前言 本文分享VTK中的光标设置相关内容技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就是我的动力(&#xff3e;&#xff35;&#…

DNSLog漏洞探测(六)之SSRF漏洞实战

DNSLog漏洞探测(六)之SSRF漏洞实战 本文我们来学习如何利用DNSLog平台探测目标网站是否存在SSRF漏洞&#xff0c;接下来我们还是利用Pikachu的靶场作为演示。首先我们先进入Pikachu靶场的SSRF漏洞界面。SSRF漏洞更多的可以称之为服务端的请求伪造。 像是原本探测漏洞的手段&am…

契约锁电子签章让合同起草、审查不再难

起草、审查合同是签约过程中最繁琐的环节之一。 小到筛选合同范本、确认并填写签署方信息、计算工资、服务费用或产品价格&#xff0c;大到合同条款审查、修改…总之想要呈现一份合规、双方满意的合同文书常常消耗大量时间和精力&#xff0c;事倍功半。 销售刚刚和客户确认订单…

二百一十四、Linux——Linux系统时间比电脑时间慢5分钟

一、目的 服务器重启后&#xff0c;发现Linux的系统时间比电脑时间慢5分钟&#xff0c;于是看了些博客&#xff0c;终于找到了解决方法&#xff0c;记录一下&#xff0c;以防止后面出现同样的问题 二、问题 通过date查看&#xff0c;Linux系统时间比电脑时间慢5分钟 &#…

源码级详解Spring的三级缓存,循环依赖的处理流程

一.什么是三级缓存 1.一级缓存&#xff1a;存放已经初始化完成的Bean 2.二级缓存&#xff1a;存放半成品Bean&#xff0c;既实例化完成未初始化的Bean。 3.三级缓存&#xff1a;存放bean工厂 二.为什么是三级缓存 一级缓存是必须的&#xff0c;这个我们没有什么疑问。那为…

等保2.0的变化

1法律地位得到确认 《中华人民共和国网络安全法》第21条规定“国家实行网络安全等级保护制度”&#xff0c;要求“网络运营者应当按照网络安全等级保护制度要求&#xff0c;履行安全保护义务”&#xff1b;第31条规定“对于国家关键信息基础设施&#xff0c;在网络安全等级保护…

时序数据库TDengine安装及c#连接读写数据

物联网数据采集&#xff0c;需写入大量数据&#xff0c;这时就用到时序数据库来存储和快速读取 我个人使用感觉国产的开源项目TDengine&#xff0c;比InfluxDB操作方便很多&#xff0c;容易上手&#xff0c;支持使用SqlSugar进行数据操作&#xff0c;跟操作mysql数据库一样的体…

Python简单网抑云数据采集 JS逆向

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 环境使用: Python 3.10 Pycharm 模块使用: requests -> pip install requests execjs -> pip install execjs 爬虫实现基本思路流程: 一. 数据来源分析: 明确需求: 明确采集的网站以及数据内容 网址: https://mu…

HCIA-H12-811题目解析(3)

1、【单选题】 以下关于路由器的描述&#xff0c;说法错误的是&#xff1f; 2、【单选题】某网络工程师在输入命令行时提示如下信息&#xff1a;Error:Unrecognized command foun at position.对于该提示信息说法正确的是&#xff1f; 3、【单选题】如下图所示的网络&#xf…

时间戳与QDateTime转换,以及QString转时间戳

1、主要有时间戳->QDateTime,QDateTime->QString 2、同时QString->QDateTime,QDateTime->时间戳 详情见代码&#xff1a; //QDateTime转时间戳qint64 time QDateTime::currentSecsSinceEpoch();double nowTime (double)time;qDebug()<<"nowTime1111…

小米耳机定制音效选项灰色无法开启使用_开启定制音效_音效模式设置_音效使用教程

使用环境&#xff1a;Redmi K50 Ultra &#xff0b;MIUI 14.0.11&#xff0b;定制音效选项是灰色的无法开启及音效模式无法选择 定制音效无法开启 音效模式无法选择&#xff08;需下载小米耳机APP才能设置&#xff09;&#xff0c;根据提示解决问题即可 解决方法&#xff1a;关…

IDEA使用小技巧

常用的基本设置 界面字体 File | Settings | Appearance & Behavior | Appearance 编辑区字体 File | Settings | Editor | Color Scheme | Color Scheme Font Use color scheme font instead of the default 控制台字体 File | Settings | Editor | Color Scheme | Conso…

UCOS-II/III移植及相关问题【2】

移植过程中的问题&#xff1a; 提示&#xff1a;基于正点原子移植文档操作&#xff1a; STM32F767移植UCOS-II object file renamed from ‘.o‘ to ‘_1.o 提示&#xff1a;网络海淘大致就是文件重复了 解决方案&#xff1a; 将出问题的相关文件夹中文件删除重新添加 移…

大数据Vue项目必备|Window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

大数据Vue项目必备|Window下安装并使用nvm&#xff08;含卸载node、卸载nvm、全局安装npm&#xff09; 一、卸载旧版本 如果已经安装了node&#xff0c;那么需要先卸载node&#xff0c;如果没有安装那可以直接跳过这一步。 卸载&#xff1a;   打开控制面板 -> 打开程序和…

Git篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、提交对象包含什么?二、如何在Git中创建存储库?三、怎样将 N 次提交压缩成一次提交?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…

李飞飞携斯坦福联袂谷歌推出比肩Pika的视频生成模型W.A.L.T

英国数据保护监管机构敦促公司在使用人工智能&#xff08;AI&#xff09;时认真考虑人们的隐私权&#xff0c;否则不仅可能面临罚款&#xff0c;还可能失去公众对该技术的信任。信息专员约翰爱德华兹在周三的一次演讲中表示&#xff0c;公司在使用AI时必须在所有情况下保护客户…

网易有道强力开源中英双语语音克隆

项目地址&#xff08;基于PromptTTS&#xff09;&#xff1a; https://github.com/netease-youdao/EmotiVoice EmotiVoice Docker镜像 尝试EmotiVoice最简单的方法是运行docker镜像。你需要一台带有NVidia GPU的机器。先按照Linux和Windows WSL2平台的说明安装NVidia容器工具…

以企业架构为中心的SABOE数字化转型五环法

文章目录 01 传统企业数字化转型面临诸多挑战02 SABOE数字化转型五环法为企业转型破除迷雾 01 传统企业数字化转型面临诸多挑战 即将过去的2023年&#xff0c;chatGPT大模型、数据资产入表等事件的发生&#xff0c;标志着数字经济正在加速发展。数字经济是人类社会继农业经济、…

C++ Qt开发:LineEdit单行输入组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍LineEdit单行输入框组件的常用方法及灵活运用…

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…