自动化测试【selenium环境搭建+webdriver API】

news2024/11/19 22:53:44

一、初试自动化测试

自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程;也就是说自动化测试相当于将人工测试手段进行转化,让代码去执行

1.自动化测试的分类(简单了解)

 自动化测试包括 UI测试、接口自动化、单元测试按照这个金字塔模型来进行自动化测试规划,可以产生最佳的自贡话测试产出投入比(ROI),可以用较少的投入获得很好的收益

  • 单元测试最大的投入应该在单元测试上,单元测试运行的频率也更加高。
  • 接口自动化 接口测试就是 API 测试,相对于 UI 自动化 API 自动化更加容易实现,执行起来也更稳定。

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

常见的接口自动化测试工具有,RobotFrameworkJMeterSoapUITestNG+HttpClientPostman等。

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

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

UI 自动化测试的好处

  • 降低大型系统的由于变更或者多期开发引起的大量的回归测试的人力投入,这可能是自动化测试最主要的任务,特别是在程序修改比较频繁效果是非常明显的,自动化测试前期人力投入较多,但后期进入维护期后,可节省大量人力,而手工测试后期需要增加大量人力用于回归测试
  • 减少重复测试的时间,实现快速回归测试
  • 创建优良可靠的测试过程,减少人为错误
  • 可以运行更多更繁琐的测试
  • 可以执行一些手工测试困难或不可能进行的测试
  • 更好的利用资源
  • 测试脚本的重用性

UI层自动化测试框架:

UI层的测试框架比较多,比如Windows客户端测试的AutoITweb测试的selenium以及TestPlant eggPlant,Robot frameworkQTP等。

测试课程里我们主要以Web UI自动化测试框架Selenium为例进行详细介绍。selenium有以下优点:

  • 免费,也不用再为破解软件而大伤脑筋
  • 小巧,对于不同的语言它只是一个包而已,而QTP 需要下载安装1个多G 的程序。
  • 这也是最重要的一点,不管你以前更熟悉Cjavarubypython、或都是C# ,你都 可以通过
  • selenium 完成自动化测试,而QTP 只支持VBS
  • 支持多平台:windowslinuxMAC ,支持多浏览器:ieffffsafarioperachrome
  • 支持分布式测试用例的执行,可以把测试用例分布到不同的测试机器执行,相当于分 发机的功能。

UI自动化测试的适用对象:

实施自动化测试的前提条件:需求变动不频繁、项目周期足够长、自动化测试脚本可重复使用。 适合做自动化的项目:

1️⃣产品型项目。产品型的项目,新版本是在旧版本的基础上进行改进,功能变不大的项目,但项目的新老功能都必须重复的进行回归测试。回归测试是自动化测试的强项,它能够很好的验证你是否引入了新的缺陷,老的缺陷是否修改过来了。在某种程度上可以把自动化测试工具叫做回归测试工具。

2️⃣机械并频繁的测试。每次需要输入相同、大量的一些数据,并且在一个项目中运行的周期比较长。比如兼容性测试。

 以下情况的项目不适合做自动化测试:

1 、需求变动频繁的项目,自动化脚本不能重复使用,维护成本太大,性价比低
2 、项目周期短,自动化脚本编制完成后使用次数不多,性价比低
3 、交互型较强的项目,需要人工干预的项目,自动化无法实施

2.如何实施自动化单元测试

1️⃣分析:总体把握系统逻辑,分析出系统的核心体系架构

2️⃣设计:设计测试用例,测试用例要足够明确和清晰,覆盖面广而精

3️⃣实现:实现脚本,有两个要求一是断言,二是合理的运用参数化

4️⃣执行:执行脚本远远没有我们想象中那么简单。脚本执行过程中的异常需要我们仔细的去分析原因。

5️⃣总结:测试结果的分析,和测试过程的总结是自动化测试的关键。

6️⃣维护:自动化测试脚本的维护是一个难以解决但又必须要解决的问题。

7️⃣分析:在自动化测试过程中深刻的分析自动化用例的覆盖风险和脚本维护的成本

二、selenium 介绍(重点内容)

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

  • 支持各种浏览器
  • 支持各种平台
  • 支持各种语言(Python、Java、JS...),有丰富的 API

1.工作原理

