软件测试(五)自动化 selenium

文章目录

  • 自动化测试
      • 单元测试:
      • 单元测试:
      • UI自动化
  • selenium工具
    • 定义
    • 特点:
    • 原理:
    • selenium+java环境搭建
    • Selenium+API
    • 获取测试结果:
    • 添加等待
    • 浏览器操作
    • 键盘事件
    • 鼠标事件
    • 多层框架/窗口定位
    • 下拉框处理
    • 弹窗处理
    • 上传文件操作
    • 关闭浏览器
    • 窗口的切换
    • 截图

自动化测试

自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器(代码)执行的过程。(简单而言其实就是降低重复性的工作(大部分是Python))

自动化测试的具体实现,应该是包含下面七个过程的。

  1. 分析:总体把握系统逻辑,分析出系统的核心体系架构。
  2. 设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精
  3. 实现:实现脚本,有两个要求一是断言,二是合理的运用参数化。
  4. 执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。
  5. 总结:测试结果的分析,和测试过程的总结是自动化测试的关键。
  6. 维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。
  7. 分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本。

在这里插入图片描述
自动化的分类:单元测试,接口测试,UI自动化测试

单元测试:

最大的投入应该在单元测试上,单元测试运行的频率也更加高。

单元测试:

接口测试就是API测试,相对于UI自动化API自动化更加容易实现,执行起来也更稳定。
接口自动化的有以下特点:

  • 可在产品前期,接口完成后介入
  • 用例维护量小
  • 适合接口变动较小,界面变动频繁的项目

常见的接口自动化测试工具有,RobotFramework,JMeter,SoapUI,TestNG+HttpClient,Postman等。

UI自动化

虽然测试金字塔告诉我们尽量多做API层的自动化测试,但是UI层的自动化测试更加贴近用户的需求和软件系统的实际业务。并且有时候我们不得不进行UI层的测试。
UI自动化的特点:

  • 用例维护量大
  • 页面相关性强,必须后期项目页面开发完成后介入
  • UI测试适合与界面变动较小的项目

UI层的测试框架比较多,比如Windows客户端测试的AutoIT,web测试的selenium以及TestPlanteggPlant,Robot framework,QTP等

selenium工具

定义

selenium是用来做web自动化测试框架。

特点:

  • 兼容各种浏览器,支持各种平台,支持各种语言
  • 小巧,对于不同的语言它只是一个包而已,而QTP 需要下载安装1个多G 的程序
  • 有丰富的API
  • 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分 发机的功能。

原理:

在这里插入图片描述

自动化脚本:通过编写代码
webDriver:需要我们去下载
浏览器:edge浏览器,Chrome浏览器

selenium+java环境搭建

  1. 浏览器这里用Chrome浏览器:官网下载(注意自己浏览器的版本:在浏览器关于里查看)
  2. 下载与之对应的浏览器驱动:webDirver:官网下载
  3. 将压缩包解压后驱动放入java安装的jdk中;
    在这里插入图片描述
  4. 打开idea创建项目,导入依赖pom
		<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
  1. 创建测试化代码
public class Main {
    public static void main(String[] args) {
        ChromeOptions options=new ChromeOptions();
        //允许所有的请求
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        //打开一个网页
        webDriver.get("https://www.baidu.com");
    }
}
  1. 运行代码
    在这里插入图片描述
    在这里插入图片描述
  2. 此时环境就配好了

Selenium+API

webdriver 提供了一系列的对象定位方法,常用的有以下几种:

id,name,class name,link textpartial,link text,tag name,xpath,css selector

这里的重点是css,xpath

在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        //找到百度搜索框
        // WebElement element= webDriver.findElement(By.cssSelector(".s_ipt"));
        WebElement element=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入一个软件测试
        element.sendKeys("软件测试");
    }
}

定位元素findElement:css

css选择语法:

id选择器:#id
类选择:.class
标签选择器:标签名
后代选择器:父级选择器,子级选择器

xPath :
绝对路径:从根目录出发寻找
相对路径:(常用)

1. 相对路径+索引://from/span[2]/input
2. 相对路径+属性://input[@class="s_ipt"]
3. 相对路径+通配符://*[@*="s_ipt"]
4. 相对路径+文本匹配://a[text()="新闻"]

