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

学海记录项目测试报告

在这里插入图片描述

⭐️前言⭐️

本篇文章是博主基于学海记录的个人项目所做的测试报告,用于总结运用自动化测试技术,应用于自己的项目。

🍉欢迎点赞 👍 收藏留言评论 📝私信必回哟😁

🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言

🍉博客中涉及源码及博主日常练习代码均已上传GitHub


请添加图片描述

📍内容导读📍

  • 🍅1.UI自动化测试用例
  • 🍅2.selenium4+JUnit5实现Web自动化测试
    • 2.1 测试工具类
    • 2.2 博客登录页测试
    • 2.3 博客列表页测试
    • 2.4 博客详情页测试
    • 2.5 博客编辑页测试
    • 2.6 驱动释放
    • 2.7 测试套件
    • 2.8 测试结果展示

🍅1.UI自动化测试用例

请添加图片描述

🍅2.selenium4+JUnit5实现Web自动化测试

针对上图中的UI自动化测试用例,挑选部分用例通过selenium4+JUnit5实现Web自动化测试,如下是具体实现:

2.1 测试工具类

因为每一步的测试都需要获取驱动对象,所以将获取驱动对象的方法抽象出来单独成类,用于其他类的使用;

便于检查测试结果,还需要在公共类中实现屏幕截图的方法,以下是测试工具类的具体代码:

public class Utils {public static ChromeDriver driver;// 创建驱动对象public static ChromeDriver createDriver() {// 设置无头模式ChromeOptions options=new ChromeOptions();options.addArguments("-headless");// 驱动对象已经创建好了/没有创建if(driver==null) {driver=new ChromeDriver(options);// 创建隐式等待(防止因页面加载过慢而导致错误)driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));}return driver;}public static List<String> getTime() {// 文件按照天的维度按文件夹进行保存SimpleDateFormat sim1=new SimpleDateFormat("yyyyMMdd-HHmmssSS");SimpleDateFormat sim2=new SimpleDateFormat("yyyyMMdd");String fileName=sim1.format(System.currentTimeMillis());String dirName=sim2.format(System.currentTimeMillis());List<String> list=new ArrayList<>();list.add(dirName);list.add(fileName);return list;}/*** 获取屏幕截图,把所有的用例执行结果保存下来*/public static void getScreenShot(String str) throws IOException {List<String> list=getTime();String fileName="./src/test/java/screenshot/"+list.get(0)+"/"+str+"_"+list.get(1)+".png";File srcFile=driver.getScreenshotAs(OutputType.FILE);// 把屏幕截图生成的文件放到指定的路径FileUtils.copyFile(srcFile,new File(fileName));}
}

2.2 博客登录页测试

首先先获取到驱动对象,然后通过@Before注解方法,访问到登录页面的URL。

public static ChromeDriver driver= Utils.createDriver();// 如果要测试登录页面,以下所有的用例都有一个共同的步骤// 1、要有浏览器对象  2、访问登录页面的URL@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/login.html");}

通过检查跳转后的博客列表页的元素是否存在,检查登录页面打开是否正确

/*检查登录页面打开是否正确检查点:公共主页 注册元素是否存在*/@Test@Order(1)void loginLoad() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));Utils.getScreenShot(getClass().getName());}

多参数实现正常登录的测试

    /*检查正常登录情况*/@ParameterizedTest@CsvSource({"admin,admin","zhangsan,123"})@Order(2)void loginSuccess(String name,String password) throws IOException, InterruptedException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对登陆结果进行检测,Alert alert=driver.switchTo().alert();String expect="登录成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());driver.navigate().back();}

检验异常登录的情况

 /*检查异常登录情况*/@ParameterizedTest@CsvSource({"admin,123"})@Order(3)void loginFail(String name,String password) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="抱歉:用户名或密码错误,请重新输入!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}

注意以上的测试用例需要按指定顺序来执行,必须得先检验完成登录页面能正常打开,才能进行下一步正常登录、异常登录的测试。