通过idea编写代码,然后运行代码,此时相当于创建一个 http 请求(运行的时候在后台运行了一个服务,有了这个服务就可以接收这个请求),这个浏览器驱动就在接收代码发送的请求,并且需要解析成浏览器能够识别一系列的指令;这个时候浏览器就知道了接下来该做什么,到底有没有做成功呢?这个时候浏览器向驱动返回一个结果,再向代码返回一个结果

用Selenium实现自动化,主要需要三个东西: 

  1. 自动化测试代码:自动化测试代码发送请求给浏览器的驱动
  2. 浏览器驱动:它来解析这些自动化测试的代码,解析后把它们发送给浏览器
  3. 浏览器:执行浏览器驱动发来的指令,并最终完成工程师想要的操作。

Selenium脚本执行时后端实现的流程:

  1. 对于每一条Selenium脚本,一个http请求会被创建并且发送给浏览器的驱动
  2. 浏览器驱动中包含了一个HTTP Server,用来接收这些http请求
  3. HTTP Server接收到请求后根据请求来具体操控对应的浏览器
  4. 浏览器执行具体的测试步骤
  5. 浏览器将步骤执行结果返回给HTTP Server
  6. HTTP Server又将结果返回给Selenium的脚本,如果是错误的http代码我们就会在控制台看到对应的报错信息。

2.Selenium 环境搭建

环境搭建需要 java 版本最低要求为8,浏览器的使用为 Edge 或者 Chrome 浏览器,我们以 Chrome 浏览器来搭建环境

2.1 Chrome  + java

1️⃣下载chorme 浏览器:Google Chrome 网络浏览器

2️⃣查看chrome浏览器版本

 3️⃣下载chrome浏览器驱动

ChromeDriver - WebDriver for Chrome - Downloads (chromium.org)

找版本前两位数一样的,最后.93找接近的 

 此时找自己电脑的版本,我的是win操作系统,就下载win32;下载之后务必要解压文档❗❗

4️⃣配置环境:在这里配置环境不做解释,如果不会配置和没有配置的小伙伴,可以去看我的博客,有详细的配置环境步骤:Windows下最简单的JDK和IDEA安装教程_idea jdk安装教程_奋斗小温的博客-CSDN博客

5️⃣ 将 .exe 放到 jdk 的 bin 文件中

 如果此时忘记了 jdk在哪个路径下存放,我可以给大家提供一个简单使用方法:去运行java代码,然后就会看到一下路径,这就是jdk的存放路径

6️⃣打开idea,创建 maven 项目:在pom文件中添加依赖

<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>

❗❗❗添加完记得刷新页面

在这里需要注意依赖可能添加不成功:这时候我们需要更换一下使用目录

这个 settings.xml 文件我会放到资源里边大家可以自行下载

7️⃣验证环境是否搭建成功

如果出现以上内容,则说明 selenium环境搭建 已经成功

2.2 常见问题及解决方案

1️⃣SessionNotCreatedException

原因:selenium找不到Chrome.exe的安装路径

解决办法:前提——请先确认您下载的谷歌浏览器不是盗版。

驱动实例化中使用绝对路径:

ChromeDriver driver = new ChromeDriver("E:/browser/Google/Chrome/Application/chrome.exe);❗❗注意:这里放同学自己的Chrome.exe所在路径哦,不要盲目复制粘贴~~

2️⃣The version of ChromeDriver only support xxxxxxxxx

3️⃣The path to the driver executable the path to

 原因:浏览器驱动没有放到系统环境变量下

解决办法(二选一即可):

  1. 找到驱动所在路径,复制路径并添加系统环境变量
  2. 将驱动放到jdk路径下

三、webdriver API

Webdriver (Selenium2.0)是一种用于Web应用程序的自动测试工具

1.元素的定位

假如要测试一个百度网页,输入一个 Test ,是否返回 Test 相关数据❓❓首先我们需要找到百度的输入框在哪里,然后输入相关信息,再去找百度一下这个按钮在哪里,然后去点击它,这就是通常的一个操作;同理代码的测试也是一样的,也需要去找这个元素,再进行操作

元素的定位方法有很多:

  • id 定位
find_element_by_id( )
  • name 定位
find_element_by_name( )
  • tag name 定位和 class name 定位
find_element_by_tag_name( )
  • CSS 定位
  • XPath 定位
  • link text 定位:通过元素标签对之间的文本信息来定位元素。
find_element_by_link_text( )
  • Partial link 定位:是对link定位的补充,有些文本链接比较长,这个时候可以取文本链接的一 部分定位,只要这一部分信息可以唯一地标识这个链接
find_element_by_partial_link_text( )

最主要的是 CSS 定位XPath 定位,也是功能最为强大的,可以找到页面几乎所有的元素

1.1 CSS 定位

首先我们在百度框输入“软件测试”,需要自动化输入:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
    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("软件测试");
    }
}

 其中 CSS 类选择器如何找呢?

