自动化面试及答案合集大全

图片[1]-自动化面试及答案合集大全-不念博客

你觉得自动化测试最大的缺陷是什么?

  • 不稳定
  • 可靠性不强
  • 不易维护
  • 成本与收益

如何判断 case 是否通过?

断言,与预期结果进行比较。

你项目中有多少 case,通过率怎么样?

按实际回答,总数:上千个,通过率:一般是 70-80%左右。

启动浏览器的时候用到 WebDriver 协议,底层是哪个通信协议?

使用的是 HTTP 通信协议,RESTful 风格的 API 设计,JSON 格式的通信数据。

什么 PO 模式

PO 模式是 Page Object Model 的缩写。顾名思义,是一种设计模式,该模式把每个页面当成一个页面对象,页面层写定位元素方法和页面操作方法,实现脚本的 Page 和真实的网站页面 Map 起来,一一对应起来。
这样做,能使测试框架更容易维护。
比如,一个登录页面,使用 PO 模式后,会创建一个 LoginPage 的 Class,该 Class 会定义用户名输入框,密码输入框,登录按钮的 WebElement;用例层从页面层调用操作方法,写成用例,这种模式可以做到定位元素与脚本分离,其设计理念就是 PO 模式

自动化测试有什么缺点

  • 入门门槛相对功能测试来说较高,需要有一定编码基础的人才能胜任。
  • 脚本维护成本高.
  • 自动化测试无法完全替代手工测试,只能作为质量保证的一种手段。

四大金刚之 UnitTest 单元测试模块

  • test fixture:测试之前环境准备和测试之后环境清理的部件。
  • setupclass、teardownclass、setup、teardown
  • test case:测试用例。
  • test suite:测试套件,也称为测试集合。多个测试用例组合在一起就形成了测试集。
  • test runner:主要职责为执行测试,通过图形、文本或者返回一些特殊值的方式来呈现最终的运行结果。例如执行的用例数、成功和失败的用例数。
  • HTMLTestRunner:通过断言来判断以及生成测试报告。

自动化测试用例如何编写?

不管是手工还是自动化,测试用例就是一组按部就班的指令,用以验证某些功能是否符合需求。关于如何编写,可以从以下几个角度来思考:

  1. 测试环境
  2. 测试数据
  3. 测试业务
  4. 检查点/测试手段
  5. 测试环境的清理

其中,测试业务是我们最关心的一点,可以采取转化手工 case 和跟进需求的方式来进行编写。一般
在初级阶段,以基本业务流程为主(登录->完成一个业务->退出),然后,逐渐增加 case 场景。

那么自动化测试的价值是什么?怎么证明它不是伪需求?

  1. 起发现 bug,自动化测试更擅长保持旧有的功能没有 bug 出现。
  2. 入自动化测试之后,能代替大量繁琐的回归测试工作,把业务测试人员解放出来,既而让业务测试人员把精力集中在复杂的业务功能模块上。
  3. 般来说相对稳定的功能更适合自动化。
  4. 能自动化尽可能用接口、验收自动化则使用端到端。
  5. 动化技术是测试人员深化技能的必经之路。

简单介绍一下自动化项目整体框架的结构

自动化测试框架涵盖基础方法封装、自定义异常封装、工具类封装、元素管理封装、Page bject 模式封装、日志封装、数据管理封装、失败重试封装、浏览器/手机适配封装、数据库操作封装、测试用例管理封装、测试报告等等。

自动化中显式等待和隐式等待的异同?

  1. 相同点。

都是智能等待,在一定时间范围内不断查找元素,一旦找到立刻结束查找,继续执行代码,没找到,
则会一直找,直到超时为止。

  1. 不同点。

隐式等待是全局性设置,并且可以随时更改,在更改后对之后的 findxxx 方法生效,对点击、输入、滑动之类的操作不起作用;
显式等待仅仅针对单一元素或一组元素生效,并且不仅仅是针对查找,还可以针对弹框或者 frame 等
特殊情况起作用,也可以针对元素的某些属性进行自定义判断。

如何保证自动化测试的稳定性

自动化测试的稳定性主要表现在两个方面:一个是元素定位的问题,一个是用例之间的依赖问题。元素定位问题可以采用智能等待的方式尽可能的避免;用例依赖可以解耦用例之间的关系,让每条用例都从一个共同的页面开始执行。
比如首页,这就需要在测试框架中采用后置处理的方式,使每条用例执行完成后都回到首页。

