【软件测试】selenium3

news2024/7/6 17:51:11

自动化测试的概念

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

自动化测试就相当于将人工测试手段进行转换,让代码去执行。提高测试效率,保障软件质量。 自动化测试不能完全代替手工测试。通常是代替那些操作重复性比较高。

常见自动化测试的分类:

  • 单元测试
  • 接口测试
  • UI自动化测试:分为移动端,网页端的自动化测试。

image-20230909112349493

selenium 简介

  • selenium是什么:selenium是用来做web自动化测试框架

  • selenium特点:支持各种浏览器,支持各种平台,支持各种语言 (Python,Java,C#,JS,Ruby…),有丰富的API

selenium原理:

image-20230909112826628

  • 自动化脚本:通过idea写的代码
  • 浏览器驱动:软件和硬件间的交互

Selenium+Java环境搭建

其中配置的时候java环境变量配置好的话,chromedriver放到jdk目录中的bin包中。

<dependencies>
    <!-- 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>
</dependencies>

如果报错403添加:

ChromeOptions options = new ChromeOptions();
// 允许所有请求
options.addArguments("--remote-allow-origins=*");
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

定位元素

CSS定位

    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");
        //找到百度搜索输入框
        WebElement element =  webDriver.findElement(By.cssSelector(".s_ipt"));
        //输入软件测试
        element.sendKeys("软件测试");
    }

XPath 定位

image-20230910000752085

代码:

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");
    //找到百度搜索输入框
    WebElement element =  webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
    //输入软件测试
    element.sendKeys("软件测试");
}

定位元素findElement()

css 选择语法:

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

xpath

  • 绝对路径: /html/head/title(不常用)相对路径
  • 相对路径+索引: //form/span[1]/input
  • 相对路径+属性值: //input[@class="s_ipt”]
  • 相对路径+通配符: //* [@*=“su”]
  • 相对路径+文本匹配://a[text()=“新闻”]

CSS选择器的效率更高

执行一个简单的测试

public class Main {
    public static void main(String[] args) throws InterruptedException {
        int flg = 0;
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        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++) {
            //System.out.println(elements.get(i).getText());//获取文本,并打印
            //如果返回的结果有软件测试,证明测试通过,否则测试不通过
            if (elements.get(i).getText().contains("软件")){
                System.out.println("测试通过");
                flg = 1;
                break;
            }
        }
        if (flg == 0){
            System.out.println("测试不通过");
        }
    }
}

操作测试对象

  • click 点击对象
  • send_keys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • text 用于获取元素的文本信息
  • getAttribute:获取元素属性信息

清空文本框:

public static void main(String[] args) throws InterruptedException {
    ChromeOptions options = new ChromeOptions();
    // 允许所有请求
    options.addArguments("--remote-allow-origins=*");
    WebDriver webDriver = new ChromeDriver(options);
    // 打开百度首页
    webDriver.get("https://www.baidu.com");
    //找到百度搜索输入框
    WebElement element =  webDriver.findElement(By.cssSelector("#kw"));
    //输入软件测试
    element.sendKeys("软件测试");
    //找到百度一下按钮
    //点击百度一下按钮
    webDriver.findElement(By.cssSelector("#su")).click();
    sleep(3000);
    //清空百度搜索输入框中的数据
    webDriver.findElement(By.cssSelector("#kw")).clear();
}

submit 提交:

  • 如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的
  • 如果点击的元素放在非form标签中,此时使用submit报错
public class Main {
    public static void main(String[] args) throws InterruptedException {
        //因为点击的是百度中新闻超链接.这个超链接没有放到form标签中.
        //所以submit之后会报错
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到新闻链接
        webDriver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).submit();
    }
}

getAttribute:获取元素属性信息

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //因为点击的是百度中新闻超链接.这个超链接没有放到form标签中.
        //所以submit之后会报错
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到新闻链接
        String su =  webDriver.findElement(By.cssSelector("#su")).getAttribute("value");
        if (su.equals("百度一下")){
            System.out.println("测试通过");
        }else {
            System.out.println(su + "测试不通过");
        }
    }
}

