精华内容
下载资源
问答
  • expect是一款自动化的脚本解释型的工具,远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。 在实际工作...

    1、前言

    expect是一款自动化的脚本解释型的工具,远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。

    在实际工作中,我们运行命令、脚本或程序时,这些命令、脚本或程序都需要从终端输入某些继续运行的指令,而这些输入都需要人为的手工进行。而利用expect,则可以根据程序的提示,模拟标准输入提供给程序,从而实现自动化交互执行。

    2、安装expect

    yum install expect 或 brew install expect

    3、语法

    #执行脚本的方式

    expect 脚本路径

    #脚本文件后缀名

     .sh 或 .exp

    # 脚本内容开头
    expect脚本一般以#!/usr/bin/expect -f 或 #!/usr/bin/expect 开头

    # 设置并定义了变量user,变量值为"root"
    set user "root" 

    # 设置超时时间3s
    set timeout 3

    # 开启一个会话(进程),表示使用spawn来执行ssh $user@$10.10.10.121命令,该命令只有在expect环境里才能执行,所以直接在命令行输入或没有安装expect则会报错
    spawn ssh $user@10.10.10.121

    # 匹配终端输出的内容,匹配到后输入$password\r(\r=回车)
    expect "password:*" {send "$password\r"}

    # 输出内容
    puts "执行成功"

    # 将脚本的控制权交给用户,用户可继续输入命令

    interact

    # 退出 eof\r或exit\r都可以
    expect "~]#" {send "eof\r"}

    4、例子

    这是一个远程登录redis服务器清除缓存的例子

    #!/usr/bin/expect -f
    # 设置并定义了变量user,变量值为"root"
    set user "root" 
    set host "10.10.10.112"
    set password "xxxxx"
    # 设置超时时间3s
    set timeout 3
    # 表示使用spawn来执行ssh $user@$host命令,该命令只有在expect环境里才能执行,所以直接在命令行输入或没有安装expect则会报错
    spawn ssh $user@$host
    # 匹配终端输出的内容,匹配到后执行$password\r(\r=回车)
    expect "password:*" {send "$password\r"}
    expect "~]#" {send "redis-cli -h 10.10.10.112 -p 9001 flushdb\r"}
    expect "~]#" {send "redis-cli -h 10.10.10.112 -p 9002 flushdb\r"}
    # 退出 eof\r或exit\r都可以
    expect "~]#" {send "eof\r"}
    # 输出内容
    puts "redis缓存清理成功"

     

     

     

    展开全文
  • 搞定shell脚本expect自动化交互输入密码等就是这么简单

    一、问题

    因为我把Mysql和Redis都是安装在了docker中(我本机是Linux系统,然后本机中安装了docker),每次开机都是先启动docker,然后输入密码,很麻烦

    因为root权限是最高的,咱们不能拿root直接使用,不然操作失误之后,造成的损失可想而知(例如:一不小心用root执行了一个:\rm -r /)。

    展开全文
  • 随着软件发展到不同的阶段对自动化会有不同的测试需求,因此也产生了多种测试类型,然而万变不离其宗,一切皆可自动化

    随着软件发展到不同的阶段对自动化会有不同的测试需求,因此也产生了多种测试类型,然而万变不离其宗,一切皆可自动化

    单元测试

    单元测试也可以看做是代码层的测试,而但凡成熟的语言都附有单元测试框架,例如Java的Junit和TestNG,例如Python的Unittest和Pytest,在很多场合我都曾强调,单元测试才是自动化的核心,从某种意义上讲具备单元测试框架的语言就都能进行单元测试的自动化执行,而这最小单元可以是一个函数、一个方法、一个类或是一个模块

    然而很多公司的研发团队虽然要求单元测试,但很少要求交付单元测试报告的,也有很多公司的单元测试是有自动化测试团队承担的,虽然测试无法穷尽,但测试不同的输入、边界值、非法值、默认值、异常情况等等是基本要求,而这些内容让研发团队自行去做,若非严格的制度限制,又如何能保证高速迭代的环境里真的能达到单元测试目的呢,研发人员的兴趣点绝大多数都在创造力上,他们更喜欢开发新东西,而对质量兴趣不大

    功能测试

    通常情况下,功能测试是测试团队介入的第一个阶段,开发人员将完成的功能特性写成文档输出给测试团队,测试团队根据这些文档开发设计测试用例,最后执行测试用例,对功能进行验证,理想情况下,如果功能特性文的规范写的足够清晰,测试团队应该在功能开发完成之前就开发完测试用例,甚至可以根据这些用例来编写自动化测试用例

    然而尽管大多数情况下,都希望根据质量体系的规范输出详尽的文档,但实操起来确是各种问题:

    • 功能文档不规范,协作之间理解不一致,出现偏差,导致设计的用例变成了无效用例
    • 需求变更,导致功能特性更新,直接影响原先的测试用例设计
    • 新功能不稳定,导致测试用例无法顺利执行

    以第三点新功能不稳定为例,过早的执行自动化测试会被不稳定的新功能阻碍住,一个严重的问题可能导致很多用例无法执行或执行失败,最终仍然需要人来干预执行结果的,认为进行判断甚至重复劳动,这就使得自动化不那么自动了,也就是说需要人值守,遇到问题后手动介入解决
    测试开发也是软件开发的一个类型,其本身的质量不能和被测系统的质量纠缠到一起,否则会让问题的排查更为复杂

    因此,如果非牛逼的研发团队,自动化测试用来辅助测试提升测试效率的角度出发更为实际,将其用于单元测试自动化,接口测试自动化,辅助自动化工具类将成为相当可行的选择,当功能相对稳定后,在全面的实现自动化测试。

    再不然,对于功能测试而言非要强行引入自动化测试,那么测试用例本身的构建和修改一定要非常迅速,自动化测试框架需要提供快速构建用例的能力,以此来响应需求的变更,测试代码的健壮性和灵活性要求非常高,从而应对不稳定的功能产生的阻塞,并且还要对灾难性的错误进行测试环境上的自动恢复

    回归测试

    回归测试时软件开发迭代阶段的一种测试,主要是保障原有的功能没有因为新功能的引入而导致功能回退,在这个阶段自动化测试将得到大量的应用,相对于新功能的不稳定,回归测试的目标是已经发布的或者稳定的功能,相应的测试代码也相对比较稳定,自动化代码也已经经过多轮的完善,执行结果相对也会稳定的多

    可用性测试及冒烟测试

    可用性测试和冒烟测试都是一种快速验证的过程,测试周期很短,为保证这种快速验证,有些测试团队会针对性的快速开发一些用例,然而这些用例往往又和实际的功能测试验证点重复,因此在大量自动化测试用例中迅速抽取核心的测试用例集,然后将测试用例集集成到整个团队的CI中,将测试用例的执行放在编译的job后作为下游任务,当编译结束后自动执行下游任务,而对于一些持续CD情况中,自动化又需要集成在发布上线前的节点,来保证上线的包不存在基本功能问题

    系统测试

    系统测试是一个复杂的测试过程,其主要目的是使被测产品的众多功能甚至是产品本身的集合,以系统级别运行时进行行为级别的验证,其测试类型非常多样且复杂,例如:

    • 相对于功能测试比较固定的测试环境,系统测试环境比较复杂,配置繁多,不固定,不稳定,在这种情况下,自动化测试需要足够灵活的应对不同的环境配置来执行相同的测试目的
    • 测试用例的兼容性要足够强,稳定性足够强,且被测系统的稳定性足够强
    • 压力测试和性能测试的需求,自动化测试应能够快速的集成相应的标准性能测试设备或工具
    • 客户场景模拟测试,即便再聪明的测试工程师能够设计出种类繁多的测试方案,总有想象不到的场景,客户才是麻烦的最佳制造者,因此很多企业会花一些经历收集客户场景,并加入到系统测试的模拟场景中

    可以看出,自动化测试要有足够的弹性来匹配不同的测试场景,而不是通过不同的测试用例来对应不同的场景,同时要具备足够的可扩展性,能够加入不同的第三方工具或者设备来满足更多的测试场景

    展开全文
  • 无论是Xcode的Archive打包和导出还是运行脚本xxx.sh文件,基本都是基于xcodebuild工具,只是在Xcode 8.3之前通常使用的是xcodebuild archive 和xcodebuild xcrun ,在之后的Xcode...exportArchive 来实现自动化打包...

    无论是Xcode的Archive打包和导出还是运行脚本xxx.sh文件,基本都是基于xcodebuild工具,只是在Xcode 8.3之前通常使用的是xcodebuild archive 和xcodebuild xcrun ,在之后的Xcode8.3以后的版本 9.0,10.0,都是基本基于xcodebuild archive 和xcodebuild -exportArchive 来实现自动化打包。

    首先,来看一下xcodebuild的常用命令,可以通过 man xcodebuild来查看,

    如果要查看xcodebuild的使用实例,可以通过使用命令 xcodebuild --help来查看。

    如果要查看当前工程的常用配置:可以使用 xcodebuild -list,可以看到工程的Target ,scheme,configuration配置参数。

     

    在打包的过程中 实际使用到的命令 一共也就三个 xcodebuild clean 表示清理工程。

    • xcodebuild clean

    1.如果不是workspace容器承载的项目,

    xcodebuild clean -project ${ProjectName}.xcodeproj -target ${Target} -scheme ${scheme} -configuration ${Debug或者Release}  -quiet -UseNewBuildSystem=NO
    • ${ProjectName} 工程的项目名字
    •  ${Target} 当前要运行的Target 
    • ${scheme} 当前要编译运行的scheme
    • ${Debug或者Release} 当前是要以Debug运行还是以Release运行
    • -quiet 忽略警告提示打印
    • -UseNewBuildSystem=NO 是否使用新的build系统 

    2.如果是工程是workspace承载的,可以使用xcodebuild命令

    xcodebuild clean -workspace ${workspace名字}.xcworkspace -scheme ${scheme名字} -configuration${Debug,Release}  -UseNewBuildSystem=NO
    • ${workspace} 工程中,.xcworkspace的文件名字 
    • ${scheme} 当前要编译运行的scheme
    • configuration ${Debug或者Release} 当前是要以Debug运行还是以Release运行
    • -quiet 忽略警告提示打印
    • -UseNewBuildSystem=NO 是否使用新的build系统 

    这是属于日常的工程清理,或者打包之前的工程清理。

    • xcodebuild archive 编程打包文件
    xcodebuild archive -workspace  ${workspace名字}.xcworkspace -scheme ${scheme} -configuration ${Debug,Release} -archive_path=${archive_path}

    1.如果不配置证书 和运行文件

    • ${workspace} 工程中,.xcworkspace的文件名字 
    • ${scheme} 当前要编译运行的scheme
    • configuration ${Debug或者Release} 当前是要以Debug运行还是以Release运行
    •  -archive_path 导出文件的路径 

    示例:

    xcodebuild archive -workspace  GomeShop.xcworkspace -scheme  GomeShop -configuration Release -archive_path=/Users/xiaofeiniao/Desktop

    2.配置证书文件的

    xcodebuild archive -workspace ${workspace}.xcworkspace -scheme ${scheme} -configuration ${Debug,Release} -archivePath ${archivePath} CODE_SIGN_IDENTITY = ${CODE_SIGN_IDENTITY} PROVISIONING_PROFILE=${PROVISIONING_PROFILE}
    • ${workspace} 工程中,.xcworkspace的文件名字 
    • ${scheme} 当前要编译运行的scheme
    • configuration ${Debug或者Release} 当前是要以Debug运行还是以Release运行
    •  -archive_path 导出文件的路径 
    • CODE_SIGN_IDENTITY 证书文件名
    • PROVISIONING_PROFILE 运行文件UUID

    CODE_SIGN_IDENTITY获取方法:

    打开你的钥匙串访问->选中其中一个证书->右键->显示简介,把标题复制出来就可以了。

    格式:

    iPhone Distribution: xxxx e-commerce Co., Ltd. (KYACQ4K486)

    获取Provisioning文件UUID

    在xcode8.0以上,Provisioning文件的位置是:

    /Users/用户名/Library/MobileDevice/Provisioning Profiles

    在终端上面进入的文件夹。使用/usr/bin/security可以把Provisioning文件解密

    /usr/bin/security cms -D -i xxx.mobileprovision

    打开之后,就是一个plist格式的文件。

    示例:

    xcodebuild archive -workspace GomeShop.xcworkspace -scheme GomeShop -configuration Release -archivePath "~/Desktop/GomeShop.xcarchive" "CODE_SIGN_IDENTITY ="iPhone Distribution: Xin rui mei e-commerce Co., Ltd. (KYACQ4K486)" PROVISIONING_PROFILE="c7ec43dc-a544-4f84-b787-a86ff8770a65"
    • xcodebuild -exportArchive 导出IPA包
    xcodebuild -exportArchive -archivePath archive文件的地址.xcarchive 
                              -exportPath 导出的文件夹地址 
                              -exportOptionsPlist exprotOptionsPlist.plist 
                              CODE_SIGN_IDENTITY=证书 
                              PROVISIONING_PROFILE=描述文件UUID
    

    示例:

    xcodebuild -exportArchive  -archivePath "~/Desktop/TestArchive/GomeShop.xcarchive" -exportPath "~/Desktop/TestArchive/GomeShop.ipa" -exportOptionsPlist "~/Desktop/TestArchive/exprotOptionsPlist.plist"

    同样,在导出包的时候,也可以不用证书和描述文件,如果不需要的话,可以把两个配置参数去掉,

    exportOptionsPlist这个参数,它是一个plist文件。

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
    	<key>provisioningProfiles</key>
    	<dict>
    		<key>com.gomeshop.release</key>
    		<string>Dist_GM_GomeMeishop</string>
    	</dict>
    	<key>teamID</key>
    	<string>KYACQ4K486</string>
    	<key>method</key>
    	<string>app-store</string>
    	<key> compileBitcode</key>
    	<false/>
    </dict>
    </plist>

    其他字段的描述

    Available keys for -exportOptionsPlist:
    
        compileBitcode : Bool
    
            For non-App Store exports, should Xcode re-compile the app from bitcode? Defaults to YES.
    
        embedOnDemandResourcesAssetPacksInBundle : Bool
    
            For non-App Store exports, if the app uses On Demand Resources and this is YES, asset packs are embedded in the app bundle so that the app can be tested without a server to host asset packs. Defaults to YES unless onDemandResourcesAssetPacksBaseURL is specified.
    
        iCloudContainerEnvironment
    
            For non-App Store exports, if the app is using CloudKit, this configures the "com.apple.developer.icloud-container-environment" entitlement. Available options: Development and Production. Defaults to Development.
    
        manifest : Dictionary
    
            For non-App Store exports, users can download your app over the web by opening your distribution manifest file in a web browser. To generate a distribution manifest, the value of this key should be a dictionary with three sub-keys: appURL, displayImageURL, fullSizeImageURL. The additional sub-key assetPackManifestURL is required when using on demand resources.
    
        method : String
    
            Describes how Xcode should export the archive. Available options: app-store, ad-hoc, package, enterprise, development, and developer-id. The list of options varies based on the type of archive. Defaults to development.
    
        onDemandResourcesAssetPacksBaseURL : String
    
            For non-App Store exports, if the app uses On Demand Resources and embedOnDemandResourcesAssetPacksInBundle isn't YES, this should be a base URL specifying where asset packs are going to be hosted. This configures the app to download asset packs from the specified URL.
    
        teamID : String
    
            The Developer Portal team to use for this export. Defaults to the team used to build the archive.
    
        thinning : String
    
            For non-App Store exports, should Xcode thin the package for one or more device variants? Available options: <none> (Xcode produces a non-thinned universal app), <thin-for-all-variants> (Xcode produces a universal app and all available thinned variants), or a model identifier for a specific device (e.g. "iPhone7,1"). Defaults to <none>.
    
        uploadBitcode : Bool
    
            For App Store exports, should the package include bitcode? Defaults to YES.
    
        uploadSymbols : Bool
    
            For App Store exports, should the package include symbols? Defaults to YES.

    完成上诉操作,就可以直接打包出.ipa包了。

    学习博客:

    https://www.cnblogs.com/sidesky/p/5102278.html

    https://www.jianshu.com/p/2d1c6fdc88f2

    https://www.jianshu.com/p/3f43370437d2

    展开全文
  • shell中交互输入自动化

    千次阅读 2018-07-13 17:51:26
    shell中交互输入自动化shell中有时我们需要交互,但是呢我们又不想每次从stdin输入,想让其自动化,这时我们就要使shell交互输入自动化了。这个功能很有用的哟。好好学习。1 利用重定向 重定向的方法应该是最简单的...
  • 说明:该篇博客是博主一字一码编写的,实属...自动化工具能自动打开程序、自动执行测试用例、自动查找控件、自动产生数据、自动输入数据、自动操作控件、自动收集结果、自动比较实际结果与预期结果是否一致。 2.软...
  • 对于手动测试项目,成本消耗因素为:人工具–测试/缺陷管理基础设施–环境时间训练对于自动化项目,除上述项目外,还需要支出以下费用:自动化工具用于测试管理工具集成的加载项支持AUT的加载项(...
  • 滚雪球学 Python 番外系列,自动化测试是个啥?

    万次阅读 多人点赞 2020-12-12 23:11:07
    本系列专栏是滚雪球学 Python 的番外篇之一,自动化测试。希望有需要的同学可以喜欢,本专栏文章风格会走逗趣路线。 啥是自动化测试 测试,就是测一下开发人员弄出来的软件有没有BUG。 自动化测试,就是利用工具...
  • 例如脚本里面执行mkfs.ext3,会回显提示信息Y/N。需要用户手工确认。但是我们想自动化自动执行。可以用如下方法: echo y | mkfs.ext3 /dev/sda3
  • 我在自动化测试过程中遇到一个输入框,输入框最大长度为7。代码在输入框中输入10000,输入框中显示为1000010。但是手动输入时输入10000,显示为10000,没有出现问题。这是什么原因,有没有什么解决方法? 代码...
  • Android自动化测试探索

    千次阅读 2017-08-04 19:23:56
    Android自动化测试探索前言通常来说,我们开发完成产品之后,都是由测试组或者是我们自己点一点,基本上没有问题了就开始上线。但是,随着时间的堆叠,一款产品的功能也越来越多。这时,我们为了保证产品的质量,就...
  • Expect 自动化交互式程序

    万次阅读 2019-11-17 16:25:10
    在现今的运维中,自动化运维已经成为运维的主流趋势,但是在很多情况下,执行系统命令或程序时,系统会以交互式的形式要求运维人员必须输入指定字符之后才能继续执行命令。例如,为用户设置密码时,一般情况下就需要...
  • Web自动化测试(全网最给力自动化教程)

    万次阅读 多人点赞 2017-08-27 19:22:26
    python+selenium自动化软件测试(第2章):WebDriver API 欢迎您来阅读和练手!您将会从本章的详细讲解中,获取很大的收获!开始学习吧! 目录 2.1 操作元素基本方法2.2 常用8种元素定位(Firebug和...
  • Web自动化测试

    千次阅读 2019-02-26 17:04:50
    1. 什么是自动化? 概念:由机器设备代替人为自动完成指定目标的过程 1.1 优点: 1. 减少人工劳动力 2. 工作效率提高 3. 产品规格统一标准 4. 规模化(批量生产) 2. 什么是自动化测试 概念:让程序代替...
  • Python自动化完成tb喵币任务

    万次阅读 多人点赞 2019-10-24 23:12:26
    2019双十一,tb推出了新的活动,商店喵币,看了一下每天都有几个任务来领取喵币,从而升级店铺赚钱,然而我既想赚红包又不想干苦力,遂使用python来进行手机自动化操作,目测全网首发! 用到的库: re os time ...
  • Web自动化测试实战(一)

    万次阅读 多人点赞 2019-08-23 15:41:39
    一丶认识web自动化测试 1. 什么是自动化测试? 2.为什么进行自动化测试? 3.自动化测试的分类 二丶元素定位 1.为什么要学习定位元素? 2.元素定位的工具或手段有哪些? 3.环境及工具 4.css选择器 一丶认识web...
  • 微服务下的持续集成-Jenkins自动化部署GitHub项目

    千次阅读 多人点赞 2020-11-19 22:56:14
    文章目录一、DevOps概念二、为什么要做持续集成三、常见云服务四、手动部署Jenkins五、Jenkins + Maven +Git 自动化继承/测试 一、DevOps概念 持续集成服务(Continuous Integration,简称 CI) 它绑定 Github 上面...
  • 每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。 (2)没有持续集成 项目做模块集成...
  • UI自动化简介

    千次阅读 2021-02-08 11:12:46
    UI自动化测试,即通过模拟手动操作用户UI界面的方式,以代码方式实现自动操作和验证的一种自动化测试手段。分为Web端和App端,Web端以Selenium驱动web UI的自动化测试为主流。App端的appium,还有诸如uiautomator、...
  •  就软件测试中就自动化测试是否终将能替代手动测试的问题,我想先介绍一下手动测试和自动化测试。 1. 手工测试的概念  所谓的手工测试就是测试人员按照事先为覆盖被测软件需求编写的测试用例,根据测试大纲中...
  • 一、场景描述: 运行着关键业务的windows服务器或托管在IDC机房,或宿主... 基于以上,那,有没有一种方式可以自动化的管理服务呢,当服务当掉后,可以自动的无人工参于的情况下第一时间侦测到服务当掉,并运行开启...
  • 关键字驱动自动化测试

    千次阅读 2018-08-17 11:37:33
    为 了提高测试效率和准确性,越来越多的测试工作引入了自动化测试的思想和方法,随着自动化测试工具的发展,自动化测试更加容易实现更高效。实践证明,软件自 动化测试技术帮助软件开发和测试人员在更短的时间内开发...
  • “ 介绍有关自动测试工具-uirecorder环境搭建” 01—目录 1.介绍 2.注意事项 3.介绍 4.环境搭建 5.重点提及一下nodejs的安装。 6.创建一个工程:录制web页面 7.扩展:录制app   02—注意事项 1.文件夹...
  • Jenkins集成TestNG Junit自动化测试

    万次阅读 2017-08-18 16:10:17
    自动化测试是Jenkins持续集成和部署的又一核心价值体现,我们先来做一个基于Junit 的 TestNG 测试。我们的实现步骤是:1、在Jenkins上安装xUnit插件;2、在Eclipse上安装TestNG插件;3、编写Junit测试及TestNG.xml...
  • 自动化测试工具QTP的使用实例

    万次阅读 2015-06-17 00:23:04
    QTP功能与特点QTP是QuickTest Professional的简称,是一种自动化软件测试工具。在软件的测试过程中,QTP主要来用来通过已有的测试脚本执行重复的手动测试,用于功能测试和回归测试。使用QTP要求测试人员在测试前考虑...
  • RPA--机器人流程自动化工具介绍 RPA是谁? 确切来说,它并不是一个真实的、肉眼可见的机器人,而是流程自动化服务。 RPA的全称为机器人流程自动化(Robotic Process Automation),是一款软件产品,可模拟人在...
  • 什么是自动化部署就是实现一次提交代码后。服务器端可以直接自动拉取代码发布成服务。无需繁琐的手动操作。 想要实现自动化首先需要理解。如何将程序发布为windows服务:=>... 自动化部署 1.安装jdk.(jenkins所需的...
  • 消除无效率 - 运维工作的手动工作,如果可以实现自动化,将显著提升效率水平。 减少错误 - 即使最谨慎的人,也会犯错,尤其是面对着重复性工作。通过运维自动化工具来完成这样的工作,结果是显而易见的,错误率将...
  • 在Ubuntu 14.04使用cron实现作业自动化

    万次阅读 2015-08-04 15:00:34
    在Ubuntu 14.04使用cron实现作业自动化作者:chszs,版权所有,未经同意,不得转载。博主主页:http://blog.csdn.net/chszsCron是Linux系统中最有用的工具之一,cron作业是在指定时间到来时被调度执行的作业。 最...
  • 5种比较常见的自动化测试框架

    千次阅读 2020-10-26 14:34:43
    自动化测试框架

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 246,048
精华内容 98,419
关键字:

自动化手动输入