自动化测试中用例依赖的数据如何构造

不管是接口自动化还是 UI 自动化都会存在自动化 case 依赖数据如何构造的问题,该问题可以从三个方面去考虑:

  • 第一个是在测试前采用接口去构造需要的数据;
  • 第二个是使用初始化 SQL 去初始化数据,但是如果说表结构复杂的话,SQL 编写也是比较大的工作量;
  • 第三个方式是提前准备好一套数据,并且将该数据对应的数据库进行备份,在之后每次执行测试前先备份当前数据库数据,再导入之前的测试数据执行测试,测试执行完后再恢复原有的数据。

请描述你们公司是如何做接口测试的?

第一步:我们会首先分析出测试需求,并拿到开发提供的接口说明文档。
第二步:从接口说明文档中整理出接口测试案例,里面要包括详细的入参和出参数据以及明确的格式
和检查点。
第三步:和开发一起对接口测试案例进行评审。
第四步:结合开发库,准备接口测试案例中的入参数据和出参数据,并整理成 csv 格式的文件。
第五步:结合接口测试案例文档和 csv 格式的数据文档,做接口测试案例的自动化案例开发。
第六步,写完自动化用例之后开始执行。
第七步,执行如有 bug,提交至禅道。
第八步,开发修改完成后,回归 bug。
第九步,完成后做自动化持续集成。


  • 获取接口规范。
  • 设计接口测试用例(主要从用户角度出发看接口能否实现业务需求,用例设计就是黑盒用例)。
  • 各种入参验证(正常情况,异常情况包括输入参数个数不对,类型不对,可选/必选,还有考虑参数有互斥或关联等的情况)。
  • 接口返回值各种验证(符合接口文档需求)。
  • 了解接口实现逻辑,实现逻辑覆盖(语句/条件/分支/判定/…)。
  • 接口的安全性,接口性能。
  • 采用工具或者自写代码来验证。
  • 发现问题报 bug,并进行状态跟踪。

怎样设计接口测试用例?

  • 是否满足前提条件。有些接口需要满足前提,才可成功获取数据。常见的,需要登录 Token。
  • 是否携带默认值参数。
  • 业务规则、功能需求。这里根据时间情况,结合接口参数说明,可能需要设计 N 条正向用例和逆向用例。
  • 参数是否必填。
  • 参数之间是否存在关联。有些参数彼此之间存在相互制约的关系。
  • 参数数据类型限制。
  • 参数数据类型自身的数据范围值限制。

接口测试,都要测什么?

可用性测试: 据约定的协议、方法、格式内容,传输数据到接口经处理后返回期望的结果。

  • 接口功能是否正确实现。
  • 返回值测试 – 返回值除了内容要正确,类型也要正确,保证调用方能够正确地解析。

参数值边界值、等价类测试。
错误和异常处理测试。

  • 输入异常值(空值、特殊字符、超过约定长度等),接口能正确处理,且按预期响应。
  • 输入错误的参数,接口能正确处理,并按预期响应。
  • 多输入、少输入参数,接口能正确处理,且按预期响应。
  • 错误传输数据格式(如 json 格式写成 form 格式)测试。

安全性测试,主要指传输数据的安全性。

  • 敏感数据(如密码、密钥)等是否加密传输。
  • 返回数据是否含有敏感数据,如用户密码、完整的用户银行账号信息等。
  • 接口是否对传入的数据做安全校验,如身份 ID 加 token 类似校验。
  • 接口是否防止恶意请求(如大量伪造请求接口致使服务器崩溃)。

性能测试,如接口的响应时间、并发处理能力、压测处理情况。

  • 并发请求相同的接口(特别为 post 请求),接口的处理情况(如插入了相同的记录导致数据出错,引发系统故障)。
  • 接口响应时长在用户可忍受的范围内。
  • 对于请求量大的接口做压测,确定最大的瓶颈点是否满足当前业务需要。

在手工接口测试或者自动化接口测试的过程中,上下游接口有数据依赖如何处理?

用一个全局变量来处理依赖的数据,比如登录后返回 token,其它接口都需要这个 token,那就用全局变量来传 token 参数。