添加等待

  1. sleep强制等待

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

假设等待3天时间:
如果等待时间3天时间,强制等待一直等待,等待的时间3天。隐式等待,最长等待3天时间,如果在3天之内获取到页面上的元素,此时执行下面的代码。如果等待3天时间还是没有找到这个元素,此时报错。

public class Main {    
	public static void main(String[] args) throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        WebElement element =  webDriver.findElement(By.cssSelector("#kw"));
        //输入软件测试
        element.sendKeys("软件测试");
        //找到百度一下按钮
        //点击百度一下按钮
        webDriver.findElement(By.cssSelector("#su")).click();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);//隐式等待,等待三天
        //清空百度搜索输入框中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }
}

显示等待:指定等待某一个元素

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //判断元素是否可以被点击
        WebDriverWait wait = new WebDriverWait(webDriver,3000);//显示等待
        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(6) > a")));
        wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));//判断网页标题是不是:百度一下,你就知道
    }
}

打印信息

  • 打印URL:getCurrentUrl()
  • 打印Title:getTitle();
public class Main {
    public static void main(String[] args) throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        // 允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        String url = webDriver.getCurrentUrl();//获取url
        String title =  webDriver.getTitle();
        if (url.equals("https://www.baidu.com/") && title.equals("百度一下,你就知道")){
            System.out.println("当前页面URL:" + url + ",当前页面title:" +title);
            System.out.println("测试通过");
        }else {
            System.out.println("当前页面URL:" + url + ",当前页面title:" +title);
            System.out.println("测试不通过");
        }
    }
}

浏览器的操作

  1. 浏览器前进
  2. 浏览器后退
  3. 浏览器滚动条操作
  4. 浏览器最大化
  5. 浏览器全屏
  6. 浏览器设置大小
public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        sleep(3000);
        //强制等待3秒
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //浏览器后退
        webDriver.navigate().back();
        sleep(3000);
        //强制等待3秒
        webDriver.navigate().refresh();
        sleep(3000);
        //浏览器前进
        webDriver.navigate().forward();
        sleep(3000);
        //滑动到浏览器最下面
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");        
        webDriver.manage().window().maximize();//浏览器最大化
        sleep(3000);
        webDriver.manage().window().fullscreen();//浏览器全屏
        sleep(3000);
        webDriver.manage().window().setSize(new Dimension(600,1000));//设置浏览器的宽高
    }
}
#将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=0
#将浏览器滚动条滑到最底端
document.documentElement.scrollTop=10000
#将浏览器滚动条滑到最底端, 示例
js="var q=document.documentElement.scrollTop=10000"
driver.execute_script(js)

键盘事件

  • send_keys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
  • send_keys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
  • send_keys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
  • send_keys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)
public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("教师节");
        sleep(3000);
        //control + A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"A");
        sleep(3000);
        //control + X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"X");
        sleep(3000);
        //control + V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL,"V");
        sleep(3000);
    }
}

鼠标事件

  • context_click() 右击
  • double_click() 双击
  • drag_and_drop() 拖动
  • move_to_element() 移动
public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com");
        //搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("教师节");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //找到图片按钮
        WebElement webElement = webDriver.findElement(By.cssSelector("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-pic_p4Uej.s-tab-pic"));
        //鼠标右击
        Actions actions = new Actions(webDriver);
        sleep(3000);
        actions.moveToElement(webElement).contextClick().perform();
    }
}

定位一组元素

选中复选框中的元素,而选中单选框的元素:

<html>
<head>
  <meta http-equiv="content-type" content="text/html;charset=utf-8" />
  <title>Checkbox</title>
</head>
<body>
<h3>checkbox</h3>
<div class="well">
  <form class="form-horizontal">
    <div class="control-group">
      <label class="control-label" for="c1">checkbox1</label>
      <div class="controls">
        <input type="checkbox" id="c1" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="c2">checkbox2</label>
      <div class="controls">
        <input type="checkbox" id="c2" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="c3">checkbox3</label>
      <div class="controls">
        <input type="checkbox" id="c3" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r1" />
      </div>
    </div>
    <div class="control-group">
      <label class="control-label" for="r">radio</label>
      <div class="controls">
        <input type="radio" id="r2" />
      </div>
    </div>
  </form>
