【自动化测试】——Selenium (基于java)

news2024/9/25 13:23:37

前言

小亭子正在努力的学习编程,接下来将开启软件测试的学习~~

分享的文章都是学习的笔记和感悟,如有不妥之处希望大佬们批评指正~~

同时如果本文对你有帮助的话,烦请点赞关注支持一波, 感激不尽~~

目录

一、认识Selenium

1.什么是自动化测试 

2.Selenium

 3.webdriver的工作原理:

二、环境搭建

1.下载chrome浏览器

2.查看chrome浏览器版本

3. 下载chrome浏览器驱动

4.配置环境变量

5.验证环境是否搭建成功

三、Selenium常用API

1.定位元素

2.操作对象

3.添加等待

4.打印信息

5.浏览器操作

6.键盘操作

7.鼠标操作

8.定位一组元素

9.下拉框处理

10.切换窗口句柄

11.操作截图

12.上传文件操作

四、常见面试题


一、认识Selenium

1.什么是自动化测试 

 自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。

【简单来说就是编写代码,让机器代替人工进行测试工作】

2.Selenium

Seleniumweb应用中基于UI的自动化测试框架,支持多平台、多浏览器、多语言。

早期的selenium RC已经被现在的webDriver所替代,可以简单的理解为selenium1.0+webdriver构成现在的Selenium2.0。现在我们说起selenium,一般指的是Selenium2.0。它有由Selenium IDE,Webdriver,Selenium Grid组成。

 分别做一下介绍:

2.1Selenium IDE

Selenium IDE一个用于Selenium测试的完成集成开发环境,可以直接录制在浏览器的用户操作,并且能回放,编辑和调试测试脚本。调试过程中可以逐步进行或调整执行的速度,并且可以在底部浏览日志出错信息。录制的测试脚本可以以多种语言导出,比如java,C#PythonRuby等,方便掌握不同语言的测试人员操作。

2.2Webdriver

Selenium RC 在浏览器中运行 JavaScript 应用,会存在环境沙箱问题,而WebDriver可以跳出JavaScript的沙箱,针对不同的浏览器创建更健壮的,分布式的,跨平台的自动化测试脚本。基于特定语言(JavaC#PythonRubyPerlJavaScript等)绑定来驱动浏览器对Web元素进行操作和验证。

 3.webdriver的工作原理:

启动浏览器后,selenium-webdriver会将目标浏览器绑定到特定的端口,启动后的浏览器则作为

webdriverremote server

客户端(也就是测试脚本),借助ComandExecutor发送HTTP请求给sever端(通信协议:The

WebDriver Wire Protocol,在HTTP requestbody中,会以WebDriver Wire协议规定的JSON

式的字符串来告诉Selenium我们希望浏览器接下来做什么事情)。

Sever端需要依赖原生的浏览器组件,转化Web Service的命令为浏览器native的调用来完成操作。


二、环境搭建

这里我使用的是:Chrome+Java(推荐)

1.下载chrome浏览器

下载链接已准备好

https://www.google.cn/intl/zh-CN/chrome/

2.查看chrome浏览器版本

 

3. 下载chrome浏览器驱动

链接已备好https://chromedriver.chromium.org/downloads

4.配置环境变量

解压下载好的驱动压缩包,将下载好的chromedriver.exe放到java系统环境变量下

举例:我的java路径是C:\Program Files\Java\jdk1.8.0_131\bin

5.验证环境是否搭建成功

(1)创建java项目,添加pom文件中添加依赖

<!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
<dependency>
    <groupId>org.seleniumhq.selenium</groupId>
    <artifactId>selenium-java</artifactId>
    <version>3.141.59</version>
</dependency>

(2)编写代码运行

public class Demo2 {
    public static void main(String[] args) {
        // 谷歌驱动
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 启动需要打开的网页
        webDriver.get("https://www.baidu.com");
    }
}

显示上述图片内容后,浏览器就会自动启动,注意仔细观察。


三、Selenium常用API

1.定位元素

id

findElement(By.id())

name

findElement(By.name())

class name

findElement(By.className())

tag name

findElement(By.tagName())

link text

findElement(By.linkText())

partial link text

findElement(By.partialLinkText())

xpath

findElement(By.xpath())

css selector

findElement(By.cssSelector())

         //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com");
        // 利用id定位元素:百度输入框,并在输入框中输入:软件测试
        webDriver.findElement(By.id("kw")).sendKeys("软件测试");
        //通过name来定位
        webDriver.findElement(By.name("wd")).sendKeys("软件测试");
        //通过css选择器来定位
        webDriver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("软件测试");
        //通过Xpath来定位
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");

2.操作对象

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

click

点击对象

send_keys

在对象上模拟按键输入

clear

清除对象输入的文本内容

submit

提交

text

用于获取元素的文本信息

private static void test1() throws InterruptedException {
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com");
        Thread time = null;
        sleep(1000);   //为了展示效果设置的等待
        //操作元素
        //输入元素 sendKey
        webDriver.findElement(By.id("kw")).sendKeys("软件测试");
        sleep(3000);
        //清除元素  clear
        webDriver.findElement(By.id("kw")).clear();
        //点击元素  click
        webDriver.findElement(By.id("su")).click();
        //提交元素  submit
        webDriver.findElement(By.id("su")).submit();
        //获取元素文本信息
        String data = webDriver.findElement(By.id("bottom_layer")).getText();
    }

3.添加等待

1)sleep休眠