平常做接口测试的过程中发现过哪些 Bug?

  • 常规错误,接口没实现,没按约定返回结果,边界值处理出错等。
  • 输入异常值(空值、特殊字符、超过约定长度等),接口抛错,没做封装处理。
  • 输入错误的参数、多输入、少输入参数,接口可能出现的错误。
  • 安全性问题,如明文传输、返回结果含有敏感信息,没对用户身份信息做校验,没做恶意请求拦截 等。
  • 性能问题,如接口并发插入多条相同操作,响应时间过长,接口压测出现瓶颈等。

当一个接口出现异常时候,应如何分析异常?

  • 先抓包,用 Fiddler(Charles)工具抓包,或者浏览器上 F12 调试工具。
  • App 上的话,可以用 Fiddler(Charles)做代理,通过手机设置代理去看请求和返回报文。
  • 查看后端日志,如 Linux 系统通过 Xshell 连上服务器,查看接口日志,查看是否有报错信息。(命令:tail -f 日志文件)

从开发那获取接口设计文档之后,你如何进行分析 ?

  • 单个接口的相关信息(接口功能、请求类型、请求地址、请求参数、返回值)。
  • 接口组合形成的业务。

接口测试用例设计主要使用哪些用例设计方法 ?

接口测试一般只需要考虑入参形式的变化和接口的业务逻辑,一般设计接口测试用例采用等价类、边界值、场景法居多。

接口测试执行中比对数据库吗?

需要进行,因为接口的返回值类似于提示信息,而接口对数据的操作还要进行深层次的检查。

最常用的元素定位方法是什么?如果元素定位不到你会如何分析?

最常用的元素定位方法是 XPath,当然,也会根据实际情况,用一些其它的定位方式,例如:CSS 等
定位不到元素,无非以下几种情况,一般情况下我会从简单的开始分析:

  1. 先确认是否定位信息写错,
  2. 再确认是否有窗口切换;
  3. 查看元素是否在 iframe 标签中;
  4. 元素等待的问题;
  5. 定位代码前面的步骤就有问题,导致没有到所要定位元素界面等等。

基本上定位不到元素的问题都可以解决掉。

有没有做过二次封装?封装了哪些方法?简单的描述下?

有的!
例如,
元素定位方法,
会进行显示等待,
会兼容 8 种元素定位的方法的封装;
如模拟输入:基于原有的 send
keys 方法。输入之前,加上模拟清除的操作;
再例如,窗口切换、Select 下拉框等多行实现的操作方法,都会进行二次封装。这些封装的代码,我们都会放在一个基类中,统一的进行管理。

UI 自动化解决了什么问题?你觉得其价值大不大?主要体现在哪里?

首先,个人觉得 UI 自动化测试核心解决的问题还是解决手工回归测试,基于历史功能或流程进行回归,用来代替绝大部分的回归测试工具,缩减测试过程中重复的工作。
第二,UI 自动化的脚本还可以通过运行来准备测试数据,例如,假如我要测试生成订单后的各种流程,就可以通过运行生成订单的测试用例。
我觉得 UI 自动化测试脚本如果编写的比较全面的话,价值还是很大的。就像上面说的回归测试和构造数据,不过前提是被测项目得适合做 UI 自动化,否则就是白白投入。

简单的描述下数据驱动实现的方式?数据存储在哪里?

我们之前项目数据驱动实现的方式是利用 json 和 parameterized 参数化插件实现的。json 文件用来组织定义测试数据,parameterized 用来遍历数据,读取 json 数据通过定义一个函数来进行读取。
当然,我还了解数据的存储方式还有其它很多种形式:可以直接去读取数据库的数据、也可以将测试数据定义到 Excel 文件中。具体看实际需要。

如何开展自动化测试框架的构建?

我们公司的自动化测试框架主要是由页面库,数据驱动,测试脚本,测试报告,持续集成这几个部分组成的。

页面对象库,主要是对自动化包括工具(Selenium,Appium)API 的二次封装,还有使用二次封装后的自动化工具类实现的页面元素封装(Page Object)然后,会给封装好的页面设置一个统一入口类。这其之中,还会有一个页面元素文件,专门存放元素的定位方法。

数据驱动部分,主要是测试脚本中使用的数据文件(Excel、YAML、TXT)以及读取方法类,如果数据涉及到数据库,也会把对应的数据读取方法封装到这个部分。

