当前位置: 首页 > news >正文

IOS自动化测试环境搭建教程

目录

一、前言

二、环境依赖

1、环境依赖项

2、环境需求与支持

三、环境配置

1、xcode安装

2、Git安装

3、Homebrew安装(用brew来安装依赖)

4、npm和nodejs安装

5、libimobiledevice安装

6、idevicesinstaller安装

7、ios-deploy安装

8、Carthage安装

9、Appium安装 【我安装的appium版本:1.21.0】

10、appium-doctor环境检查

11、WebDriverAgent安装


【B站最通俗易懂】Python接口自动化测试从入门到精通,超详细的进阶教程,看完这套视频就够了

一、前言

IOS的App自动化测试与Android的一样,也可以用appium来进行。但是IOS自动化依赖苹果的osx系统、Xcode构建等,且封闭的系统需要苹果开发者账号才可以驱动真机。Appium的环境配置有点麻烦,可能大部分时间都在处理各种稀奇古怪的报错,甚至于需要重装系统。

本文旨在记录配置过程(MacOS系统的Python和Java环境配置也有记录),给同道中人提供参考,让大家少走弯路。

二、环境依赖

1、环境依赖项

  • Xcode
  • Git
  • homebrew
  • npm、nodejs
  • libimobiledevice
  • idevicesinstaller
  • ios-deploy
  • Carthage
  • appium
  • appium-doctor
  • Webdriveragent
  • ios-webkit-debug-proxy
  • Python和Java
  • Android SDK

2、环境需求与支持

需求

版本最低要求

我的环境版本

Mac OSX

10.11+

macOS 11.3.1

iOS

9.3+

13.3、14.7

Xcode

7+

12.5

Appium

1.6+

1.21.0

驱动程序

对应iOS版本

XCUITest Driver

ios9.3或以上

UIAutomation Driver

ios9.3以下

三、环境配置

1、xcode安装

Xcode是运行在操作系统Mac OS X上的集成开发工具(IDE),iOS自动化测试使用Xcode主要用于将绑定了苹果开发者证书的WebDriverAgent打包至iOS手机。

安装方式有两种,根据你的系统版本来选择。

方式一:Mac平台的App Store安装

通过App store安装的Xcode是最新版本,需要最新版macOS系统才能兼容。如果已经升级至最新系统,可以直接在App store下载安装。最好不要升级至最新系统,可能遇到其他兼容性问题。

方式二:离线包安装

你的macOS系统不是最高版本的时候,要保证最低版本需求:macOS在10.12以上,xcode在8.1以上。

离线包下载地址:Xcode - 支持 - Apple Developer (可以选择版本)

离线包的Xcode版本选择,最好是根据你的系统版本发布时间来定,选发布时间相近的版本。我的版本是:macOS 11.3.1 、Xcode12.5

2、Git安装

安装的Xcode自带Git程序,一般Xcode安装好后不需要再单独安装Git,验证Git环境即可。如果后面的环境依赖安装出现关于Git的报错,需要更新Git,或者卸载重新安装。验证安装:git --version验证git连接:ping github.com能够连接成功时,终端显示:

安装命令:brew install git

更新Git:brew upgrade git

3、Homebrew安装(用brew来安装依赖)

Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。简单的一条指令,就可以实现包管理,而不用你关心各种依赖和文件路径的情况,十分方便快捷。类似apt-get、yum。

安装途径有两种:国外源和国内园,推荐使用国内源,我使用国外源没成功过。

方式一(国外源):

官网:Homebrew — The Missing Package Manager for macOS (or Linux)

在官网首页复制下面的安装命令,在终端执行命令安装:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

验证安装:brew -v

更新Homebrew命令:brew update && brew upgrade && brew clean

方式二(国内源):

上面的官网安装方法失败率很高,可以采用国内源安装。

homebrew国内源安装方法,终端执行下面的命令:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

终端运行时,根据提示操作:

安装结束后重启终端 或者 运行 source /Users/sinosun/.bash_profile 否则可能无法使用。