添加休眠非常简单,我们需要引入time 包,就可以在脚本中自由的添加休眠时间了,这里的休眠指固定休眠;【简单来说就是固定了休眠时间,sleep(2000)就是休眠两秒】

2)隐式等待

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

通过添加driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS)的方法去添加隐式等待,可以参考一下官方文档:

等待 | Selenium正在上传…重新上传取消https://www.selenium.dev/zh-cn/documentation/webdriver/waits/​b​​​​​

补充:

//智能等待,3秒
webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);

4.打印信息

getTitle()

用于获得当前页面的title

getCurrentUrl()

用户获得当前页面的URL

getText()

获取页面文本信息

private static void test2() {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com/");
        //获取当前页面的url
        String url = webDriver.getCurrentUrl();
        // System.out.println(url);
        //获取当前页面的title
        String title = webDriver.getTitle();
        // System.out.println(title);
        //判断与预期结果是否相同,相同则通过测试,不相同则不通过
        if (url.equals("https://www.baidu.com/")) {
            if (title.equals("百度一下,你就知道")) {
                System.out.println("测试通过");
            } else {
                System.out.println("测试未通过,title错了");
            }

        } else {
            System.out.println("测试未通过,url错了");
        }
    }

运行结果:

5.浏览器操作

使用浏览器浏览网页时,浏览器提供了后退和前进按钮,可以方便地在浏览过的网页之间切换,WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮。下面通过例子来演示这两个方法的使用。

back()

模拟浏览器后退按钮

forward()

模拟浏览器前进按钮

refresh()

刷新页面(F5)

maximize()

设置浏览器最大化

setSize()

设置浏览器宽高

manage().window().setSize()

设置浏览器的大小。