以下是登录页面自动化测试用例的总代码。

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogLoginTest {public static ChromeDriver driver= Utils.createDriver();// 如果要测试登录页面,以下所有的用例都有一个共同的步骤// 1、要有浏览器对象  2、访问登录页面的URL@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/login.html");}/*检查登录页面打开是否正确检查点:公共主页 注册元素是否存在*/@Test@Order(1)void loginLoad() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));Utils.getScreenShot(getClass().getName());}/*检查正常登录情况*/@ParameterizedTest@CsvSource({"admin,admin","zhangsan,123"})@Order(2)void loginSuccess(String name,String password) throws IOException, InterruptedException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对登陆结果进行检测,Alert alert=driver.switchTo().alert();String expect="登录成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());driver.navigate().back();}/*检查异常登录情况*/@ParameterizedTest@CsvSource({"admin,123"})@Order(3)void loginFail(String name,String password) throws InterruptedException, IOException {driver.findElement(By.cssSelector("#username")).clear();driver.findElement(By.cssSelector("#password")).clear();driver.findElement(By.cssSelector("#username")).sendKeys(name);driver.findElement(By.cssSelector("#password")).sendKeys(password);driver.findElement(By.cssSelector("#submit")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="抱歉:用户名或密码错误,请重新输入!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
}

2.3 博客列表页测试

首先先访问到博客列表页,对博客列表页中的元素检查是否存在来检验博客列表页的加载。

public class BlogListTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/myblog_list.html");}/*** 博客列表页可以正常显示*/@Testvoid listPageLoadTest() throws IOException {driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)"));driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)"));Utils.getScreenShot(getClass().getName());}
}

2.4 博客详情页测试

首先先访问到博客详情页,对博客详情页中的元素检查是否存在来检验博客详情页的加载。

public class BlogDetailTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_content.html?blogId=1");}@Testvoid blogDetailLoadTest() throws IOException {driver.findElement(By.xpath("//*[@id=\"title\"]"));Utils.getScreenShot(getClass().getName());}
}

2.5 博客编辑页测试

首先先访问到博客编辑页,对博客编辑页中的元素检查是否存在来检验博客编辑页的加载。

 public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_edit.html");}/*检查博客编辑页是否可以正常打开*/@Test@Order(1)void editPageLoadTest() throws IOException {driver.findElement(By.cssSelector("#title"));driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));Utils.getScreenShot(getClass().getName());}