终端执行:brew update 保持最新版

最后验证安装:brew -v 得到版本号

参考(macOS升级后安装报错解决办法)

4、npm和nodejs安装

Appium是通过Node.js开发的http服务器,用来创建和控制WebDriver的session,因此需要安装Node.js。npm是Node.js的包管理工具,随同Node.js一起安装。

4.1、(方式一:brew在线安装)【我的nodejs版本是:16.6.0】

安装命令:brew install node 此方法安装的是最新版本

验证安装:node -v  得到版本号

       npm -v  得到版本号

其它在线安装方法:(指定版本安装)

终端执行命令行找到自己合适的node版本 :brew search node

查询显示最高可以安装 node14 版本

安装命令:brew install node@版本号 (会将npm和nodejs一起安装)

绑定安装的node,命令:brew link --overwrite --force node@版本号

验证安装:node -v 得到版本号

                    npm -v 得到版本号

卸载node:

brew uninstall node@版本号 --force

例如:安装的是12.18.1,卸载命令:brew uninstall node@12 --force

4.2、(方式二:离线包安装)

brew在线安装是从官网下载,速度慢且成功率低,可以通过下载离线包安装解决。

nodejs官网下载地址:Node.js 点击“Current”区域稳定版。

安装包下载并安装后,同样在终端中输入node -v 、 npm -v 验证

4.3、cnpm国内源安装

NPM安装插件是从NPM官网下载对应的插件包,该网站的服务器在国外,经常会出现下载缓慢或出现异常,这时便需要找到另外的方法提供稳定的下载,这个方法就是CNPM。阿里巴巴的淘宝团队把NPM官网的插件都同步到了在中国的服务器,提供给我们从这个服务器上稳定下载资源。

CNPM同样是NPM的一个插件,要安装的话需要在终端执行以下命令:

sudo npm install -g cnpm --registry=https://registry.npmmirror.com

验证安装:cnpm -v

4.4、npm安装插件常见报错

在终端通过npm安装插件时,前面加上“sudo”可以减少报错几率。(加上sudo后,命令以系统管理者的身份执行)

如果通过npm安装插件时,出现“npm ERR!”提示,表示安装失败。前缀加上sudo也报错,可以尝试国内源cnpm安装,只需要将命令中的npm换成cnpm。

如果终端安装过程中出现“npm WARN”提示,可以忽略。

5、libimobiledevice安装

libimobiledevice是一个使用原生协议与苹果IOS设备进行通信的库,相当于Android的adb。appium连接iOS设备必需要此依赖库,通过这个库Mac os可轻松获得iOS设备信息。支持iOS10以上系统

安装命令:brew install --HEAD libimobiledevice

卸载:brew uninstall --ignore-dependencies libimobiledevice

常用命令:

1、idevice_id -l    显示当前所连接的设备[udid],包括 usb、WiFi 连接

2、ideviceinfo       获取设备信息

3、idevicedate       获取设备时间

4、idevicename       获取设备名称

5、idevicescreenshot    截图

6、ideviceinstaller -u [udid] -i [xxx.ipa]  #xxx.ipa:安装文件路径

7、ideviceinstaller -u [udid] -U [bundleId]  #bundleId:应用的包名

检查安装:

报错参考:

报错信息: Could not connect to lockdownd, error code -3 

解决方法:修改var/db/lockdown文件夹的读写权限

在终端找到文件夹cd var/db ,找到后执行open .直接打开lockdown所在目录查看该文件的读写权限,如果没有读写权限执行命令:sudo chmod -R 777 /var/db/lockdown/

在lockdown文件夹具有读写权限以后依次执行如下命令:

brew update

brew uninstall --ignore-dependencies libimobiledevice

brew uninstall --ignore-dependencies usbmuxd

brew install --HEAD usbmuxd

brew unlink usbmuxd

brew link usbmuxd

brew install --HEAD libimobiledevice

brew install ideviceinstaller

6、idevicesinstaller安装