</div>
</body>
</html>

全选复选框代码

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:8080/test01.html");
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.DAYS);
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            //如果每个元素type值等于checkbox进行点击
            //getAttribute获取页面上元素属性值,里面的type是当前元素属性
            if (webElements.get(i).getAttribute("type").equals("checkbox")){
                webElements.get(i).click();
            }else {
                //否则什么也不操作
            }
        }
    }
}

多层框架

test02.html:

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>frame</title>
    <!--  <link href="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css" rel="stylesheet" />-->
    <script type="text/javascript">$(document).ready(function(){
    });
    </script>
</head>
<body>
<div class="row-fluid">
    <div class="span10 well">
        <h3>frame</h3>
        <iframe id="f1" src="inner.html" width="800", height="600"></iframe>
    </div>
</div>
</body>
<!--<script src="https://netdna.bootstrapcdn.com/twitter-bootstrap/2.3.2/js/bootstrap.min.js"></script>-->
</html>

inner.html

<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <title>inner</title>
</head>
<body>
<div class="row-fluid">
    <div class="span6 well">
        <h3>inner</h3>
        <iframe id="f2" src="https://www.baidu.com/"
                width="700"height="500"></iframe>
        <a href="javascript:alert('watir-webdriver better than selenium webdriver;')">click</a>
    </div>
</div>
</body>
</html>

java代码:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:8080/test02.html");
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    }
}

多层窗口定位

下拉框处理

test03.html:

<html>
<body>
<select id="ShippingMethod" οnchange="updateShipping(options[selectedIndex]);" name="ShippingMethod">
    <option value="12.51">UPS Next Day Air ==> $12.51</option>
    <option value="11.61">UPS Next Day Air Saver ==> $11.61</option>
    <option value="10.69">UPS 3 Day Select ==> $10.69</option>
    <option value="9.03">UPS 2nd Day Air ==> $9.03</option>
    <option value="8.34">UPS Ground ==> $8.34</option>
    <option value="9.25">USPS Priority Mail Insured ==> $9.25</option>
    <option value="7.45">USPS Priority Mail ==> $7.45</option>
    <option value="3.20" selected="">USPS First Class ==> $3.20</option>
</select>
</body>
</html>
public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:8080/test03.html");
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        select.selectByIndex(3);//通过下标选择
        select.selectByValue("12.51");//通过value选择
    }
}

alert、confirm、prompt 的处理

test04.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<button onclick="Click()">这是一个弹窗</button>
</body>
<script type="text/javascript">
  function Click() {
    let name = prompt("请输入姓名:");
    let parent = document.querySelector("body");
    let child = document.createElement("div");
    child.innerHTML = name;
    parent.appendChild(child)
  }
</script>
</html>

java代码:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:8080/test04.html");
        WebElement webElement = webDriver.findElement(By.cssSelector("button"));
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        //alert弹窗的取消
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        //点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        //在alert弹窗中输入张三
        webDriver.switchTo().alert().sendKeys("张三");
        //alert弹窗的确认
        sleep(3000);
        webDriver.switchTo().alert().accept();
    }
}

上传文件操作

test05.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="file">
</body>
</html>

java代码:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("http://localhost:8080/test05.html");
        WebElement webElement = webDriver.findElement(By.cssSelector("input"));
        webDriver.findElement(By.cssSelector("input")).sendKeys("D:\\Program Files\\test.c");
    }
}

关闭浏览器

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        sleep(4000);
//        webDriver.quit();
        webDriver.close();
    }
}

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

  1. quit关闭了整个浏览器,close只是关闭了当前的页面
  1. quit清空缓存,close不会清空缓存