获取测试结果:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        int flag=0;
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        //找到百度搜索框
        // WebElement element= webDriver.findElement(By.cssSelector(".s_ipt"));
        WebElement element=webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入一个软件测试
        element.sendKeys("软件测试");
        //点击一下百度按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //校验
        //找到搜索结果
        List<WebElement> elements= webDriver.findElements(By.cssSelector("a em"));
        for (int i=0;i<elements.size();i++){
            if (!elements.get(i).getText().equals("测试")){
                flag=1;
                System.out.println("测试通过");
                break;
            }
        }
        if (flag==0){
            System.out.println("测试不通过");

        }
    }
}

webdriver 中比较常用的操作对象的方法有下面几个:

  • click: 点击对象
  • sendKeys: 在对象上模拟按键输入
  • clear: 清除对象输入的文本内容
  • submit: 提交(必须from标签中,不然会报错)
  • text: 用于获取元素的文本信息
  • getAttribute 获取控件中的属性值
    private static void test02() {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if (button_value.equals("百度一下")){
            System.out.println("测试通过");
        }else {
            System.out.println(button_value);
            System.out.println("测试不通过");
        }
    }

添加等待

sleep休眠:添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠

隐式等待:通过添加implicitlyWait() 方法就可以方便的实现智能等待;implicitlyWait(30)的用法比time.sleep()更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待

private static void test02() {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
       	//隐式等待
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        if (button_value.equals("百度一下")){
            System.out.println("测试通过");
        }else {
            System.out.println(button_value);
            System.out.println("测试不通过");
        }
    }

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。

显示等待

    private static void test02() {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        String button_value=webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        WebDriverWait wait= new WebDriverWait(webDriver,3000);
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#help > a:nth-child(1)")));


    }

隐式等待和显示等待区别:
显示等待:可以针对某一个地方进行等待
隐式等待:对全局进行等待

浏览器操作

  1. 浏览器前进,浏览器退后
  private static void test03() {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        webDriver.findElement(By.cssSelector("#su")).click();
        //浏览器后退
        webDriver.navigate().back();
        //浏览器前进
        webDriver.navigate().forward();
        //浏览器刷新
        webDriver.navigate().refresh();
    }
  1. 浏览器滚动条

#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
#将浏览器滚动条滑到最底端, 示例
((JavascriptExecutor)webDriver).executeScript(“document.documentElement.scrollTop=10000”);
其中,executeScript(script, *args),在当前窗口/框架同步执行javaScript

private static void test03() {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        webDriver.findElement(By.cssSelector("#su")).click();
        //浏览器后退
        webDriver.navigate().back();
        //浏览器前进
        webDriver.navigate().forward();
        //浏览器刷新
        webDriver.navigate().refresh();
        //滑动
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        
    }
  1. 设置浏览器宽、高
webDriver.manage().window().setSize(new Dimension(1000,1000));
  1. 浏览器最大化
 webDriver.manage().window().maximize();
  1. 浏览器全屏
webDriver.manage().window().fullscreen();

键盘事件

要使用键盘按键,必须引入keys 包:
通过send_keys()调用按键:
sendkeys(Keys.TAB) # TAB
sendkeys(Keys.ENTER) # 回车
sendkeys(Keys.SPACE) #空格键
sendkeys(Keys.ESCAPE) #回退键(Esc)

键盘组合键用法

sendkeys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
sendkeys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
sendkeys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
sendkeys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)

webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");

鼠标事件

Actions(driver)
生成用户的行为。所有的行动都存储在actionchains 对象。通过perform()存储的行为。
move_to_element(element)
移动鼠标到一个元素中,menu 上面已经定义了他所指向的哪一个元素
perform()
执行所有存储的行为:
Actions类

  • contextClick() 右击
  • doubleClick() 双击
  • dragAndDrop() 拖动
  • moveToElement() 移动
   private static void test05() throws InterruptedException {
        ChromeOptions options=new ChromeOptions();
        options.addArguments("--remote--allow-origin=*");
        WebDriver webDriver=new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        WebElement webElement=webDriver.findElement(By.cssSelector("#kw"));
        Actions actions=new Actions(webDriver);
        sleep(3000);
        actions.moveToElement(webElement).contextClick().perform();
    }

多层框架/窗口定位

获取框架
对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。
通过frame的id或者name或者frame自带的其它属性来定位框架,这里switchTo.frame()把当前定位的主体切换了frame里。

窗口定位
有可能嵌套的不是框架,而是窗口,还有真对窗口的方法:switchTo.window用法与switchTo.frame 相同。

下拉框处理