ideviceinstaller是一个管理连接设备的工具,与ios-deploy、Android的adb功能类似。

ideviceinstaller的功能与libimobiledevice差不多,都可以获取iOS设备的udid、安装App、卸载App、获取bundleid等,但ideviceinstaller仅支持iOS9以下系统环境,libimobiledevice支持iOS10以上系统环境。

安装命令:brew install ideviceinstaller

常用命令:

1.ideviceinstaller -l 打印app列表

7、ios-deploy安装

ios-deploy是一个使用命令行安装ios app到连接设备的工具

原理是根据os x命令行调用系统底层函数,获取连接的设备、查询/安装/卸载app

iOS10以上系统使用appium,需要依赖ios-deploy

安装:sudo npm install -g ios-deploy 或 sudo cnpm install -g ios-deploy

安装指定版本的ios-deploy

ios-deploy是一个不通过Xcode直接将app安装到手机上的工具

当然, 用Homebrew安装这个工具是很方便的

那么我们就要先安装Homebrew, 网上很多方法已经过时了, 而且由于墙的原因, 很多时候是安装不成功的.

ios-deploy常用命令:

1.ios-deploy -c 查看连接的设备(包括通过usb和wifi连接的)

2.ios-deploy -c --no-wifi 查看通过usb连接的设备

3.ios-deploy --id [udid] --bundle [xxx.app] 安装应用到指定设备(其中xxx.app是Xcode编译后的ipa的路径)

4.ios-deploy --id [udid] --uninstall_only --bundle_id [bundleId] 卸载指定设备上的应用(根据包名,也就是bundleId)

5.ios-deploy --id [udid] --list_bundle_id 查看指定设备上安装的所有应用(包括系统应用和第三方)

例如: ios-deploy --id 770dfe115807e7d494b4721b1e4ebd6ecb9424d3 --list_bundle_id

6.ios-deploy --id [udid] --exists --bundle_id [bundleId] 检查指定设备上是否安装了某个应用

例如: ios-deploy --id 0420781d4e43f1f99935513c91e9b816f4dddc24 --exists --bundle_id com.facebook.taozhen


注意:Xcode是通过离线包安装的,安装ios-deploy时会报错:

这个是由于Xcode没有设置版本的原因导致的,设置方法:进入Xcode偏好设置-->点击locations-->Comand Line Tools栏选择版本号,

然后重新执行安装命令。如下图:


检查安装:

8、Carthage安装

Carthage是一款iOS项目依赖管理工具,与cocoapods功能相似,可以帮助管理第三方依赖,类似于Java的maven。它会把第三方依赖编译成framework,以framework形式将第三方依赖加入到项目中进行使用和管理。自动化测试用到的WebDriverAgent通过Carthage管理项目依赖。

安装命令:brew install carthage

检查命令:carthage version

9、Appium安装 【我安装的appium版本:1.21.0】

appium安装有两种方式,命令行版本和桌面版本。

命令行版本appium打开速度快,可以开启多设备的自动化测试,常用于执行脚本。

桌面版本appium打开速度慢,常用于辅助元素定位。

9.1、命令行版安装

在appium官网(Redirecting)首页中有安装命令,直接复制至终端安装。命令如下:复制代码

1 > brew install node                                 # 获取 node.js
2 > npm install -g appium                         # 获取 appium
3 > npm install wd                                     # 获取 appium client
4 > appium &                                            # 开启 appium
5 > node your-appium-test.js​

上面的命令安装的是最新版本,如果要安装指定版本,执行下面的命令。

指定版本安装:

  npm install -g appium@1.20.2     ---安装的版本是appium1.20.2

如果使用npm安装报错,命令行前加上sudo执行:

  sudo npm install -g appium

卸载安装:

  npm uninstall -g appium

检查安装:appium -v

9.1.1、官网安装不成功,可以试一试淘宝镜像源:

  cnpm install -g appium

  验证安装:appium -v