切换窗口

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开网页
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        //getWindowHandles()获取所有的窗口句柄
        //getWindowHandle()获取的get打开的页面窗口句柄
        Set<String>  handles =  webDriver.getWindowHandles();
        String targrt_handle = "";//找到最后一个页面
        for (String handle:handles) {
            targrt_handle = handle;
        }
        sleep(4000);
        webDriver.switchTo().window(targrt_handle);
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }
}

截图

引入依赖:

去maven仓库搜索:commons-io

image-20230911195137968

点进去之后随便选择maven复制(最好是选择使用量多的)

如果引入maven失败可以尝试这样:

image-20230911203609323

java代码:

public class Main {
    public static void main(String[] args) 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://20230911jietu.png"));
    }
}

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

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

相关文章

国产视觉检测设备崛起,以AI机器视觉及自研算法破解智造难题

机器视觉作为人工智能的前沿分支之一&#xff0c;被称为智能制造的“智慧之眼”&#xff0c;在工业领域中&#xff0c;能够代替人工完成识别、测量、定位、检测等工作&#xff0c;以实现对设备精密控制及产线智能化、自动化升级。 同时&#xff0c;深度学习和3D视觉的技术升级…

Java本地开发环境搭建

概述 Java语言是企业级应用软件开发语言&#xff0c;本文主要描述Java开发环境的搭建。 如上所示&#xff0c;TIOBE提供2023年9月份全球开发语言的排行榜&#xff0c;其中&#xff0c;Java排名第四&#xff0c;而Python已经跃升到第一位&#xff0c;因为&#xff0c;Python是人…

芯科蓝牙BG27开发笔记6-精简第一个程序

1. 这些IO的控制代码在哪里&#xff1f; 还是蓝牙点灯程序&#xff1a; 首先需要对pinout做一些精简&#xff1a; 为了简化工程&#xff0c;去掉了不必要的IO。 至于PTI接口是什么&#xff0c;怎么用&#xff0c;不知道&#xff0c;现在不考虑&#xff1a; 但是提出以下问题…

第6章_freeRTOS入门与工程实践之创建FreeRTOS工程

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

应该下那个 ActiveMQ

最近在搞 ActiveMQ 的时候&#xff0c;发现有 2 个 ActiveMQ 可以下载。 应该下那个呢&#xff1f; JMS 即Java Message Service&#xff0c;是JavaEE的消息服务接口。 JMS主要有两个版本&#xff1a;1.1和2.0。 2.0和1.1相比&#xff0c;主要是简化了收发消息的代码。 所谓…

Redis——其他数据类型介绍

概要介绍 Redis中有10种不同的数据类型。之前的blog中介绍了Redis中常见的五大数据类型&#xff1a;String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;ZSet。而Redis中还有许多其他的数据类型&#xff0c;一般在特定的场景中使用 Stream 首先介绍一下什么…

笔记本多拓展出一个屏幕

一、首先要知道&#xff0c;自己的电脑有没有Type-c接口&#xff0c;支持不支持VGA 推荐&#xff1a; 自己不清楚&#xff0c;问客服&#xff0c;勤问。 二、显示屏与笔记本相连&#xff0c;通过VGA 三、连接好了&#xff0c;需要去配置 网址&#xff1a;凑合着看&#xff…

代码随想录算法训练营Day42 | 动态规划(4/17) 0-1背包问题理论基础 LeetCode 416.分割等和子集

开始背包问题的练习&#xff01; 1. 背包问题的理论基础 对于面试的话&#xff0c;其实掌握01背包&#xff0c;和完全背包&#xff0c;就够用了&#xff0c;最多可以再来一个多重背包。这里附上代码随想录的图&#xff0c;可以对背包问题进行一个分类。 1.1 十分重要的基础&a…

Java class 文件安全加密工具对比与ClassFinal实战

文章目录 前言常见加密方案对比XJarProGuardClassFinal ClassFinal实战纯命令方式maven插件方式 写在最后 前言 相信不少的同学开发的软件都是用户商业化&#xff0c;对于这些商业运营的项目很多都会直接部署在客户方&#xff0c;这样就可能会导致项目源码泄露。当然&#xff…