1.2 CSS选择语法(面试高频)

CSS选择语法,我们在学习 CSS 中已经讲解过,在这里不做过多介绍

1️⃣id选择器:#id

2️⃣类选择器:.class名

3️⃣标签选择器:标签名

4️⃣后代选择器:父级选择器/子级选择器

1.3 XPath 定位

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class Main {
    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\"]"));//xpath 类选择器
        //输入软件测试
        element.sendKeys("软件测试");
    }
}

XPath 选择器如何让找呢?

1.4 XPath选择语法(面试高频) 

语法大家可以参考在线教程,讲解的很详细:w3school 在线教程

1️⃣绝对路径:/html/head/title (不常用)

2️⃣相对路径:

相对路径有很多,这里介绍几种常用的相对路径

  • 相对路径+索引(找下标)//form/span[1]/input

例如我们找百度的输入框:

  • 相对路径+属性值(找相关属性)//input[@class="s_ipt"]

例如我们找百度的输入框class的属性:

​ 

  • 相对路径+通配符//*[@*="s_ipt"]

找所有属性下的s_ipt:

​ 

  • 相对路径+文本匹配:

1.5 实现一个自动化需求

 自动化需求:实现一个在百度的输入框中输入”软件测试“,是否返回对应的数据

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import javax.xml.bind.Element;
import java.util.List;
import static java.lang.Thread.sleep;
public class Main {
    public static void main(String[] args) throws InterruptedException {
        test01();
    }

    private static void test01() 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.cssSelector(".s_ipt"));//类选择器
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));//xpath 类选择器
        //输入软件测试
        element.sendKeys("软件测试");
        //找到百度按钮点击并校验
        //1.找到百度按钮并 点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);//等到3s
        //2.校验
        //找到搜索结果
        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().equals("测试")) {
                flg = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if (flg == 0) {
            System.out.println("测试不通过");
        }
    }
}

2.操作测试对象

前面我们学习了元素的定位,但是定位只是第一步,定位之后需要对玄素进行操作,是鼠标点击还是键盘输入,或者清除元素的内容,或者提交表单等。这个取决于定位元素需要进行的下一步操作

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

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

2.1 clear 清除对象输入的文本内容

自动化需求:打开一个百度的首页,并且在输入框中输入“什么是测试”,并且点击“百度一下”按钮,最后清除输入框内容

如何找输入框和点击一下:打开百度网页,F12,利用选择元素找到输入框和百度一下,查看id:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.util.List;
import static java.lang.Thread.sleep;
public class Main {
    public static void main(String[] args) throws InterruptedException {
        test02();
    }

    //clear 清除对象输入的文本内容
    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        sleep(3000);
        //找到百度输入框的:id为kw,并且输入“什么是测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("什么是测试");
        //找到百度一下按钮:“su”,并且点击
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(3000);
        //清除百度输入框的中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }
}

2.2 submit 提交

如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;如果点击的元素放在非 form 标签中,此时使用 submit 回报错

点击百度中的“新闻”超链接,这个超链接没有放在form标签中,则会报错

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import static java.lang.Thread.sleep;
public class Main2 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    //submit
    //如果点击的元素放在 form 标签中,此时使用 submit 实现的效果和 click 是一样的;
    //如果点击的元素放在非 form 标签中,此时使用 submit 回报错
    //点击百度中的“新闻”超链接,这个超链接没有放在form标签中,则会报错
    private static void test() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //使用xpath定位,并提交
        webDriver.findElement(By.xpath("//a[text()=\"新闻\"]")).submit();

    }
}

 这个代码报错的原因就是因为 submit 操作的不是 form 标签的数据

 在 click 和 submit 中,推荐使用 click,避免出现错误

2.3 getAttribute  获取元素对应属性的值