9.1.2、命令行打开appium

  appium -a 127.0.0.1 -p4723   ---(默认端口4723可以任意修改,appium开启后监听端口是修改后的端口)

9.2、appium官网下载离线包安装:Redirecting

10、appium-doctor环境检查

appium-doctor命令,可用于检查appium的相关环境是否配置成功。

安装:sudo npm install -g appium-doctor

或者 sudo cnpm install -g appium-doctor

卸载:npm uninstall -g appium-doctor

检查环境配置命令:

appium-doctor

appium-doctor --ios

appium-doctor --android

安装目录:

/usr/local/lib/node_modules/appium-doctor

10.1、iOS自动化测试环境检查

终端执行命令appium-doctor --ios后,即可开始检查iOS自动化测试所需的appium环境。

检查结果中没有出现红色的“X”时,表示iOS自动化测试所必需的依赖环境都安装好了。

检查结果中有黄色的“X”时(如上图),表示非必需的环境依赖,可以暂时不管,等以后用到了这个模块再去安装。

10.2、Mac环境Android自动化测试环境检查

终端执行命令appium-doctor --android,检查Mac中通过appium对Android做自动化测试的环境。

上图中红色的“X”,表示Android自动化测试所必需的环境依赖,我最后再介绍这些依赖的安装。

环境安装走到这一步了,就可以对iOS模拟器进行自动化测试了。如果要连接控制iOS真机,还需要将webdriveragent构建至真机,Mac系统才能控制手机。

11、WebDriverAgent安装

WebDriverAgent简称WDA,是由Facebook推出的一款移动端测试框架。它是在iOS客户端实现了一个WebDriver的Server,借助这个server,可以远程控制iOS设备进行测试。官网介绍Appium驱动真实设备的地址:http://appium.io/docs/en/drivers/ios-xcuitest-real-devices/

Appium与iOS手机进行通讯就是借助的WDA,配置WDA至iOS手机之前,需要通过Xcode将苹果开发者证书编译进WDA才会生效。这个编译证书的过程是报错几率最高的步骤,我尝试好几次才找到最有效的方法。

11.1、申请苹果开发者证书

苹果开发者证书有免费和收费的,对于自动化测试来说免费版的就够用了,只不过通过Xcodego构建编译进WDA的证书只有7天有效期,7天后还需要重新构建一次。

11.2、WebDriverAgent目录

WebDriverAgent有两种来源,一种是从GitHub拉取,通过Xcode编译证书后替换掉appium里面的WebDriverAgent;另一种是直接使用appium集成的WebDriverAgent,Xcode编译证书后使用。

网络资源一般介绍第一种的比较多,但是这种方法已经不适用于新版本的Appium和Xcode。从GitHub(地址:git clone GitHub - facebookarchive/WebDriverAgent: A WebDriver server for iOS that runs inside the Simulator.)拉取的WebDriverAgent有很长时间没有更新了,通过Xcode编译证书时有很多兼容性问题。如果选择今年发布的Appium和Xcode,直接使用appium集成的WebDriverAgent基本不会报错,我选择的这种方式。

    11.2.1、进入appium的WebDriverAgent目录

  • 桌面版appium的WDA路径:

      /Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-webdriveragent

  • 命令行版appium的WDA路径:

      /usr/local/lib/node_modules/appium/node_modules/appium-webdriveragent

在appium官方文档中说明要执行下面的操作,具体起什么作用还不清楚,先按照步骤操作,以免后面报错。

以桌面版的appium为例,终端进入appium-webdriveragent目录,执行下面的命令:

mkdir -p Resources/WebDriverAgent.bundle

如果你安装的appium版本在1.20以下,还需要执行下面这行命令:

./Scripts/bootstrap.sh -d

还是以桌面版的appium为例,在Mac桌面左上角点击“前往”-->“前往文件夹”-->“输入WDA路径”-->点击"前往",即可进入appium-webdriveragent目录,找到“WebDriverAgent.xcodeproj”文件。 

11.2.2、Xcode编译证书 