每日一题~中序后序遍历构造二叉树

题目描述&#xff1a; 思路分析&#xff1a; 后序遍历分析图 中序遍历分析图 不难看出后序遍历的结果中的最后一个元素就是根节点&#xff0c;倒数第二个元素则是根节点的右子树的根节点&#xff0c;而倒数第三个元素是右子树的新右子树的根节点&#xff0c;依次类推。我们可…

部署ik分词器

部署ik分词器 案例版本&#xff1a;elasticsearch-analysis-ik-8.6.2 ​ ES默认自带的分词器对中文处理不够友好&#xff0c;创建倒排索引时可能达不到我们想要的结果&#xff0c;然而IK分词器能够很好的支持中文分词 ​ 因为是集群部署&#xff0c;所以每台服务器中的ES都需…

springboot redisTemplate.opsForValue().setIfAbsent返回null原理

一、版本 springboot版本&#xff1a;spring-boot-starter-data-redis 2.1.6 redisson版本&#xff1a;redisson-spring-boot-starter 3.11.5 二、场景 Boolean res redisTemplate.opsForValue().setIfAbsent("key","value");以上代码同一时间多次执行…

【校招VIP】常用产品分析之数值分析能力

考点介绍&#xff1a; 产品的生命周期各个阶段都伴随着产品数据的变化&#xff0c;产品经理根据这些数据来判断产品所在阶段并对后期的产品演进进行合理的规划&#xff1b;在产品需求分析阶段&#xff0c;通过数据分析来鉴别用户需求的真伪&#xff1b;在产品上线后&#xff0c…

向量范数及其Python代码

【向量范数】 向量由于既有大小又有方向&#xff0c;所以不能直接比较大小。 向量范数通过将向量转化为实数&#xff0c;然后进行向量的大小比较。 所以&#xff0c;向量范数是用于度量“向量大小”的量。 设向量 &#xff0c;则有&#xff1a; ● 向量的 范数&#xff1a; ●…

IO和进程day06(线程续、同步线程互斥)

今日任务&#xff1a; 1.代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <pthread.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <u…

10分钟带你深入理解JavaScript的执行上下文和闭包机制

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! ​ 目录 &#x1f4da; 前言 &#x1f4d8; 一. JavaScript中的闭包 &#x1f4d8; 二. 执行上下文与闭包 &#x1f4d…

03-Redis主从架构

上一篇&#xff1a;02-Redis持久化 1.主从架构搭建 配置从节点步骤&#xff1a; 1、复制一份redis.conf文件 2、将相关配置修改为如下值&#xff1a; port 6380 pidfile /var/run/redis_6380.pid # 把pid进程号写入pidfile配置的文件 logfile "6380.log" dir …

使用亚马逊云科技Amazon SageMaker,为营销活动制作广告素材

广告公司可以使用生成式人工智能和文字转图像根基模型&#xff0c;制作创新的广告素材和内容。在本篇文案中&#xff0c;将演示如何使用亚马逊云科技Amazon SageMaker从现有的基本图像生成新图像&#xff0c;这是一项完全托管式服务&#xff0c;用于大规模构建、训练和部署机器…

PPPoE适用于Linux操作系统的指南

欢迎来到本文&#xff0c;亲爱的Linux用户&#xff01;今天&#xff0c;我将为你提供一个完整的指南&#xff0c;教你如何在Linux操作系统上设置和配置PPPoE连接。无需担心复杂性&#xff0c;跟着我一步一步来&#xff0c;你将轻松掌握这一技能&#xff01; 第一步&#xff0c…

工厂除静电除尘设备--离子风枪

静电无处不在&#xff0c;区别在于静电的多少而已。特别是工业生产过程中&#xff0c;大量的静电会有很多危害。 静电的危害有几点&#xff1a;1.引起电子设备的故障或误动作&#xff0c;造成电磁干扰。2.击穿集成电路和精密的电子元件&#xff0c;或使元件老化&#xff0c;拉…