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

【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)

1.元素定位方法

对象的定位应该是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。一个对象就是一个人一样,他会有各种的特征(属性),如比我们可以通过一个人的身份证号,姓名,或者他住在哪个街道、楼层、门牌找到这个人。

那么一个对象也有类似的属性,我们可以通过这些属性找到这对象。

注意:不管用那种方式,必须保证页面上该属性的唯一性

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

  • id
  • name
  • class name
  • link text
  • partial link text
  • tag name
  • xpath
  • css selector

1.1 css selector

css选择器,主要使用有类选择器,id选择器,标签选择器,后代选择器。

详细使用可参考这篇文章:5选择器

1.2 xpath定位元素

xpath定位元素是通过路径来定位的,分为绝对路径和相对路径。
在这里插入图片描述

xpath的缺点

1.性能差,定位元素的性能要比其它大多数方式差;
2.不够健壮,XPath会随着页面元素布局的改变而改变;
3. 兼容性不好,在不同的浏览器下对XPath 的实现是不一样的

2.操作测试对象

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

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

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

2.1鼠标点击与键盘输入

通过css选择器定位到“百度一下”,点击百度一下:

    /*** 实现点击事件* @throws InterruptedException*/private static void test02() throws InterruptedException {//创建一个options对象ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度页面webDriver.get("https://www.baidu.com");//输入软件测试webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");//点击百度一下webDriver.findElement(By.cssSelector("#su")).click();}

2.2获取元素文本

通过css选择器定位到“百度一下”,获取“百度一下”文本。

    /*** 获取元素文本* @throws InterruptedException*/private static void test03() throws InterruptedException {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com");//获取文本System.out.println(webDriver.findElement(By.cssSelector("#su")).getAttribute("value"));sleep(3000);}

2.3submit提交表单

submit点击的元素必须放到form标签中,但是click没有要求:

    private static void test04() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com");webDriver.findElement(By.cssSelector("a.mnav:nth-child(1)")).submit();}

3.添加等待

3.1强制等待

通过sleep()方法进行强制等待:

sleep(3000);

3.2隐式等待

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

    private static void test06() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com");//找到搜索输入框webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");//找到百度一下,点击webDriver.findElement(By.cssSelector("#su")).click();//在3天内找到了就可以继续运行后面的代码webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);//找到搜索框,清空webDriver.findElement(By.cssSelector("#kw")).clear();}

3.3显示等待

    private static void test13() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("https://www.baidu.com/");//等待50sWebDriverWait wait = new WebDriverWait(webDriver, 50);//找一个titlewait.until(ExpectedConditions.titleIs("百度一下,你就知道"));}

3.4显示等待和隐式等待之间的相同点和不同点

相同点:显示等待和隐式等待都属于智能等待
不同点:隐式等待等待的是页面上所有的元素,显示等待只要条件满足即可

4.打印信息

打印百度首页url

    private static void test07() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");//获取urlString url=webDriver.getCurrentUrl();System.out.println(url);//如果当前页面url等于https://www.baidu.com,测试通过if(url.equals("https://www.baidu.com/")){System.out.println("测试通过");}else {//否则不通过System.out.println("测试失败");}}

打印title:

    private static void test08() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");//获取到当前页面的titleString title = webDriver.getTitle();//如果title等于“百度一下,你就知道”,测试成功if(title.equals("百度一下,你就知道")){System.out.println("测试通过");}else {//否则失败System.out.println("测试失败");}}

5.浏览器操作

5.1浏览器页面大小

浏览器页面最大化:

    private static void test09() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");//最大化webDriver.manage().window().maximize();}

设置宽高:

		//高度和宽度像素点都是500webDriver.manage().window().setSize(new Dimension(500,500));

5.2浏览器前进和后退

操作浏览器前进,后退:

    private static void test10() throws InterruptedException {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");//输入“测试”webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");//点击“百度一下”webDriver.findElement(By.cssSelector("#su")).click();sleep(3000);//后退webDriver.navigate().back();sleep(3000);//前进webDriver.navigate().forward();sleep(3000);//刷新webDriver.navigate().refresh();}

5.3浏览器控制滚动条

控制浏览器滚动条:

    private static void test14() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("https://www.baidu.com/");//搜索”软件“webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件");//点击百度一下webDriver.findElement(By.cssSelector("su")).click();//操作滚动条((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000;");}

5.3浏览器关闭

webdriver.quit();
webdriver.close();

区别:

  • close关闭的是当前页面 ,不会清除cookie这些信息
  • quit关闭的是浏览器,并且会清空cookie

6.键盘组合键用法

通过sendkeys调用按键:

全选:sendKeys(Keys.CONTROL+“A”)
剪切:sendKeys(Keys.CONTROL+“X”)
粘贴:sendKeys(Keys.CONTROL+“V”)

    private static void test11() throws InterruptedException {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");//ctrl+awebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"A");sleep(3000);//ctrl+xwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"X");sleep(3000);//ctrl+vwebDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL+"V");sleep(3000);webDriver.findElement(By.cssSelector("#su")).click();}

7.鼠标事件

通过action移动鼠标,perform()执行所有存储的行为。

    private static void test12() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开百度首页webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#kw")).sendKeys("测试");webDriver.findElement(By.cssSelector("#su")).click();Actions actions=new Actions(webDriver);//智能等待webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);WebElement target=webDriver.findElement(By.cssSelector("a.s-tab-item:nth-child(8)"));//移动+执行//actions.moveToElement(target).perform();//右击actions.contextClick(target).perform();}

8.定位一组元素

webdriver 可以很方便的使用findElement 方法来定位某个特定的对象,不过有时候我们却需要定位一组对象,这时候就需要使用findElements 方法。

定位一组对象一般用于以下场景:

  • 批量操作对象,比如将页面上所有的checkbox 都勾上
  • 先获取一组对象,再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的 checkbox,然后选择最后一个

示例:
在下面的页面上,只选中checkbox:
在这里插入图片描述

实现代码:

    private static void page01() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);webDriver.get("http://localhost:63342/selenium-demo01/src/main/page/test01.html?_ijt=kto2ktutimpfs88l655vij1vpc&_ij_reload=RELOAD_ON_SAVE");//获取到input标签下面所有的元素List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));//遍历for (int i=0;i<elements.size();i++){if(elements.get(i).getAttribute("type").equals("checkbox")){//如果是checkbox就点击elements.get(i).click();}else{//什么都不干}}}

9.多层框架定位

对于一个web 应用,经常会出现框架(frame) 或窗口(window)的应用,这也就给我们的定位带来了一定的困难。

  • 定位一个frame :switch_to.frame(name_or_id_or_frame_element)
  • 定位一个窗口window:switch_to.window(name_or_id_or_frame_element)

多层框架定位:

    private static void page02() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("网页地址");//找到click并点击//切换到click所在的框架webDriver.switchTo().frame("f1");//点击webDriver.findElement(By.cssSelector("选择器")).click();}

10.下拉框定位

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

举例:
在这里插入图片描述

private static void page03() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("http://localhost:63342/selenium-demo01/src/main/page/test03.html?_ijt=f2rop62blqmeft308l6p64ckm6&_ij_reload=RELOAD_ON_SAVE");//操作下拉框Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));//根据value获取select.selectByValue("9.25");//根据下标获取select.selectByIndex(2);}

11.alert弹窗

针对一个普通的alert弹窗的操作:

  • 点击确定
  • 点击取消
  • 输入信息
    private static void page04() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("http://localhost:63342/selenium-demo01/src/main/page/test04.html?_ijt=kh3uv3t7rfg891ma2uiqgfveo2&_ij_reload=RELOAD_ON_SAVE");//点击按钮webDriver.findElement(By.cssSelector("button")).click();//alert弹窗->确定webDriver.switchTo().alert().accept();//alert弹窗->取消webDriver.switchTo().alert().dismiss();//alert弹窗->输入信息webDriver.switchTo().alert().sendKeys("输入了一个文字信息");}

12.文件提交

    private static void page05() {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("网址");//点击按钮(上传文件)webDriver.findElement(By.cssSelector("input")).sendKeys("文件路径");}

13.截图

先引入commons-io依赖:

        <!-- 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 test15() throws IOException {//创建浏览器驱动WebDriver webDriver=new ChromeDriver();//打开网页webDriver.get("https://www.baidu.com/");//截图File src_file=((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);//保存截图FileUtils.copyFile(src_file,new File("地址"));}

14.窗口切换

打开百度首页->点击新闻->页面跳转到新闻页->点击音乐->跳转到音乐页面:

private static void test17() {ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//设置驱动路径System.setProperty("webdriver.chrome.driver","C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\chromedriver.exe");WebDriver webDriver=new ChromeDriver(options);//打开网页webDriver.get("https://www.baidu.com/");//点击新闻webDriver.findElement(By.cssSelector("a.mnav:nth-child(1)")).click();//获取到浏览器所有的窗口句柄Set<String> windowHandles = webDriver.getWindowHandles();String target_handle="";//遍历for(String handle:windowHandles){//拿到最后点击的窗口target_handle=handle;}//窗口转换webDriver.switchTo().window(target_handle);//点击新闻中的音乐按钮webDriver.findElement(By.cssSelector("#header-link-wrapper > li:nth-child(5) > a:nth-child(1)")).click();}

相关文章:

【软件测试】webdriver常用API演示(Java+IDEA+chrome浏览器)

1.元素定位方法 对象的定位应该是自动化测试的核心&#xff0c;要想操作一个对象&#xff0c;首先应该识别这个对象。一个对象就是一个人一样&#xff0c;他会有各种的特征&#xff08;属性&#xff09;&#xff0c;如比我们可以通过一个人的身份证号&#xff0c;姓名&#xf…...

Linux安装MySQL 8.1.0

MySQL是一个流行的开源关系型数据库管理系统&#xff0c;本教程将向您展示如何在Linux系统上安装MySQL 8.1.0版本。请按照以下步骤进行操作&#xff1a; 1. 下载MySQL安装包 首先&#xff0c;从MySQL官方网站或镜像站点下载MySQL 8.1.0的压缩包mysql-8.1.0-linux-glibc2.28-x…...

多线程面试相关的一些问题

面试题 1. 常见的锁策略相关的面试题 2. CAS相关的面试题 3. Synchronized 原理相关的面试题 4. Callable 接口相关的面试题 1. 常见的锁策略 乐观锁 vs 悲观锁 悲观锁: 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会修改&#xff0c;所以每次在拿数据的时候都…...

【使用维纳滤波进行信号分离】基于维纳-霍普夫方程的信号分离或去噪维纳滤波器估计(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Vue+axios如何解决跨域

1、为什么会产生跨域&#xff1f; 出于浏览器的同源策略限制。 同源策略&#xff08;Sameoriginpolicy&#xff09;是一种约定&#xff0c;是浏览器的一种安全机…...

网络安全系统中的守护者:如何借助威胁情报 (TI) 提高安全性

在这篇哈巴尔网站上的推文中&#xff0c;我们将解释 TI 缩写背后的含义、为什么需要它、Positive Technologies 收集哪些网络威胁数据以及如何帮助企业预防网络威胁。我们将以四种情况为例&#xff0c;说明公司如何使用 PT Threat Intelligence Feeds 来发现恶意活动并预防攻击…...

并发编程 - CompletableFuture

文章目录 Pre概述FutureFuture的缺陷类继承关系功能概述API提交任务的相关API结果转换的相关APIthenApplyhandlethenRunthenAcceptthenAcceptBoththenCombinethenCompose 回调方法的相关API异常处理的相关API获取结果的相关API DEMO实战注意事项 Pre 每日一博 - Java 异步编程…...

IPIDEA参展ChinaJoy!探索未来创新科技的峰会之旅

中国最大的国际数码互动娱乐展会ChinaJoy即将于7月28日在上海举行&#xff0c;届时将聚集全球来自22个国家和地区的领先科技公司、创业者和技术专家&#xff0c;为参观者呈现一系列引人入胜的展览和活动。而IPIDEA作为参展商之一&#xff0c;将为参观者带来一场关于数字科技的奇…...

2023最新ChatGPT商业运营版网站源码+支持ChatGPT4.0+GPT联网+支持ai绘画(Midjourney)+支持Mind思维导图生成

本系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 支持GPT3模型、GPT4模型Midjourney专业绘画&#xff08;全自定义调参&#xff09;、Midjourney以图生图、Dall-E2绘画Mind思维导图生成应用工作台&#xff08;Prompt&#xff09;AI绘画广场自定…...

轮趣科技教育版ros小车键盘控制运动

我之前买的ros小车是单独买的底板&#xff0c;以为随便一个树莓派就可以&#xff0c;因为我以前有一个树莓派3B&#xff0c;后来买了单独的小车之后&#xff0c;发现只能使用树莓派4B&#xff0c;然后又单独买了一个树莓派4B&#xff0c;给装上镜像&#xff0c;安装ros-melodic…...

深入理解Python中的os.chdir()方法

深入理解Python中的os.chdir()方法 1. 简介 在Python中&#xff0c;os.chdir()方法用于改变当前的工作目录。工作目录是指当前正在执行的脚本所在的目录。通过使用os.chdir()方法&#xff0c;我们可以在脚本执行过程中切换到不同的目录。 在编写Python脚本时&#xff0c;我们…...

【Golang 接口自动化02】使用标准库net/http发送Post请求

目录 写在前面 发送Post请求 示例代码 源码分析 Post请求参数解析 响应数据解析 验证 发送Json/XMl Json请求示例代码 xml请求示例代码 总结 资料获取方法 写在前面 上一篇我们介绍了使用 net/http 发送get请求&#xff0c;因为考虑到篇幅问题&#xff0c;把Post单…...

LaTex语法(常用数学符号的语法和注意事项)

说明:[]括号表示把语法括起来&#xff0c;并不表示LaTex语法。 1. 求和符号(Σ) 这个符号的基本语法为&#xff1a;[\sum_{}^{}]。 符号有两种模式&#xff1a;内联数学模式(inside math mode)和显示数学模式(displayed math mode)。 内联数学模式&#xff1a;排版时使用各…...

Yunfly 一款高效、性能优异的node.js企业级web框架

介绍 Yunfly 一款高性能 Node.js WEB 框架, 使用 Typescript 构建我们的应用。 使用 Koa2 做为 HTTP 底层框架, 使用 routing-controllers 、 typedi 来高效构建我们的 Node 应用。 Yunfly 在 Koa 框架之上提升了一个抽象级别, 但仍然支持 Koa 中间件。在此基础之上, 提供了一…...

mac m1安装Centos9

先看结果&#xff08;在mac M1 安装centos8 安装不成功的原因大部分是没有找到正确的系统&#xff09; 由于Cnetos8 停服&#xff0c;现有mac m1 上能够按照的Centos8 并非由官方发布&#xff0c;因此寻找官方发布的能够在mac m1上安装的centos版本。 在YouTuBe上找到一个视频…...

深入理解mAP

0 介绍 mAP是目标检测任务最重要的评价指标。 mAP 是mean average precosion的缩写&#xff0c;mean 和 average都是平均的意思&#xff0c; 所以这个指标的计算涉及到2次平均。 mean是对所有类别的平均&#xff0c; 比如VOC 数据有20个类&#xff0c; 每个类别分别计算AP&…...

PostGis -基础、Springboot 整合、电子围栏处理

目的&#xff1a; 为什么要用PostgreSQL? 因为有时候我们需要存储 空间数据&#xff0c;如&#xff1a;存储一个 多边形 到数据。PostGis中 geometry、geography &#xff1a;基本空间数据类型&#xff0c;用于表达点线面等空间要素&#xff0c;具体类型涵盖了OGC的简单对象模…...

【Linux】多线程的补充

1 线程安全的单例模式 1.1 什么是单例模式 单例模式是一种 "经典的, 常用的, 常考的" 设计模式. 1.2 什么是设计模式 IT行业这么火, 涌入的人很多. 俗话说林子大了啥鸟都有. 大佬和菜鸡们两极分化的越来越严重. 为了让菜鸡们不太拖大佬的后腿, 于是大佬们针对一些…...

【MySQL】表的操作

今天我们来谈谈MySQL下对表的操作 目录 一、创建表 二、查看表 2.1 查看库中存有的表 2.2 查看表结构 2.3 查看表的创建语句 三、修改表 3.1 重命名表名 3.2 新增列 3.3 修改列的数据类型 3.4 删除列 3.5 重命名列 3.6 向表中插入数据 四、删除表 一、创建表 我…...

自动化测试 selenium(测试系列7)

目录 前言&#xff1a; 1.什么是自动化测试 2.Selenium是什么 3.Selenium原理 4.SeleniumJava环境搭建 5.Selenium常用的API使用 5.1定位元素findElement 5.1.1css选择器 5.1.2id选择器 5.1.3类选择器 5.1.4xpath选择器 5.2操作测试对象 5.2.1click点击对象 5.2.…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...