双击“WebDriverAgent.xcodeproj”文件通过Xcode打开,然后对“WebDriverAgentLib”、“WebDriverAgentRunner”两个文件进行证书编译修改。在Xcode编译证书之前,需要先绑定申请过苹果开发者账号的Apple ID。进入Xcode的偏好设置后,按照下图配置ID: 

在Xcode页面找到“WebDriverAgentLib”,将“Signing”里面的Bundle Identifier改成自己命名的(与iOS手机已安装应用的bundleId要不一样),然后分别将“Build Settings”、“Info”里面的Bundle Identifier改成和第一步“Signing”里面的一样。如图所示3处:

设置好后当“Signing”分页出现“Signing Certificate Apple Development:xxxxxxxx”时表示证书编译成功。

然后同样的方法修改“WebDriverAgentRunner”里面的Bundle Identifier,注意此处的Bundle Identifier也是自己命名的。如下图:   

Xcode选择WebDriverAgentRunner连接的iOS手机:

此时所有的设置都完成了,开始“Product-->Test”构建WebDriverAgent至iOS手机:

第一次构建时会报错,如下图样式,是因为构建至手机的WebDriverAgent需要信任该描述文件。手机设置路径:设置-->通用-->设备管理-->选择描述文件并信任

信任描述文件后,Xcode再次“Product-->Test”构建一次就会成功。手机里面会出现一个“WebDriverAgentRunner-Runner”,走到这一步就可以对iOS真机进行自动化测试了。

 11.2.3、环境验证-----转发端口

构建WebDriverAgent至手机成功后,Xcode控制台就会打印出手机的ip和端口。

终端输入: iproxy 8300 8100

-----------------该工具命令用于将手机的端口号映射到电脑上的某一个端口,其中8100是手机的端口,8300是映射至Mac电脑的端口

如果映射不成功,执行命令安装:brew install usbmuxd

端口转发成功后,在浏览器Safari中输入本地地址+转发端口:http://localhost:8300/status,得到类似下面的输出即表示WebDriverAgent服务器状态正常。

 1 {2   "value" : {3     "message" : "WebDriverAgent is ready to accept commands",4     "state" : "success",5     "os" : {6       "testmanagerdVersion" : 28,7       "name" : "iOS",8       "sdkVersion" : "14.5",9       "version" : "13.3"
10     },
11     "ios" : {
12       "ip" : "192.168.3.18"
13     },
14     "ready" : true,
15     "build" : {
16       "time" : "Aug  4 2021 10:13:40",
17       "productBundleIdentifier" : "com.facebook.WebDriverAgentRunner"
18     }
19   },
20   "sessionId" : null     # 这里显示null我也不知为啥,但不影响使用
21 }

11.24、Appium启动App

通过Appium启动app,并使用inspector查找app的元素,在“Desired Capabilities”中输入下面的预期参数即可。

 1 {2   "platformName": "iOS",3   "automationName": "XCUITest",4   "platformVersion": "iOS系统版本号",5   "deviceName": "iOS手机名称",6   "bundleId": "被测试app的bundleId",7   "udid": "iOS手机设备号",8   "xcodeOrgId": "<Team ID>",9   "xcodeSigningId": "iPhone Developer"
10 }

免费版的苹果开发者账号,Team ID在构建WebDriverAgent的Xcode可以查看。申请的付费账号,登录 developer.apple.com/account查找Team ID。

12、iOS手机设置

    12.1、授权UI自动化测试

    iOS手机端进入设置 --> 开发者 --> 开启“Enable UI Automation”

    12.2、Safari浏览器开启远程自动化

    iOS手机端进入设置 --> Safari浏览器 --> 页面最下方“高级” --> 开启“远程自动化”

13、ios-webkit-debug-proxy安装

在iOS手机上进行H5页面的自动化测试,需要安装ios-webkit-debug-proxy

命令:brew install ios-webkit-debug-proxy

重新安装:brew reinstall ios-webkit-debug-proxy 