自动化需求:找到“百度一下”按钮,这个按钮属于一个属性,没有放在标签中间,不可以通过 test 来获取,这个时候需要通过getAttribute  获取元素对应属性的值

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

public class Main3 {
    public static void main(String[] args) throws InterruptedException {
        test();
    }

    //getAttribute 获取元素对应属性的值
    private static void test() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        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("测试不通过");
        }
    }
}


🌈目前我们已经学习了webdriver API 中元素的定位、操作测试对象,但是不仅仅是这两个方面,还有很多,本文我们简单介绍一下自动化测试,由于今天要学的知识有很多,所以下次测试课我们继续讲解 webdriver API,请继续关注我,下节课是本章自动化测试的一个核心知识点+高频面试题❗❗❗

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

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

相关文章

【Flutter混合开发】在Android项目中如何启动Flutter

目录 前言现有项目中引入Flutter启动flutter页面加速启动启动传参总结 前言 flutter可以独立完成项目&#xff0c;但是在现有项目情况下最好的方式就是混合开发&#xff0c;逐步过渡。这样就会共存native和flutter代码&#xff0c;而其中最关键的就是native如何启动flutter页面…

品优购项目学习记录04--列表页

文章目录 1.品优购项目列表页制作准备工作2.列表页header和nav修改2.1 秒杀logo的制作2.2 导航栏nav修改 3.列表页主体sk_container 1.品优购项目列表页制作准备工作 1.列表页面是新的页面&#xff0c;我们需要新建页面文件list.html 2.因为列表页的头部和底部基本一致&#x…

OpenAI 和谷歌最怕的,是一张开源笑脸

「我们没有护城河&#xff0c;OpenAI 也没有。」 在最近泄露的一份文件中&#xff0c;一位谷歌内部的研究人员表达了这样的观点。这位研究人员认为&#xff0c;在这场激烈的 AI 竞赛中&#xff0c;虽然谷歌与 OpenAI 在你追我赶&#xff0c;但真正的赢家未必会在这两家中产生&…

opencv_c++学习(十二)

一、ROI区域截取 Range(int _start, int _end)start:区间的起始(包含此范围)。 end:区间的结束(不包含此范围)。 Rect_(_Tp_x,_Tp _y_Tp _width,_Tp _height)_Tp:数据类型&#xff0c;C模板特性&#xff0c;可以用int、double、float等替换。 _x:矩形区域左上角第一个像素的…

Attention原理+向量内积+Transformer中的Scaled Dot-Product Attention

一、Attention原理 将 S o u r c e Source Source中的构成元素想象成是由一系列的 < K e y , V a l u e > <Key,Value> <Key,Value>数据对构成&#xff0c;此时给定 T a r g e t Target Target中的某个元素 Q u e r y Query Query&#xff0c;通过计算 Q u e…

【腾讯云 Finops Crane 集训营】降本增效利器Crane应用实战

文章目录 前言一、Crane是什么&#xff1f;二、Crane的特点三、Crane使用1、环境准备安装 kubectl安装 Helm安装 kind安装 Docker 2、安装Crane3、访问dashboard4、页面展示集群总览成本洞察成本分析 5、功能应用智能弹性 EffectiveHPA推荐规则 四、Crane的优势总结参考文献 前…

『iperf3 』服务器连接速度测试(2023/02/16 最新版)

文章目录 一、简介1.1 我的测速需求1.2 iperf 二、安装iperf2.1 windows中下载与构建2.2 Ubuntu中下载与构建 三、测速3.1 连接速度测试3.2 服务器网速测试 一、简介 1.1 我的测速需求 我目前有2个需求&#xff1a; 测试服务器的上传、下载速度&#xff1b;测试与服务器的连…