测试脚本,主要是通过 Pytest 测试框架进行编写的,选择其原因主要因为其支持 assert 语句断言,
适合复杂的功能测试,在执行过程中,可以自定义用例执行顺序和跳过以及预期,支持重复执行,还可兼容 UnitTest 编写的测试用例,最重要的是支持参数化和方便持续集成工具集成。

测试报告,主要是通过 Pytest 自动生成的 Allure 报告,其可读性可生动的数据表图,比 Pytest 报告能更直观的反应测试结果,也可以与 Jenkins 集成。
持续集成方面,主要是通过 Jenkins 进行实现的,目的在于测试脚本的无人值守执行,以及自动生成测试报告,方便测试人员能够省出时间进行更多的功能测试和探索性测试。(通过设置几个 git、gitlab、mailer、allure 等功能插件,配置 Allure 报告,默认邮件发送设置。用例脚本主要存放在gitlab 用例库中,设置好轮询策略之后,配置报告发送的目标邮箱,就可以实现持续集成实践中的测试环节)

如何设计自动化测试用例?

  • 编写测试脚本之前要编写测试用例,而且测试用例不能直接使用手工测试的用例。
  • 自动化的测试用例是一个完整的场景,例如,用户登录系统到用户退出系统。
  • 用例只验证一个功能点,不要试图登录后,去验证所有的功能后再退出。
  • 测试用例尽量只做正向的逻辑验证。
  • 用例之间不要产生关联,相互独立,也要高内聚,低耦合。
  • 测试用例关注的是功能逻辑的实现,字段无关。
  • 测试用例的上下文必须有一定的顺序性,前置条件清晰。
  • 检查点的设置要有所侧重,全面,灵活。
  • 测试用例对数据的操作要进行还原。
  • 测试用例必须是可回归的。
  • 用例选择遵循成本始终,构建场景,目的冒烟回归,繁琐功能,主体流程。
  • 用例转型遵循前置配置,抛异常,步骤验证,高内聚,关门归原。

怎么用 JMeter 测试接口?

如果使用 JMeter 进行接口测试:

  1. 测试前了解需求,根据接口规格说明书梳理业务;
  2. 接下来设计用例,分析接口的入参和出参,分清楚有哪些有效输入和无效输入,设计用例(原则:用最少的用例覆盖所有有效输入,针对每一个无效的输入设计一个测试用例,如果有错误码没有覆盖到,还要对每个未覆盖的错误码分别设计一个用例);
  3. 准备测试数据,比如:测试所需的账号、密码、key 等信息;
  4. 打开 JMeter,创建一个线程组,根据接口类型,填写好对应的接口地址和请求方式等;
  5. 参数化配置,添加配置元件 CSV Data Set Config,定义变量,并准备 CSV 格式的数据,变量的
    引用用${变量名}的格式;
  6. 添加断言来判断测试结果的正确性,用得最多的是响应断言;
  7. 添加监听器,比如查看结果树,对测试结果进行监听;
  8. 运行测试用例;
  9. 查看监听器结果,来判断用例的执行是成功还是失败,针对失败的用例,分析其失败原因;
  10. 针对测试中发现的问题,给开发提单,直到问题最终解决。
  11. 最后输出测试报告。

在 JMeter 上如何把上一个请求的结果作为下一个请求的参数?

使用正则表达式提取器提取上一个请求的响应中的信息,保存一个引用名称比如 abc,在下一个请求
的参数中,用${abc}的格式来引用提取的结果。
常用的正则表达式格式:(.+?),其中.表示匹配任意字符串,+表示只匹配一次,?表示匹配到就停
下来。

Python 上用过什么库/模块?

  • webdriver:定位和操作元素
  • time:设置等待时间
  • ActionChains:动作链,完成鼠标的相关操作
  • Keys:键盘的相关操作
  • WebDriverWait:设置显式等待
  • Expect_Conditions:针对单个元素,设置显式等待的场景
  • PIL:截图
  • Select:下拉选择框的操作
  • unittest python:自带的单元测试框架
  • HTMLTestRunner:运行脚本,生成报告
  • ddt:实现数据驱动测试,行为和数据分离

没有接口文档如何做接口测试

考点:
对接口测试的熟悉程度测试软技能

  1. 没有接口文档,那就需要先跟开发沟通,然后整理接口文档(本来是开发写的,没办法,为了唬住面试官,先说自己整理了)
  2. 没有接口文档,可以抓包看接口请求参数,然后不懂的跟开发沟通