安装成功后,终端输入下面的命令查看是否能正常调起ios-webkit-debug-proxy

ios_webkit_debug_proxy -c [设备udid]:27753 -d

# 注意:在desired_capabilities参数中要加入:startIWDP: True

14、Python安装

Python官网下载地址:Python Releases for macOS | Python.org

Mac OSX自带有Python2,安装的是Python3时还需要更改环境变量,将Python3设为默认。

1.1、获取Python3的安装路径

终端输入命令:which python3

我的安装路径是:/Library/Frameworks/Python.framework/Versions/3.8/bin/python3

1.2、编辑 bash_profile 文件

终端输入命令:sudo vim ~/.bash_profile

输入Mac的登录密码后进入文本操作,输入 i 转为插入模式,写入下面命令:

PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

export PATH

alias python="/Library/Frameworks/Python.framework/Versions/3.8/bin/python3"

输入完成后按“Esc”, 然后 ‘:’ 底线命令模式, 输入 wq! 退出环境变量配置。

1.3、读取和执行命令,使配置生效

终端输入命令:source .bash_profile

1.4、requirements.txt / requests / lxml组件安装

组件不装可能会报错,终端输入命令:

pip3 install -r requirements.txt

pip3 install requests

pip3 install lxml

1.5、验证

终端输入:Python   展示安装的Python的版本,即安装成功

15、Java安装

Java_Jdk下载地址:Index of java-local/jdk 此链接为国内镜像源。

我下载的版本为:jdk-8u202-macosx-x64.dmg

1.1、安装与验证

Mac OSX系统安装很简单,按步骤就行。

安装好后在“系统偏好设置”中会有Java图标,并且在终端中输入“java -version”后,可以验证安装版本。

1.2、获取安装路径

终端中使用“open + /路径”可以打开目标文件夹。

在终端中输入:open /Library/Java/JavaVirtualMachines/  在访达中可以开启安装目录。 

我的java1.8安装路径:/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home

1.3、配置环境变量

1)终端输入命令:sudo vim ~/.bash_profile

2)输入Mac的登录密码后进入文本操作,输入 i 转为插入模式,写入下面命令:

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdk/Contents/Home

PATH=$PATH:$JAVA_HOME/bin

export JAVA_HOME

export PATH

3)按Esc退出编辑模式,进入命令行模式 :wq! 保存退出。

4)在终端输入命令 source .bash_profile 来读取和执行命令,使配置生效。

5)在终端输入命令 echo $JAVA_HOME后显示配置的home路径,说明配置成功。

16、Android SDK

Android SDK下载地址:

国内源下载:http://tools.android-studio.org/index.php/sdk

官网下载:https://www.androiddevtools.cn

下载的包解压后,在目录中> tools > 执行脚本android 进行升级安装:

环境变量配置:

1)终端输入命令:sudo vim ~/.bash_profile

2)终端中获取android-sdk-macosx目录的路径

我的路径是:/Users/sinosun/Downloads/android-sdk-macosx

3)输入Mac的登录密码后进入文本操作,输入 i 转为插入模式,输入下面命令:

ANDROID_HOME=/Users/sinosun/AutoTestdat/android-sdk-macosx

PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$ANDROID_HOME/build-tools/29.0.3

export ANDROID_HOME

export PATH

4)按Esc退出编辑模式,进入命令行模式 :wq! 保存退出。

5)在终端输入命令 source .bash_profile 来读取和执行命令,使配置生效。

6)验证 adb devices

此时,也可以在Mac中对Android手机进行自动化测试了。

终端中输入:appium-doctor    验证下iOS自动化、Android自动化测试环境的搭建是否还有问题。只要前面所有的步骤没问题,基本不会出现环境问题。

相关文章:

IOS自动化测试环境搭建教程

目录 一、前言 二、环境依赖 1、环境依赖项 2、环境需求与支持 三、环境配置 1、xcode安装 2、Git安装 3、Homebrew安装&#xff08;用brew来安装依赖&#xff09; 4、npm和nodejs安装 5、libimobiledevice安装 6、idevicesinstaller安装 7、ios-deploy安装 8、Ca…...