下拉框是我们最常见的一种页面元素,对于一般的元素,我们只需要一次就定位,但下拉框里的内容需要进行两次定位,先定位到下拉框对下拉框进行操作后,再定位到下拉框内里的选项。

    private static void test06() {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        WebElement webElement=webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select=new Select(webElement);
        //通过下标选择
        select.selectByIndex(3);
        select.selectByValue("12.5");
    }

弹窗处理

alert、confirm、prompt 的处理

  • text 返回alert/confirm/prompt 中的文字信息
  • accept 点击确认按钮
  • dismiss 点击取消按钮,如果有的话
  • send_keys 输入值,如果alert 没有对话框就不能用了,不然会报错
    private static void test07() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        //alert弹窗取消
        webDriver.switchTo().alert().dismiss();
        //点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        //在alert弹窗内输入值
        webDriver.switchTo().alert().sendKeys("123456");
        //alert弹窗确认
        webDriver.switchTo().alert().accept();
    }

上传文件操作

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。

在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过sendKeys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在。

private static void test08() {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("input")).sendKeys("本地文件目录");
    }

关闭浏览器

浏览器的quit和close之间的区别:

  • quit关闭了整个浏览器,close关闭当前的页面。
  • quit清空了浏览器的缓存,close不会清空缓存。
    private static void test09() {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#help > a:nth-child(1)"));
        //关闭
        webDriver.quit();
        webDriver.close();
    }

窗口的切换

getWindowHandle 方法获取当前
在这里插入图片描述

   private static void test11() throws InterruptedException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#help > a:nth-child(1)")).click();
        sleep(3000);
        //通过这个方法getWindowHandle,获取当前的窗口句柄
        //通过这个方法getWindowHandles,获取所有的窗口句柄
        Set<String> handles= webDriver.getWindowHandles();
        String target_handle="";
        for ( String handle:handles){
            target_handle=handle;
        }
        webDriver.switchTo().window(target_handle);
        sleep(3000);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }

截图

导入依赖:进入Maven仓库

<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

 private static void test12() throws InterruptedException, IOException {
        WebDriver webDriver=new ChromeDriver();
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        File file=((TakesScreenshot)(webDriver)).getScreenshotAs(OutputType.FILE);
        FileUtils.copyFile(file,new File("D://20231022.png"));
    }

需要向上转型,TakesScreenshot,然后调用getScreenshotAs方法

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows电脑如何录制电脑桌面?

如果你使用的电脑是Windows系统&#xff0c;那你是不是想知道如何在Windows电脑上录制电脑桌面&#xff1f; 本文以win10为例&#xff0c;好消息是&#xff0c;Windows 10电脑自带录屏工具&#xff0c;你可以直接使用此录屏工具轻松录制视频&#xff0c;而无需下载其他第三方软…

Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState,Kotlin

Android切换主题生命周期流程与onSaveInstanceState和onRestoreInstanceState&#xff0c;Kotlin import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivityclass MainActivity : AppCompatActivity() {private val TAG "fly&…

基于侏儒猫鼬优化的BP神经网络(分类应用) - 附代码

基于侏儒猫鼬优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于侏儒猫鼬优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.侏儒猫鼬优化BP神经网络3.1 BP神经网络参数设置3.2 侏儒猫鼬算法应用 4.测试结果…

列表推导式、集合推导式、字典推导式、生成器