接口测试用例的编写要点有哪些?

考点:
接口测试用例设计参考答案:
1)必填字段:请求参数必填项、可选项
2)合法性:输入输出合法、非法参数
3)边界:请求参数边界值等
4)容错能力:大容量数据、频繁请求、重复请求(如:订单)、异常网络等的处理
5)响应数据校验:断言、数据提取传递到下一级接口…
6)逻辑校验:如两个请求的接口有严格的先后顺序,需要测试调转顺序的情况
7)性能:对接口模拟并发测试,逐步加压,分析瓶颈点
8)安全性:构造恶意的字符请求,如:SQL 注入、XSS、敏感信息、业务逻辑(如:跳过某些关键步骤;未经验证操纵敏感数据)

接口测试中的加密参数如何处理

考点:
①. 是否熟悉加解密方式
②. 是否具备处理加密参数的能力
③. 是否实际应用过参考答案:
首先了解参数的加解密方式,常见的有 md5、aes、rsa 等等,如果是 aes 的需要找开发要私钥,如
果是 rsa 需要找开发要公钥和私钥,然后在接口测试工具中引用加解密的代码实现参数的加解密过程,
实现参数加解密的处理;如果公司有自定义的加密算法则需要找开发要加解密的代码实现,然后在测试工具中使用。

你测试的过程中主要测试哪些类型的接口?有什么区别?

之前的项目核心还是以 HTTP 接口为主,也会涉及到部分 HTTPS(当然这边实际工作中还有其它很多种类型的接口例如 WebServices,总之大同小异,不会就说不会,不要硬搬)

没有接口文档你怎么实施接口测试?

在我之前的公司,一般每次版本都会有接口文档,因为前后端需要进行联调。部分历史接口缺失会遗失掉接口文档,站在业务的角度我会先找出核心流程功能,使用 F12 的方式或者 Fiddler 抓包的方式
获取到接口地址以及请求相关信息,如有部分字段具体含义不太清楚的话,则会找对应功能模块的开发人员进行确认,然后完善自己所记录接口相关信息。
有了这些信息后,那后面接口测试实施和前面的描述没有区别。

第三方接口你怎么测试 ?

基于第三方接口的话,一般情况下会直接对接真实的第三方接口进行请求调用,获取实际响应数据后关联的到后续接口继续进行测试。部分无法直接调用的接口,例如支付,我们会使用 python 路由的方式来 mock 接口,模拟支付的各种返回情况。淡然也可以使用 Postman 来伪造接口返回数据,使用 Fiddler AutoResponder 功能。

Web View 怎么测试?

‘首先要在代码中开启 webview debug
然后输入 Chrome://inspect
然后切换 driver
获取元素控件
如果想要在继续测试原生,则需要将 driver 切换回来

如何验证复选按钮是不是被选中

以使用元素的 is selected()方法,如果返回的是 true 则说明被选中,否则表明未被选中

如何处理 alert 弹窗?

先定位跳转到 alert 上,然后点击确认或取消
Alert alert = dirver.swichTo().alert();//切换到 alert
alert.accept();//确定
alert.dismiss();//

下拉菜单如何选择一个菜单项?

如 果 下 拉 菜 单 是 select 标 签 , 使 用 方 法 select By Value() 或 者 selectByIndex() 或 者 selectByVisibleText()即可
如果这个下拉菜单不是通过 select 标签创建,则直接通过 xpath 定位元素然后去点击选择

你如何模拟浏览器的前后移动?

driver.navigate().back(); driver.navigate().forward();

你如何获得当前页面的 URL?

driver.getCurrentUrl();

如何从文本框中获取打字文本?

通过将 arg 作为值传递来使用 getAttribute(“value”)方法。
String typedText = driver.findElement(By.xpath(“xpath of box”)).getAttribute(“value”));

你如何清除中文本框的内容

使用 clear()方法。
driver.findElement(By.xpath(“xpath of box”)).clear();