常用API学习08(Java)

格式化 格式化指的是将数据按照指定的规则转化为指定的形式 。 那么为什么需要格式化&#xff1f;格式化有什么用&#xff1f; 以数字类为例&#xff0c;假设有一个比分牌&#xff0c;在无人得分的时候我们希望以&#xff1a;“00&#xff1a;00”的形式存在&#xff0c;那么…...

面试题-TS(八):什么是装饰器(decorators)?如何在 TypeScript 中使用它们?

面试题-TS(八)&#xff1a;什么是装饰器&#xff08;decorators&#xff09;&#xff1f;如何在 TypeScript 中使用它们&#xff1f; 在TypeScript中&#xff0c;装饰器&#xff08;Decorators&#xff09;是一种用于增强代码功能的特殊类型声明。装饰器提供了一种在类、方法、…...

Jenkins 还可以支持钉钉消息通知?一个插件带你搞定!

Jenkins 作为最流行的开源持续集成平台&#xff0c;其强大的拓展功能一直备受测试人员及开发人员的青睐。大家都知道我们可以在 Jenkins 中安装 Email 插件支持构建之后通过邮件将结果及时通知到相关人员。 但其实 Jenkins 还可以支持钉钉消息通知&#xff0c;其主要通过 Ding…...

7.ES使用

ES多条件查询 and , or这种的 ES模糊查询 like这种的 {"wildcard": {"title.keyword": {"value": "*宣讲*"}}}说明&#xff1a; title是要匹配的关键字段名称keyword是属性&#xff0c;表示匹配的是关键字信息&#xff0c;如果不用.ke…...

Web安全基础

1、HTML基础 什么是 HTML HTML 是用来描述网页的一种语言。 HTML 指的是超文本标记语言 (Hyper Text Markup Language) HTML 不是一种编程语言&#xff0c;而是一种标记语言 (Markup language) 标记语言是一套标记标签 (Markup tag) HTML 使用标记标签来描述网页 总的来说&…...

jQueryAPI

文章目录 1.jQuery 选择器1.1 jQuery 基础选择器1.2 jQuery 层级选择器1.3 隐式迭代1.4 jQuery 筛选选择器1.5 jQuery 筛选方法1.6 jQuery 里面的排他思想1.7 链式编程 2.jQuery 样式操作2.1 操作 css 方法2.2 设置类样式方法2.3 类操作与className区别 3.jQuery 效果3.1 显示隐…...

如何将路径字符串数组(string[])转成树结构(treeNode[])?

原文链接&#xff1a;如何将路径字符串数组(string[])转成树结构(treeNode[])&#xff1f; 需求 这里的UI使用的是Element-Plus。 将一个路径字符串数组&#xff08;当然也可能是其他目标字符串数组&#xff09;&#xff0c;渲染成树。 /*source:/a/b/c/d/e/a/b/e/f/g/a/b/h/a…...

中国工程院院士陈晓红一行莅临麒麟信安调研

7月20日下午&#xff0c;中国工程院院士、湘江实验室主任、湖南工商大学党委书记陈晓红&#xff0c;湘江实验室副主任、湖南工商大学副校长刘国权&#xff0c;湘江实验室副主任、湖南工商大学党委组织部统战部常务副部长胡春华等领导一行莅临麒麟信安调研。麒麟信安董事长杨涛&…...

解决Linux环境下启动idea服务,由于权限问题无法正常启动问题

问题&#xff1a; 在Linux环境下启动idea服务&#xff0c;一直提示&#xff1a; invalid registry store file /app/appuser/.dmf/dubbo,cause:failed to create directory /app/appuser! 原因&#xff1a;文件夹中没有操作权限。 解决&#xff1a; &#xff08;1&#xff0…...

Linux6.16 Docker consul的容器服务更新与发现