private static void test3() {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com");
        //输入情人节
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("情人节");
        //点击搜索
        webDriver.findElement(By.cssSelector("#su")).click();
        //浏览器刷新
        time.sleep(3000);
        webDriver.navigate().refresh();
        //浏览器后退一步
        time.sleep(3000);        //加个休眠时间方便观察
        webDriver.navigate().back();
        //浏览器前进
        time.sleep(3000);
        webDriver.navigate().forward();
        //浏览器窗口最大化
        webDriver.manage().window().maximize();
        //浏览器窗口按照指定大小来显示
        webDriver.manage().window().setSize(new Dimension(500,500));
        time.sleep(3000);
        //浏览器全屏
        webDriver.manage().window().fullscreen();

6.键盘操作

Keys()类提供了键盘上几乎所有按键的方法。 前面了解到, sendKeys()方法可以用来模拟键盘输入, 除此之 外, 我们还可以用它来输入键盘上的按键, 甚至是组合键, 如 Ctrl+A、 Ctrl+C 等;

以下为常用的键盘操作:

sendKeys(Keys.BACK_SPACE)

回格键(BackSpace

sendKeys(Keys.SPACE)

空格键(Space)

sendKeys(Keys.TAB)

制表键(Tab)

sendKeys(Keys.ESCAPE)

回退键(Esc

sendKeys(Keys.ENTER)

回车键(Enter

sendKeys(Keys.CONTROL,‘a’)

全选(Ctrl+A

sendKeys(Keys.CONTROL,‘c’)

复制(Ctrl+C

sendKeys(Keys.CONTROL,‘x’)

剪切(Ctrl+X

sendKeys(Keys.CONTROL,‘v’)

粘贴(Ctrl+V

private static void test4() throws InterruptedException {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com");
        //输入情人节
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("情人节");
        //测试trl+A
        sleep(2000);
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A");
        //测试trl+X
        sleep(2000);
        webDriver.findElement((By.cssSelector("#kw"))).sendKeys(Keys.CONTROL, "X");
        //测试trl+V
        sleep(2000);
        webDriver.findElement((By.cssSelector("#kw"))).sendKeys(Keys.CONTROL, "V");
        //点击
        webDriver.findElement(By.cssSelector("#su")).click();
    }

7.鼠标操作

我们在浏览网页的时候通过鼠标可以进行很多操作,例如鼠标右击、双击、悬停、甚至是鼠标拖动等功能。在WebDriver中,将这些关于鼠标操作的方法封装在ActionChains类提供。 Actions 类提供了鼠标操作的常用方法:

contextClick()

右击

clickAndHold()

鼠标点击并控制

doubleClick()

双击

dragAndDrop()

拖动

release()

释放鼠标

perform()

执行所有Actions中存储的行为

 private static void test5() throws InterruptedException {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("https://www.baidu.com");
        //输入情人节
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("情人节");
        //点击百度一下的按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        //找到测试点鼠标右键点击:网页
        WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > b"));
        //鼠标右击
        Actions actions = new Actions(webDriver);
        sleep(3000);
        actions.moveToElement(webElement).contextClick().perform();

    }

8.定位一组元素

定位一组元素,比如多选框

private static void test8() {
        //谷歌驱动
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
//填写要访问的路径,这里是本地的文件
        webDriver.get("http://127.0.0.1:8080/aaa/test.html");
        //定位input标签,并将其扔到List集合中
        List<WebElement> webElements =  webDriver.findElements(By.cssSelector("input"));
        // 如果元素的type值等于checkbox就进行点击
        for (int i = 0; i < webElements.size(); i++) {
            // getAttribute是获取当前页面元素的属性值,type是当前元素的属性
            if(webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            }else {
                ;
            }
        }
    }

9.下拉框处理

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

    private static void test7() {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //启动需要打开的网页
        webDriver.get("http://127.0.0.1:8080/blog/test2.html");
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        select.selectByIndex(2); //下标从0开始
    }

10.切换窗口句柄

我们在页面操作过程中有时候点击某个链接会弹出新的窗口, 这时就需要主机切换到新打开的窗口上进行操作。WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换。

但是:打开一个新窗口人眼可以看到变化,在自动化测试中,自动化脚本无法直接观察出变化,这个时候自动化脚本通过识别浏览器窗口的属性用句柄(handle)来识别。窗口句柄是窗口的唯一标识,可看做窗口的身份证号。

【注意:这是一个在第二个页面的输入框内搜索内容,如果不调用webDriver.getWindowHandle()方法的话,代码就会报错】

private static void test8() {
        Thread time = null;
        //引入谷歌驱动
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //点击百度的新闻页面
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1")).click();
        // getWindowHandles获取所以得窗口句柄
        // getWindowHandles获取当前页面的窗口句柄
        //   System.out.println(webDriver.getWindowHandle());
        Set<String> handles = webDriver.getWindowHandles();
        String target_handle = "";
        for (String handle : handles) {
            target_handle = handle;
        }
        webDriver.switchTo().window(target_handle);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("情人节");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();

    }

11.操作截图

自动化用例是由代码编写程序控制网页去执行,因此有时候打印的错误信息并不十分明确。如果在脚本执行出错的时候能对当前窗口截图保存,那么通过图片就可以非常直观地看出出错的原因。 WebDriver提供了截图函数getScreenshotAs()来截取当前窗口;

private static void test9() throws IOException, InterruptedException {
        //谷歌驱动
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        File file = ((TakesScreenshot) webDriver).getScreenshotAs(OutputType.FILE);
        // 放到指定路径下
        Cache FileUtils = null;
        FileUtils.copyFile(file, new File("D://20230527jietu.png"));
    }
}

12.上传文件操作

对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传;【关键是文件要存在且路径正确】

 private static void test10() {
        //谷歌驱动
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("http://127.0.0.1:8080/aaa/bbb.html");
        // sendKeys里是上传文件的路径
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\Bin\\xnn_res");
    }

四、常见面试题

1.css选择器和xpath选择器你觉得哪个更好?

答:css选择器效率更高

2.quit 和 close的区别

quit 关闭了整个浏览器,close只是关闭了当前的页面;

quit会清空缓存,close则不会;


以上就是本文分享的主要内容,对你有帮助的话,可以点个赞哦~~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

原码的表示

原码表示 定点整数源码与定点小数源码 源码表示例题 正数与负数转换直接将高位变为1即可 原码的性质 原码的优缺点 乘除法直接符号位异或&#xff0c;数值相乘除即可加法与减法需要先判断两个数值的大小然后确定符号位

软件开发项目延期就天天加班,你认为有效吗?

目录 一、软件开发项目延期的因素 1.1 客户需求变更 1.2 开发人员变动 1.3 技术瓶颈 1.4 对外沟通问题 二、相应的解决方案 2.1 需求变更管理机制 2.2 公司内部人员培训和团队建设 2.3 技术难题攻关 2.4 优化沟通流程 三、总结 软件开发项目延期时加班并不是一个长期…

C++之std::forward模板函数用法(一百四十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

2023.7.2-逆向显示键入的整数

功能&#xff1a;输入一个整数(多位)&#xff0c;逆向显示输入的结果。 程序&#xff1a; int main() {int a;printf("请输入一个整数&#xff1a;");scanf("%d",&a);if (a < 0)printf("请输入一个正整数");else{while (a>0){printf…

力扣 -- 931. 下降路径最小和

题目链接&#xff1a;931. 下降路径最小和 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; class Solution { public:int minFallingPathSum(vect…

动态规划 DP (四) 子序列问题

5.子序列问题 1&#xff09; 力扣https://leetcode.cn/problems/longest-increasing-subsequence/解题思路&#xff1a;因为子序列&#xff0c;其实就意味着要进行两层遍历了&#xff0c;分别列举子序列的结尾坐标和开始坐标&#xff0c;这样才能遍历完所有子序列。然后遍历的…

Linux学习-实操篇

Linux学习 实操篇 学自尚硅谷武晟然老师&#xff0c;结合老师课堂内容和自己笔记所写博文。 文章目录 Linux学习实操篇Shell介绍文件目录一、目录操作命令1.1 查看和切换工作目录1.2 列出目录内容1.3 创建和删除目录 二、文件操作命令2.1 创建文件2.2 复制文件或文件夹2.3 删除…

Django之ORM与MySQL对比

ORM 把类映射成数据库中的表&#xff0c;把类的一个实例对象映射成数据库中的数据行&#xff0c;把类的属性映射成表中的字段&#xff0c;通过对象的操作对应到数据库表的操作&#xff0c;实现了对象到SQL、SQL到对象的转换过程。 下面以一个商品库存明细表 myfirstapp_sku&…

spring boot/spring cloud项目中创建Moudel子模块出现 Ignored pom.xml

出现问题&#xff1a; 在 IDEA 项目的父工程中创建了子模块&#xff0c;但是由于子模块创建有误&#xff0c;删了后重新创建&#xff0c;出现了 Ignored pom.xml 的问题。 分析问题&#xff1a; 分析原因&#xff1a;应该是 IDEA 觉得这个项目已经被你删除了&#xff0c;所以…

pandas (十) 缺失值的处理:填充、删除、过滤、查询

Pandas使用函数处理缺失值 isnull和notnull&#xff1a;检测是否是空值&#xff0c;可用于df和seriesdropna&#xff1a;丢弃、删除余缺失值 axis: 删除行还是列&#xff0c;{0 or ‘index’, 1 or ‘columns’), default 0 how: 如果等于any则任何值为空都删除&#xff0c;如…

630到期,全面整改完成!

2023年6月30日对于消费金融行业的同学来讲&#xff0c;是一个大日子。 因为在2022年7月12日的时候&#xff0c;银监会特意下发了一个通知&#xff0c;《提升金融服务质效的通知》&#xff0c;原文见文末。 里面要求各金融机构进行相应整改&#xff0c;而整改的截止日期就是2023…

C++ 多线程

多线程是多任务处理的一种特殊形式&#xff0c;多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下&#xff0c;两种类型的多任务处理&#xff1a;基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。…

Unity GameFramework StarForce 流程介绍

一、游戏总入口 GameEntry 1.内建好的GameEntry.Builtin 提供了各种框架的组件封装 2.自定义GameEntry.Custom 根据提供的案例参考即可实现自己的组件 3.游戏入口GameEntry 二、实现自己的组件并注册到管理类中 我们自己的组件只需要继承UnityGameFramework.Runtime.Gam…

实现数据库增删改产+界面效果2-----jsp

任务 1.通过连接数据库完成用户登录模块。 2.登录成功后查询出一张数据库表中的内容&#xff1b;登录不成功返回登录页面。 3.登录页面端要有空值和非法字符验证。 4.登录成功后对一张表中数据进行增加、删除、修改和查询操作。 代码 数据库相关代码 创建数据库 名字为jdb…

76、基于STM32单片机车牌识别摄像头图像处理扫描设计(程序+原理图+PCB源文件+相关资料+参考PPT+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

阿里拿38K出来的大佬良心分享,熬夜整理10 万字详细Java面试笔记

国内的互联网面试&#xff0c;恐怕是现存的、最接近科举考试的制度。 这是由于互联网IT行业的求职者太多了&#xff0c;如果考察的是清一溜的算法题和设计题&#xff0c;那么会要求面试官有极高的技术水平&#xff0c;还要花大量的时间成本和精力。 所以&#xff0c;八股文面…

#systemverilog# 关于随机约束之 unique 关键字

前言 在随机约束中,我们可以使用关键字 unique 。 使用关键字unique定义的SystemVerilog约束称为唯一约束。在随机化中,使用唯一约束可以生成变量集的唯一值或数组的唯一元素。这里着重解释一下变量集:是同一类型随机变量的集合。 通过unique约束我们可以完成以下任务: …

详解c++---哈希桶

目录标题 闭散列的回顾拉链法/哈希桶的原理准备工作find函数插入函数erase函数析构函数代码测试insert函数的改进 闭散列的回顾 在前面的学习中我们知道了闭散列的运算规则&#xff0c;当两个数据计算得到的位置发生冲突时&#xff0c;它会自动的往后寻找没有发生冲突的位置&a…

樽海鞘群算法(SSA)(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

时间序列分解 | Matlab自适应噪音的完整集合经验模态分解CEEMDAN分解

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 时间序列分解 | Matlab自适应噪音的完整集合经验模态分解CEEMDAN分解 部分源码 %--------------------