hive数据库表基本操作

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_comment], ...)] [COMMENT table_comment] [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 分区 [CLUSTERED BY (col_name, col_name, ...) 分桶 [SORTED BY (c…

ijkplayer音视频同步

接上篇&#xff1a; ijkplayer框架的集成&#xff08; 从开始到优化秒开&#xff09; 补充&#xff1a; ijkplayer - 拓展&#xff1a; 资料收集备用。 1、在弱网时使用 2、ijkplayer播放卡顿 3、如何支持https链接播放 4、如何降低ijkplayer延迟效应 5、ijkplayer中音…

javaIO流之文件流

目录 简介一、File的构造方法二、File的常用方法1、获取功能的方法2、绝对路径和相对路径3、判断功能的方法4、创建、删除功能的方法5、目录的遍历6、递归遍历 三、RandomAccessFile1、主要方法 四、Apache FileUtils 类1、复制文件或目录&#xff1a;2、删除文件或目录&#x…

提高运算放大器输出功率

运算放大器的串联&#xff1a;如何同时实现高精度和高输出功率 复合放大器 复合放大器由两个单独放大器组合而成&#xff0c;分别具有不同的特性。 图1所示就是这种结构。放大器1为低噪声精密放大器ADA4091-2。 在本例中&#xff0c;放大器2为AD8397,具有高输出功率&#xff…

召回/粗排阶段 负样本常见构造方法

文章目录 1、曝光未点击2、全局随机选择负例3、batch内随机选择负例4、曝光数据随机选择负例5、基于popularity随机选择负例6、基于hard选择负例大佬的总结&#xff1a; 大佬的名言&#xff1a;“如果精排是特征的艺术&#xff0c;那么召回就是样本的艺术&#xff08;负样本为王…

linux 用mv替代rm将文件移动到回收站,避免误操作

有时候在linux上操作rm -rf 删除命令时&#xff0c;不下心就会将不想删除的文件给删除了&#xff0c;删完后&#xff0c;顿时傻眼了&#xff0c;比如 &#xff0c;文件夹test下面有 a ,a1 ,b ,b2四个文件&#xff0c;本来想删除test文件夹下面的a和a1连个文件&#xff0c; 输入…

TCP、UDP原理、DNS协议、CDN原理

1. 如何理解UDP 和 TCP? 区别? 应用场景? 一、UDP UDP&#xff08;User Datagram Protocol&#xff09;&#xff0c;用户数据包协议&#xff0c;是一个简单的面向数据报的通信协议&#xff0c;即对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;只是…

Win10搭建Docker Desktop

Win10搭建Docker Desktop 1 介绍 Docker Desktop是适用于Windows的Docker桌面&#xff0c;是Docker设计用于在Windows 10上运行。它是一个本地 Windows 应用程序&#xff0c;为构建、交付和运行dockerized应用程序提供易于使用的开发环境。Docker Desktop for Windows 使用 Wi…

ChatGPT 插件,组合后更妙了

ChatGPT 插件&#xff0c;组合后更妙 大家好&#xff0c;我是章北海mlpy 昨天极简介绍了一些热门的ChatGPT插件 我测试了一些组合玩法&#xff0c;感觉效率、效果都远超预期。 今天就演示一下如何利用多个插件&#xff0c;高速阅读、理解一篇论文。 备注&#xff1a;一个C…

HTB靶机013-Poison-WP

013-Poison 靶机IP&#xff1a; 10.10.10.84 Scan Nmap 快速扫描&#xff1a; ┌──(xavier㉿kali)-[~] └─$ sudo nmap -sSV -T4 10.10.10.84 -F Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-30 16:41 CST Nmap scan report for 10.10.10.84 Host is up (0.27s…

公牛车充拆解 | 拓尔微A+C双口快充方案IM2403+TMI3451

在快节奏的生活中&#xff0c;手机已成为人们不可或缺的工具。对于经常开车出门的人来说&#xff0c;在车上给手机充电已经成为刚需&#xff0c;因此车载充电器是很多车主的不二之选&#xff0c;它能便捷地解决手机在车内充电的问题&#xff0c;让车主在开车途中保持电量充足。…

MySQL高级_第10章_索引优化与查询优化

MySQL高级_第10章_索引优化与查询优化 1. 数据准备 学员表 插 50 万 条&#xff0c; 班级表 插 1 万 条。 步骤 1 &#xff1a;建表 CREATE TABLE class ( id INT ( 11 ) NOT NULL AUTO_INCREMENT , className VARCHAR ( 30 ) DEFAULT NULL , address …

FlinkKafkaProducer 源码分析

initializeState 先查询是否开启isCheckpointingEnabled配置&#xff0c;如果没开&#xff0c;但是使用了EXACTLY_ONCE或者AT_LEAST_ONCE语义&#xff0c;就报错。 然后从checkpoint中保存的state中读取nextTransactionalIdHintState。 NEXT_TRANSACTIONAL_ID_HINT_DESCRIPTOR…