web 自动化中有哪些场景需要特殊处理

  1. iframe 元素,当要操作的元素在 iframe 中是需要先将 driver 切换至该 iframe 才能操作,切换方式有四种,通过 id、name、索引、iframe 元素对象,并且在多 iframe 切换时还需要进行各种转换。
  2. 新窗口打开,当要操作的元素在一个新窗口打开的页面上时,就需要先将 driver 切换至新窗口上才能进行操作。
  3. 时间控件,通常时间控件只能选择无法输入,那么可以采用 js 的方式修改时间控件的只读属性然后再进行输入,或者用 js 直接修改时间控件的 value 值。
  4. 元素不在当前视野需要滚动才会出现,可以采用 js 的方式滚动,但是有时候界面中有多个滚动条 js就会无效,则需要先将光标置入到滚动条区域然后模拟键盘的上下左右键来操作。

webdriver 如何开启和退出一个浏览器?

开启:dr = webdriver.浏览器类型()
关闭:dr.quit()

遇到 frame 框架页面怎么处理?

先用 driver.switch_to.frame()跳转进去 frame,
然后再操作页面元素,
操作完后使用 driver.swith_to.default_content()跳转出来

遇到 alert 弹出窗如何处理?

使用 driver.switch_to.alert 方法先跳转到 alert 弹出窗口
然后再通过 accept 点击确定按钮,通过 dismiss 点击取消难,通过 text()获得弹出窗口的文本。

如何处理多窗口?

这个多窗口之间跳转处理,我们在项目中也经常遇到。就是,当你点击一个链接,这个链接会在一个新的 tab 打开,然后你接下来要在新 tab 打开的页面查找元素,

  1. 我们在点击链接前使用 driver.current_window_handle 获得当前窗口句柄。
  2. 再点击链接。点击后通过 driver.window_handles 获得所有窗口的句柄,
  3. 然后再循环找到新窗口的句柄,然后再通过 driver.switch_to.window()方法跳转到新的窗口。

怎么验证元素是 enable/disabled/checked 状态?

定位元素后:分别通过 isEnabled(),isSelected(),isDisplayed()三个方法进行判断。

在日历这种 web 表单你是如何处理的?

首先要分析当前网页试用日历插件的前端代码,看看能不能通过元素定位,点击日期实现,如果不能,可能需要借助 javascript。还有些日历控件一个文本输入框,可以直接 sendKeys()方法来实现传入一个时间的数据。

selenium 中 hidden 或者 是 display = none 的元素是否可以定位到?

  • 可以:定位是可以定位到的,但是不能操作,可以判断元素 is._displayed(想点击的话,可以用 js 去掉 dispalay=none 的属性;
  • 不能:可以写 JavaScript 将标签中的 hidden 先改为 0, 再定位元素。两个答案都算对,说明出原因即可。

selenium 中如何保证操作元素的成功率?也就是说如何保证我点击的元索一定是可以点击的?

添加元素智能等待时间 driver.implicitly. _wait(30)
添加强制等待时间(比如 python 中写 sleep)
try 方式进行 id,name,clas,x path, Css selector 不同方式进行定位,如果第一种失败可以自动尝试第二种

如何去定位页面上动态加载的元素?

  1. 触发动态加载元素的事件,直至动态元素出现,进行定位
  2. WebDriverWait () 方法循环去查询是否元素加载出来了

如何去定位属性动态变化的元素?

xpath 或者 css 通过同级、父级、子级进行定位
点击链接以后,selenium 是 否需要自动等待该页面加载完毕? 答:需要

关闭浏览器中 quit 和 close 的区别

简单来说,两个都可以实现退出浏览器 session 功能,close 是关闭你当前聚焦的 tab 页面,而 quit是关闭全部浏览器 tab 页面,并退出浏览器 session。知道这两个区别,我们就知道 quit 一般用在结束测试之前的操作,close 用在执行用例过程中关闭某一个页面的操作。

使用 monkey 测试了什么内容?测试过程中有没有发现问题?

使用 monkey 验证 app 在大量随机性操作的下时候是否会崩溃,主要是用于验收测试阶段。
测试过程中是有发现问题的,在我之前的项目中,在使用 monke 执行第二次压力测试时,app 突然崩溃,当我查看日志信息显示 NullPointerException ,并记下 seed 值,将错误复现了一遍,发现依然报错,就截图发给对应的开发确认是什么问题导致的

© 版权声明
THE END
喜欢就支持一下吧
点赞86赞赏 分享
评论 抢沙发
头像
欢迎光临不念博客,留下您的想法和建议,祝您有愉快的一天~
提交
头像

昵称

取消
昵称

    暂无评论内容