列表推导式 可以与三目运算符搭配使用 dict1 {name: "by", "age": 20} dict2 {name: "ss", "age": 25} dict3 {name: "sa", "age": 24} dict4 {name: "xs", "age": 27} list1 [dict1, …

软件设计包括了四个既独立又相互联系的活动

软件设计包括了四个既独立又相互联系的活动

windows协议详解之-RPC/SMB/LDAP/LSA/SAM域控协议关系

如果你在windows域控环境中&#xff0c;例如企业的网络中开启wireshark抓包&#xff0c;你一定会遇到一大堆各种各样的协议。不同于互联网服务&#xff08;大多基于HTTP&#xff09;&#xff0c;为了实现域控中各种各样的服务&#xff0c;windows的域控环境中采用了非常多的协议…

【广州华锐互动】VR消防员模拟灭火:身临其境的火场救援

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐渗透到各个领域&#xff0c;为我们带来了前所未有的沉浸式体验。在这其中&#xff0c;VR模拟消防员灭火体验无疑是一种极具创新性和实用性的应用。通过这项技术&#xff0c;人们可以亲身体验到消…

QT 自定义窗体加载完成函数

使用信号和槽函数&#xff0c;具体如下&#xff1a; QT-如何在窗口/对话框显示后自动执行指定任务_qt 界面显示完在调用函数-CSDN博客文章目录QT-如何在窗口/对话框显示后自动执行指定任务一、如何实现在窗口展示出来后&#xff0c;执行某个函数二、如何成功实现判断条件后选择…

前端实现菜单按钮级权限

核心思想就是通过登录请求此用户对应的权限菜单&#xff0c;然后跳转首页&#xff0c;触发全局前置导航守卫&#xff0c;在全局导航守卫中通过 addRoute 添加动态路由进去。addRoute有一个需要注意的地方&#xff0c;就是我们添加完动态路由后&#xff0c;地址栏上立即访问添加…

django建站过程(3)定义模型与管理页

定义模型与管理页 定义模型[models.py]迁移模型向管理注册模型[admin.py]注册模型使用Admin.site.register(模型名)修改Django后台管理的名称定义管理列表页面应用名称修改管理列表添加查询功能 django shell交互式shell会话 认证和授权 定义模型[models.py] 模仿博客形式&…

鸿鹄工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离构建工程项目管理系统项目背景

鸿鹄工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离构建工程项目管理系统 1. 项目背景 一、随着公司的快速发展&#xff0c;企业人员和经营规模不断壮大。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;公司对内部工程管…

Dynamics 365 重写自带按钮

必备工具&#xff1a;Ribbon Workbench 步骤&#xff1a; 1、查看默认按钮使用的方法名称 右键按钮选择自定义命令(Customise Command)&#xff0c;然后查看command使用的命令 2、在前台chrome浏览器中搜索对应的命令&#xff0c;查看命令细节 3、基于命令细节新建command&am…

Python第三方库 - Flash(python web框架)

1 Flask 1.1 认识Flask Web Application Framework&#xff08; Web 应用程序框架&#xff09;或简单的 Web Framework&#xff08; Web 框架&#xff09;表示一个库和模块的集合&#xff0c;使 Web 应用程序开发人员能够编写应用程序&#xff0c;而不必担心协议&#xff0c;线…

分布式限流:Redis

目录 1:如何实现分布式限流 2:限流的几种类别 2.1:固定窗口限流 2.2:滑动窗口限流 2.3:漏桶限流 2.4:令牌桶限流 3:实现分布式限流:Redis 3.1:引入Redisson的依赖包 3.2:初始化Redisson 3.3:创建Redisson的限流类 1:如何实现分布式限流 1:把统计用户的使用频率等这些…

66 跳跃游戏

跳跃游戏 题解1 贪心题解2 DP&#xff08;超时, 但思路应该对&#xff09; 给你一个非负整数数组 nums&#xff0c;你最初位于数组的 第一个下标。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 …

ilr normalize isometric log-ratio transformation

visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容&#xff0c;关注微信&#xff1a;生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…

onebound电商API接口商品数据采集平台:让数据成为生产力!

随着数字化商业时代的到来&#xff0c;API接口已成为电商资源连接利器&#xff0c;也是全球传统互联网企业转型的基础。 2021年 Google Cloud 研究显示&#xff0c;全球互联网企业近3/4的企业持续投入数字化转型&#xff0c;2/3的企业在持续增加投入&#xff0c;从这组数据可以…

2023高频前端面试题-vue

1. 什么是 M V VM Model-View-ViewModel 模式 Model 层: 数据模型层 通过 Ajax、fetch 等 API 完成客户端和服务端业务模型的同步。 View 层: 视图层 作为视图模板存在&#xff0c;其实 View 就是⼀个动态模板。 ViewModel 层: 视图模型层 负责暴露数据给 View 层&…

SpringBoot+SpringMVC+MybatisPlus

文章目录 SpringBootSpringMVCMybatisPlus怎样在SpringBoot中引入SpringMVC?首先看下引入的依赖创建数据库表创建DO类创建MyBatisPlus动态代理接口创建controller控制器接收http请求创建SpringBoot配置文件application.yml最后创建启动类 SpringBootSpringMVCMybatisPlus 怎样…

SYS/BIOS 开发教程: 创建自定义平台

目录 SYS/BIOS 开发教程: 创建自定义平台创建自定义平台新建工程并指定自定义平台修改现有工程使用自定义平台 参考: TI SYS/BIOS v6.35 Real-time Operating System User’s Guide 6.2节 本示例基于 EVMC6678L 开发板, 创建自定义平台, 并将代码段的位置指定到C6678器件内部的…