文章目录 计算机系统5G云计算第四章 LINUX Docker consul的容器服务更新与发现一、consul 概述1.什么是服务注册与发现2.什么是consul 二、consul 部署1.consul服务器2.registrator服务器3.consul-template4.consul 多节点 计算机系统 5G云计算 第四章 LINUX Docker consul的…...

Redis学习2--使用java操作Redis

1、java操作Redis库的比较 Redis有各种语言的客户端可以来操作redis数据库&#xff0c;其中java语言主要有Jedis与lettuce &#xff0c;Spring Data Redis封装了上边两个客户端&#xff0c;优缺点如下&#xff1a; 2、使用Jedis操作Redis Jedis使用的基本步骤&#xff1a; 引…...

[游戏数值] 常用刷新次数钻石消耗的设计

需满足要求 以一定规律增加能够在较少次数内增加到较大数值平滑增长 设计思路 增加值INT((当前序号-1)/X)*YZ X2&#xff0c;表示希望几个一组&#xff0c;通过INT()取整可获得0、0、1、1、2、2…这样的序列Y10&#xff0c;表示基础值&#xff0c;将上述序列变为0、0、10、1…...

rancher 2.5.7 证书过期处理方案

背景&#xff1a;现场搭建的单节点 rancher 问题&#xff1a;rancher的 ui 界面无法访问 排查&#xff1a;排查rancher容器日志报错 time“2021-12-29T08:27:32.616638402Z” levelinfo msg“Waiting for master node startup: resource name may not be empty” 2021-12-29 08…...

Tomcat中的缓存配置

Tomcat中的缓存配置通常是通过Web应用程序的context.xml文件或Tomcat的server.xml文件进行设置。下面提供一个简单的案例来说明如何在Tomcat中配置缓存。 假设您的Web应用程序名为"myapp"&#xff0c;我们将在context.xml中添加缓存配置。 打开Tomcat安装目录&…...

C++ 函数模板

为了代码重用&#xff0c;代码就必须是通用的&#xff1b;通用的代码就必须不受数据类型的限制。那么我们可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化程序设计。软件模块由模板&#xff08;template&#xff09;构造。包括函数模板&#xff08;function tem…...

大语言模型分词的 chunk_size 和 chunk_overlap 说明和验证

大语言模型分词的 chunk_size 和 chunk_overlap 1. 什么是 chunk_size 和 chunk_overlap2. 实际验证 1. 什么是 chunk_size 和 chunk_overlap 对于大型语言模型如GPT-3等来说,chunk_size和chunk_overlap通常指的是文本序列的切分参数: chunk_size: 对输入文本序列进行切分的最…...

OpenStack - 构建强大的云计算平台

简介 OpenStack是一个开源的云计算平台&#xff0c;它提供了一套用于构建和管理私有云和公有云的工具和服务。OpenStack的目标是提供可伸缩性、弹性和可靠性的云基础设施服务。 组件介绍 Nova&#xff08;计算服务&#xff09; Nova是OpenStack的计算服务组件&#xff0c;负…...

在CSDN学Golang分布式中间件(ElasticSearch)

一&#xff0c;倒排索引&#xff0c;lucene 倒排索引是一种用于快速查找文本中特定单词或短语的数据结构。它将文本中的每个单词或短语与包含该单词或短语的文档列表相关联。这使得可以轻松地查找包含给定单词或短语的所有文档。 在 Go 中&#xff0c;可以使用 map 和 slice 来…...

web-文件包含

产生原因&#xff1a; 开发人员都希望代码更加灵活&#xff0c;所以通常会将被包含的文件设置为变量&#xff0c;用来进行动态调用。正是这种灵活性&#xff0c;从而导致客户端可以调用一个恶意文件&#xff0c;造成文件包含漏洞。 实际上被包含文件可以是任意格式的&#xff0…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。

1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj&#xff0c;再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)

目录 一、&#x1f44b;&#x1f3fb;前言 二、&#x1f608;sinx波动的基本原理 三、&#x1f608;波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、&#x1f30a;波动优化…...