博客编辑页的测试中,还需要对是否能够正常编辑并发布文章进行测试。

 /*检查能不能正常编辑并发布文章*/@Test@Order(2)void editAndSubmitBlogTest() throws IOException, InterruptedException {String title="测试文章";driver.findElement(By.cssSelector("#title")).sendKeys(title);// 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="恭喜:发布成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}

总代码:

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogEditTest {public static ChromeDriver driver= Utils.createDriver();@BeforeAllstatic void baseControl() {driver.get("http://162.14.74.192:8081/blog_edit.html");}/*检查博客编辑页是否可以正常打开*/@Test@Order(1)void editPageLoadTest() throws IOException {driver.findElement(By.cssSelector("#title"));driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button"));Utils.getScreenShot(getClass().getName());}/*检查能不能正常编辑并发布文章*/@Test@Order(2)void editAndSubmitBlogTest() throws IOException, InterruptedException {String title="测试文章";driver.findElement(By.cssSelector("#title")).sendKeys(title);// 因博客系统使用到的编辑器是第三方库,所以不能直接使用sendKeys向编辑模块发送文本driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();driver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();Thread.sleep(500);// 对异常登录结果进行检测Alert alert=driver.switchTo().alert();String expect="恭喜:发布成功!";Assertions.assertEquals(expect,alert.getText());alert.accept();Utils.getScreenShot(getClass().getName());}
}

2.6 驱动释放

当完成上述所有的测试后,需要对驱动进行释放:

public class DriverQuitTest {public static ChromeDriver driver= Utils.createDriver();// 最后需要关闭driver@Testvoid driverQuit() {driver.quit();}
}

2.7 测试套件

通过测试套件,指定按顺序的类中的所有测试用例开始执行:

@Suite
@SelectClasses({BlogLoginTest.class,BlogListTest.class,BlogDetailTest.class,BlogEditTest.class,DriverQuitTest.class})
public class RunSuite {
}

2.8 测试结果展示

测试结果如下图:
在这里插入图片描述


⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

请添加图片描述

相关文章:

学海记录项目测试报告

⭐️前言⭐️ 本篇文章是博主基于学海记录的个人项目所做的测试报告&#xff0c;用于总结运用自动化测试技术&#xff0c;应用于自己的项目。 &#x1f349;欢迎点赞 &#x1f44d; 收藏 ⭐留言评论 &#x1f4dd;私信必回哟&#x1f601; &#x1f349;博主将持续更新学习记录…...

【1792. 最大平均通过率】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 一所学校里有一些班级&#xff0c;每个班级里有一些学生&#xff0c;现在每个班都会进行一场期末考试。给你一个二维数组 classes &#xff0c;其中 classes[i] [passi, totali] &#xff0c;表示你…...

言简意赅+图解 函数传参问题(传值、传地址 500字解决战斗)

1、传值 2、传地址 不论是传值&#xff0c;还是传地址&#xff0c;形参都是对于实参的一份拷贝 下图为按值传递进行交换&#xff1a; 形参left拷贝一块新空间&#xff0c;形参right拷贝一块新空间 下图为按指针传递进行交换 形参left拷贝一块新的空间&#xff0c;形参right…...

UML-时序图以及PlantUML绘制

介绍 时序图&#xff08;Sequence Diagram&#xff09;&#xff0c;又名序列图、循序图&#xff0c;是一种UML交互图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序&#xff0c;当执行一个用例行为时&#xff0c;其中的每条消息…...

【Redis】Redis 有序集合 Zset 操作 ( 简介 | 查询操作 | 增加操作 | 删除操作 | 修改操作 )

文章目录一、有序集合 Zset二、查询操作1、查询 Zset 所有数据2、查询 Zset 所有数据和评分3、查询指定评分范围的 Zset 数据4、查询指定评分范围的 Zset 数据并从大到小排序5、统计指定评分范围的 Zset 数据个数6、查询指定元素在 Zset 有序集合中的排名三、增加操作1、向 Red…...

Java特性之设计模式【策略模式】

一、策略模式 概述 在策略模式&#xff08;Strategy Pattern&#xff09;中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式 在策略模式中&#xff0c;我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略…...

IR-CUT 保证摄像机成像效果的滤镜

IR-CUT双滤镜是指在摄像头镜头组里内置了一组滤镜&#xff0c;当镜头外的红外感应点侦测到光线的强弱变化后&#xff0c;内置的IR-CUT自动切换滤镜能够根据外部光线的强弱随之自动切换&#xff0c;使图像达到最 佳效果。也就是说&#xff0c;在白天或黑夜下&#xff0c;双滤光片…...

openpnp - 普通航空插头和PCB的连接要使用线对板连接器

文章目录openpnp - 普通航空插头和PCB的连接要使用线对板连接器概述改进实际效果总结ENDopenpnp - 普通航空插头和PCB的连接要使用线对板连接器 概述 和同学讨论问题, 准备将航空插头连接到PCB上. 航空插头选用GX12-4公头, 拧到开孔的铁板上. 然后航空插头公头再与PCB连接. 铁…...

Python3 错误和异常实例及演示

作为 Python 初学者&#xff0c;在刚学习 Python 编程时&#xff0c;经常会看到一些报错信息&#xff0c;在前面我们没有提及&#xff0c;这章节我们会专门介绍。 Python 有2种错误很容易辨认&#xff1a;语法错误和异常。 Python assert&#xff08;断言&#xff09;用于判断…...

Android 9.0第三方app根据包名设置为横屏显示

1.概述 在android9.0的系统rom定制化开发中,在某些横屏的设备比如平板电脑,tv智能电视,广告机等等设备中,通常系统是默认横批显示的,但是在安装一些竖屏app的时候, 就会旋转为竖屏,这个时候操作app也不方便,所以产品需求要求竖屏也需要根据包名横屏显示出来,这就需要在…...

MySQL会导致索引失效的情况与解决索引失效的方法

什么情况会导致索引失效 索引失效也是慢查询的主要原因之一&#xff0c;常见的导致索引失效的情况有下面这些&#xff1a; 1.使用 SELECT * 进行查询;2.创建了组合索引&#xff0c;但查询条件未准守最左匹配原则;3.在索引列上进行计算、函数、类型转换等操作;4.以 % 开头的 L…...

使用nginx单独部署Vben应用

前言 本文主要介绍Vben使用nginx单独部署的方式&#xff0c;其实前端发展到现在已经不是当年的jsp&#xff0c;asp必须要和后端一起部署了。单独部署调试的工具也很多&#xff0c;比如vue-cli-service 和 Vben中用到的vite &#xff0c;当然这些我们一般用在开发的工程中。正式…...

ES6新特性详解

文章目录1. let和const1.1 let声明变量1.2 const声明常量2. 模板字符串3. 解构赋值3.1 数组的解构赋值3.2 对象的解构赋值4. 函数扩展4.1 参数默认值4.2 剩余参数4.3 箭头函数5. 对象扩展5.1 对象简写5.2 属性名表达式5.3 扩展运算符6. Symbol7. Iterator和Generator7.1 Iterat…...

Ubuntu下安装 ntfs-3g

目录1.FAT32、NTFS和exFAT2.ubuntu 安装 ntfs-3g2.1 直接安装2.2 源码安装1.FAT32、NTFS和exFAT U盘在格式化的时候都会有三种格式分别是FAT32、NTFS和exFAT。 FAT32格式   FAT32格式硬盘分区的最大容量为2TB&#xff0c;虽然U盘做不到&#xff0c;但是现在1xTB硬盘都有了&…...

【专业认知】抖音就业 / 保研北大教育学 / 留学南加州EE / 微软就业

2023.2.18 一. 周金辉学长分享——本科经验分享 0 简介 计算机农大本硕 硕士毕业后在抖音公司工作 1 行业前景&#xff1a;计算机专业能做什么&#xff1f; 1.1 计算机行业发展路线 远古时代&#xff1a; 二战开始&#xff0c;计算机技术发展&#xff0c;出现互联网 包…...

【算法题】2 的 n 次幂的背后

前言&#xff1a; 说实话&#xff0c;真的不爱写算法题相关的文章了&#xff0c;觉得没啥意义&#xff0c;但是对这种比较好玩并且简单&#xff0c;学会了就能很好提高算法效率的文章&#xff0c;还是要写一写&#xff0c;不哭不哭&#xff0c;你不会不是你的错&#xff0c;只是…...

【人工智能AI】一、NoSQL 企业级基础入门《NoSQL 企业级基础入门与进阶实战》

写一篇介绍什么是NoSQL的技术文章&#xff0c;分5个章节&#xff0c;每个章节细分到3级目录&#xff0c;重点介绍一下优缺点&#xff0c;适用场景&#xff0c;未来发展趋势等。 一、NoSQL简介 1.1 什么是NoSQL NoSQL&#xff08;Not only SQL&#xff09;&#xff0c;意思是“…...

Ubuntu安装opencv库3.4.10,并在cmake工程中引入opencv库

Windows下安装不同&#xff0c;Ubuntu安装OpenCV库时&#xff0c;需要事先安装依赖&#xff0c;而且不同OpenCV库所需的依赖可能会有所不同&#xff0c;下面的依赖亲测 3.4.10 和 4.5.5版本的有效&#xff0c;但是4.6以上版本安装可能会报错。 参考链接&#xff1a;https://bl…...

实现8086虚拟机(四)——mov 和 jmp 指令解码

文章目录mov 指令解码jmp 指令解码这篇文章举例来讲讲 mov 指令和 jmp 指令解码函数的实现&#xff0c;其他的指令解码函数都与这些类似。mov 指令解码 以 mov 指令中的一类&#xff1a;寄存器/内存 到/从 寄存器&#xff0c;来详细说明解码函数的实现。 机器指令格式如下&am…...

数据库技术-函数依赖、键与约束、范式

一、函数依赖 给定一个x&#xff0c;能唯一确定一个Y&#xff0c;就称x确定Y&#xff0c;或者说Y依赖于x&#xff0c;例如YX*X函数。 函数依赖又可扩展以下两种规则: 部分函数依赖:A可确定C&#xff0c;(A,B)也可确定C,(A,B)中的一部分&#xff08;即A&#xff09;可以确定C&a…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

【Qt】控件 QWidget

控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态&#xff1a;enabled几何&#xff1a;geometrywindows frame 窗口框架的影响 窗口标题&#xff1a;windowTitle窗口图标&#xff1a;windowIconqrc 机制 窗口不透明度&#xff1a;windowOpacity光标&#xff1a;cursor…...

Docker环境下安装 Elasticsearch + IK 分词器 + Pinyin插件 + Kibana(适配7.10.1)

做RAG自己打算使用esmilvus自己开发一个&#xff0c;安装时好像网上没有比较新的安装方法&#xff0c;然后找了个旧的方法对应试试&#xff1a; &#x1f680; 本文将手把手教你在 Docker 环境中部署 Elasticsearch 7.10.1 IK分词器 拼音插件 Kibana&#xff0c;适配中文搜索…...

宠物车载安全座椅市场报告:解读行业趋势与投资前景

一、什么是宠物车载安全座椅&#xff1f; 宠物车载安全座椅是一种专为宠物设计的车内固定装置&#xff0c;旨在保障宠物在乘车过程中的安全性与舒适性。它通常由高强度材料制成&#xff0c;具备良好的缓冲性能&#xff0c;并可通过安全带或ISOFIX接口固定于车内。 近年来&…...