在 IntelliJ IDEA 中使用 Java 和 Selenium 模拟 Chrome 浏览器教程

news2024/10/6 2:32:04

在 IntelliJ IDEA 中使用 Java 和 Selenium 模拟 Chrome 浏览器教程

    • 1. 前言
    • 2. 环境准备
    • 3. 关闭谷歌自动更新
      • 通过服务禁用更新服务
      • 通过任务计划程序禁用更新任务
    • 4. 项目添加 Maven 依赖项
    • 5. 编写自动化脚本
    • 6. 项目运行效果
    • 7. 代码示例
    • 8.常用方法示例
      • 页面请求
      • 定位标签
      • 获取内容
      • 操作元素
      • 显式和隐式等待
      • 切换窗口和框架
      • 截图并保存为文件
      • 关闭和退出
      • 文件操作工具类示例
      • 代理配置工具类示例
      • 随机用户代理工具类示例
      • 使用示例
    • 9. 总结

1. 前言

Selenium 是一个流行的自动化测试工具,支持多种浏览器平台。它的灵活性和丰富的功能使其非常适合测试各种类型的网页应用。虽然关于 Selenium 和 Java 的资料较少且分散,但 Java 爬虫其实非常方便,只要多看源码就能掌握。

2. 环境准备

在开始之前,请确保已安装以下工具,并注意 Chrome 版本必须与 ChromeDriver 版本一致。

  1. Java 开发环境: JDK 1.8, Maven 3+, IntelliJ IDEA

  2. ChromeDriver:ChromeDriver 下载

  3. 历史版本 Chrome:历史版本 Chrome 下载

    image-20240623093929383

3. 关闭谷歌自动更新

通过服务禁用更新服务

  1. 按下 Win+R 键,输入 services.msc 并确定。
  2. 在服务窗口中,找到并双击打开两个 Google 更新服务。
  3. 在服务属性窗口中,点击 停止,在 启动类型 中选择 禁用 并确定。
  4. 根据谷歌浏览器的安装路径(通常是 C:\Program Files (x86)\GoogleC:\Program Files\Google)找到谷歌目录,右键点击 Update 更新文件夹,在 常规 栏点击启动类型为 禁用 并确定。

通过任务计划程序禁用更新任务

  1. 右键点击 我的电脑,选择 管理
  2. 在对话框中选择 任务计划程序
  3. 在任务计划程序库中找到两个与 Chrome 自动更新相关的任务计划,如 GoogleUpdateTaskMachineCoreGoogleUpdateTaskMachineUA,右键选择禁用。

4. 项目添加 Maven 依赖项

在项目的 pom.xml 文件中,添加 Selenium 和 WebDriverManager 的依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.zhouquan</groupId>
    <artifactId>file-upload</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>file-upload</name>
    <description>selenium模拟</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5</artifactId>
            <version>5.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents.core5</groupId>
            <artifactId>httpcore5</artifactId>
            <version>5.2</version>
        </dependency>
    </dependencies>
</project>

添加依赖项后,点击 IntelliJ IDEA 界面右上角的 Maven 面板中的 Reload 按钮,重新加载 Maven 项目以确保依赖项正确导入。

5. 编写自动化脚本

src/main/java/com/example 目录下创建一个名为 App.java 的文件,并编写以下代码:

package com.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import io.github.bonigarcia.wdm.WebDriverManager;

public class App {
    public static void main(String[] args) {
        // 使用 WebDriverManager 设置 ChromeDriver
        WebDriverManager.chromedriver().setup();

        // 创建一个新的 ChromeDriver 实例
        WebDriver driver = new ChromeDriver();

        try {
            // 打开目标网站
            driver.get("https://www.example.com");

            // 查找要点击的元素,例如通过 id, class, 或者其他选择器
            WebElement elementToClick = driver.findElement(By.id("button-id"));

            // 执行点击操作
            elementToClick.click();

            // 其他操作(如验证结果、截图等)

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭浏览器
            //driver.quit();
        }
    }
}

6. 项目运行效果

运行上述代码后,浏览器会自动打开并执行相应的操作。确认所有步骤正确完成,自动化脚本会顺利运行并执行预定的测试任务。

image-20240623103704108

7. 代码示例

package com.reptile;

import com.file.ReadWriteFileUtils;
import lombok.SneakyThrows;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * ChromeDriver工具类,提供多种初始化和操作方法
 *
 * @Author: zhouquan
 * @Date: 2024/6/23
 * @Version: 1.0
 * @Description: ChromeDriver工具类,提供多种初始化和操作方法
 */
public class ChromeDriverUtil {
    // 文件版本, 防止多线程缓存文件和用户文件共享, 导致创建错误
    private static AtomicInteger fileSerial = new AtomicInteger(0);
    private ChromeDriver driver;

    /**
     * 构造函数,初始化ChromeDriver
     * @param path ChromeDriver路径
     * @param pd 是否显示浏览器
     * @param img 是否加载图片
     */
    public ChromeDriverUtil(String path, boolean pd, boolean img) {
        init(path, pd, img);
    }

    @SneakyThrows
    private void init(String path, boolean pd, boolean img) {
        // 设置ChromeDriver路径
        System.setProperty("webdriver.chrome.driver", path);
        ChromeOptions options = new ChromeOptions();
        
        if (!pd) {
            options.addArguments("--headless"); // 无浏览器模式
        }
        
        // 优化参数设置
        options.addArguments("--disable-gpu"); // 禁用GPU
        options.addArguments("--disable-software-rasterizer"); // 禁用3D软件光栅化器
        options.addArguments("--no-sandbox"); // 允许Linux root用户执行
        options.addArguments("--disable-dev-shm-usage"); // 解决某些VM环境中Chrome崩溃问题
        
        if (img) {
            options.addArguments("blink-settings=imagesEnabled=false"); // 禁止加载图片
            options.addArguments("--disable-images");
        }

        // 设置临时文件夹
        String tmpdir = System.getProperty("java.io.tmpdir");
        String dir = tmpdir + File.separator + "chrome_file_data_cache" + File.separator + fileSerial.incrementAndGet();
        
        File dataDir = new File(dir + File.separator + "data");
        if (!dataDir.exists()) {
            dataDir.mkdirs();
        }
        
        File cacheDir = new File(dir + File.separator + "cache");
        if (!cacheDir.exists()) {
            cacheDir.mkdirs();
        }

        options.addArguments("--user-data-dir=" + dataDir.getAbsolutePath()); // 设置用户数据目录
        options.addArguments("--disk-cache-dir=" + cacheDir.getAbsolutePath()); // 设置缓存目录
        options.addArguments("--incognito"); // 无痕模式
        options.addArguments("--disable-plugins"); // 禁用插件
        options.addArguments("--disable-extensions"); // 禁用扩展
        options.addArguments("--disable-popup-blocking"); // 关闭弹窗拦截
        options.addArguments("--ignore-certificate-errors"); // 忽略证书错误
        options.addArguments("--allow-running-insecure-content"); // 允许加载不安全内容
        options.addArguments("--disable-infobars"); // 禁用浏览器正在被自动化程序控制的提示

        if (!pd) {
            // 无浏览器模式-最大化窗口,防止有些元素被隐藏
            int screenWidth = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().width);
            int screenHeight = ((int) java.awt.Toolkit.getDefaultToolkit().getScreenSize().height);
            options.addArguments("window-size=" + screenWidth + "," + screenHeight);
        }

        // 随机设置请求头
        options.addArguments("--user-agent=" + UserAgent.getUserAgentWindows());
        proxy(options, false); // 设置代理,true 开启代理

        driver = new ChromeDriver(options); // 实例化ChromeDriver
        
        if (pd) {
            driver.manage().window().maximize(); // 显示模式下最大化窗口,防止有些元素被隐藏
        }

        // 设置隐式等待
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
    }

    // 无头模式,不加载图片
    public static ChromeDriverUtil buildHide(String path) {
        return new ChromeDriverUtil(path, false, true);
    }

    // 无头模式,加载图片
    public static ChromeDriverUtil buildHideImg(String path) {
        return new ChromeDriverUtil(path, false, false);
    }

    // 显示浏览器,全功能
    public static ChromeDriverUtil build(String path) {
        return new ChromeDriverUtil(path, true, false);
    }

    public ChromeDriver getDriver() {
        return driver;
    }

    // 强制等待,代码在执行到某个位置时强制等待一段时间
    @SneakyThrows
    public void sleep(long ms) {
        Thread.sleep(ms);
    }

    // 显示等待,为了解决隐式等待遗留的问题
    public WebElement wait(int seconds, ExpectedCondition<WebElement> expectedCondition) {
        WebDriverWait webDriverWait = new WebDriverWait(driver, seconds);
        WebElement until = webDriverWait.until(expectedCondition);
        return until;
    }

    // 设置代理
    private void proxy(ChromeOptions options, boolean pd) {
        if (pd) {
            String prox = "127.0.0.1:" + 8080; // 代理地址
            Proxy p = new Proxy();
            p.setHttpProxy(prox); // 设置HTTP代理
            options.setProxy(p);
        }
    }

    // 截图
    public void screenshotPNG(TakesScreenshot takesScreenshot, File file) {
        byte[] screenshotAs = takesScreenshot.getScreenshotAs(OutputType.BYTES);
        ReadWriteFileUtils.writeByte(screenshotAs, file);
        try (FileOutputStream fos = new FileOutputStream(file);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            bos.write(screenshotAs, 0, screenshotAs.length); // 写入数据
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

8.常用方法示例

页面请求

// 请求一个页面,不支持前进和后退切换
driver.get(url);
// 类似get,支持前进和后退切换
driver.navigate().to(url);
// 退到上一个页面,前提是必须前进了一个页面才能回退
driver.navigate().back();
// 指前进到下一个页面,前提是必须后退后才能前进
driver.navigate().forward();
// 刷新当前页面
driver.navigate().refresh();

定位标签

// 通用搜索,第一个,By里包含常用的各种搜索
WebElement findElement(By by);
// 通用搜索,多个,By里包含常用的各种搜索
List<WebElement> findElements(By by);
// 查询指定id的标签
WebElement findElementById(String using);
// 查询a标签内容是using的,第一个
WebElement findElementByLinkText(String using);
// 查询a标签内容是using的,多个
List<WebElement> findElementsByLinkText(String using);
// 查询a标签内容是using的,模糊匹配,第一个
WebElement findElementByPartialLinkText(String using);
// 查询a标签内容是using的,模糊匹配,多个
List<WebElement> findElementsByPartialLinkText(String using);
// 查询标签名称,第一个
WebElement findElementByTagName(String using);
// 查询标签名称,多个
List<WebElement> findElementsByTagName(String using);
// 查询标签属性name,第一个
WebElement findElementByName(String using);
// 查询标签属性name,多个
List<WebElement> findElementsByName(String using);
// 查询标签数据class,第一个
WebElement findElementByClassName(String using);
// 查询标签数据class,多个
List<WebElement> findElementsByClassName(String using);
// 使用css选择器,第一个
WebElement findElementByCssSelector(String using);
// 使用css选择器,多个
List<WebElement> findElementsByCssSelector(String using);
// 使用XPath选择器,第一个
WebElement findElementByXPath(String using);
// 使用XPath选择器,多个
List<WebElement> findElementsByXPath(String using);

获取内容

// 获取页面html
String getPageSource();
// 获取页面标题
String getTitle();
// 获取此元素(包括子元素)的可见(即未被CSS隐藏)文本
String getText();
// 获取此元素的标签名
String getTagName();
// 获取元素指定属性的值
String getAttribute(String name);
// 获取当前元素,基于样式的计算属性值
String getCssValue(String propertyName);
// 获取元素的尺寸及其在视口中的位置
Rectangle getRect();

操作元素

// 输入文本
void sendKeys(CharSequence... keysToSend);
// 清空文本
void clear();
// 点击元素
void click();
// 提交表单
void submit();
// 模拟鼠标移动到元素并点击
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
// 执行JavaScript代码
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("window.scrollTo(0, document.body.scrollHeight)"); // 滚动到底部

显式和隐式等待

// 显式等待
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
// 隐式等待
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

切换窗口和框架

// 切换到指定窗口
driver.switchTo().window(windowHandle);
// 切换到指定框架
driver.switchTo().frame(frameNameOrId);
// 切换到父框架
driver.switchTo().parentFrame();
// 切换到默认内容
driver.switchTo().defaultContent();

截图并保存为文件

// 截图并保存为文件
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile, new File("/path/to/screenshot.png"));

关闭和退出

// 关闭当前窗口
driver.close();
// 关闭所有窗口并退出
driver.quit();

文件操作工具类示例

package com.file;

import java.io.*;

public class ReadWriteFileUtils {

    // 写入字节数组到文件
    public static void writeByte(byte[] data, File file) {
        try (FileOutputStream fos = new FileOutputStream(file);
             BufferedOutputStream bos = new BufferedOutputStream(fos)) {
            bos.write(data, 0, data.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件读取字节数组
    public static byte[] readByte(File file) {
        byte[] data = null;
        try (FileInputStream fis = new FileInputStream(file);
             BufferedInputStream bis = new BufferedInputStream(fis)) {
            data = new byte[(int) file.length()];
            bis.read(data, 0, data.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return data;
    }
}

代理配置工具类示例

package com.proxy;

import org.openqa.selenium.Proxy;
import org.openqa.selenium.chrome.ChromeOptions;

public class ProxyUtils {

    // 设置代理
    public static void setProxy(ChromeOptions options, boolean enableProxy) {
        if (enableProxy) {
            String proxyAddress = "101.200.127.149:3129";
            Proxy proxy = new Proxy();
            proxy.setHttpProxy(proxyAddress);
            options.setProxy(proxy);
        }
    }
}

随机用户代理工具类示例

package com.useragent;

import java.util.Random;

public class UserAgent {

    public static String getUserAgentWindows() {
        String[] userAgents = {
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36",
                "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0"
        };
        Random random = new Random();
        return userAgents[random.nextInt(userAgents.length)];
    }
}

使用示例

public class Main {
    public static void main(String[] args) {
        // 初始化无头模式,禁用图片加载
        ChromeDriverUtil driverUtil = ChromeDriverUtil.buildHide("path/to/chromedriver");

        // 访问页面
        driverUtil.getDriver().get("https://www.example.com");

        // 定位元素
        WebElement element = driverUtil.getDriver().findElement(By.id("elementId"));

        // 获取元素文本
        String text = element.getText();
        System.out.println("Element text: " + text);

        // 截图
        driverUtil.screenshotPNG((TakesScreenshot) driverUtil.getDriver(), new File("screenshot.png"));

        // 关闭浏览器
        driverUtil.getDriver().quit();
    }
}

9. 总结

本文介绍如何在 IntelliJ IDEA 中使用 Selenium 和 ChromeDriver 进行网页爬取和自动化操作,包括以下几个方面:

  1. 环境准备:配置 Java 开发环境、下载并安装 ChromeDriver、设置 Chrome 浏览器和 ChromeDriver 版本一致、禁用 Chrome 自动更新
  2. 添加 Maven 依赖项:在项目的 pom.xml 文件中添加 Selenium 和 WebDriverManager 依赖项
  3. 编写自动化脚本:创建 App.java 文件,编写基本的 Selenium 自动化脚本,演示如何打开网页并进行基本操作
  4. ChromeDriver 工具类:提供 ChromeDriverUtil 工具类,包含初始化 ChromeDriver、代理配置、等待、截图等功能
  5. 常用方法:列出 Selenium 中常用的方法,包括请求、定位标签、获取内容、操作元素、等待、切换窗口和框架、截图、关闭和退出
  6. 文件操作工具类:提供 ReadWriteFileUtils 工具类,用于文件读写操作
  7. 代理配置工具类:提供 ProxyUtils 工具类,用于设置代理
  8. 随机用户代理工具类:提供 UserAgent 工具类,用于随机生成用户代理字符串
  9. 使用示例:提供完整的使用示例,演示如何使用 ChromeDriverUtil 进行网页爬取和自动化操作

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

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

相关文章

Python低溫半导体电子束量子波算法计算

&#x1f3af;要点 &#x1f3af;任意维度求解器&#xff0c;绘制三维投影结果 | &#x1f3af;解二维静电场、静磁场 | &#x1f3af;狄利克雷、诺依曼条件几何矩阵算子 | &#x1f3af;算法模拟低溫半导体材料 | &#x1f3af;计算曲面达西流 | &#x1f3af;电子结构计算和…

学习VXLAN -- 报文结构、原理和配置

目录 VXLAN背景什么是VXLANVXLAN的优势VXLAN报文结构一些特定名词BDVBDIFVAPVSIVSI-InterfaceAC VXLAN的实现原理图VXLAN MAC地址表项MAC地址动态学习 VXLAN隧道VXLAN隧道工作模式L2 GatewayIP Gateway VXLAN隧道的建立与关联VXLAN隧道建立的方式VXLAN对到与VXLAN关联的方式 配…

系统思考与创新解决

圆满结束了为期两天的《系统思考》课程。在这次学习中&#xff0c;大家积极使用系统环路图来分析并呈现跨部门的业务协同问题&#xff0c;以及探讨了推动成长环路背后的限制因素。这不仅增强了团队之间的理解和合作&#xff0c;也帮助我们一起识别阻碍组织发展的关键挑战。期待…

obsidian中用check list 打造待办清单

背景 在快节奏的现代生活中&#xff0c;有效管理个人时间和任务成为提升生活与工作效率的关键。 Obsidian&#xff0c;作为一款强大的知识管理和笔记应用&#xff0c;通过其丰富的插件生态&#xff0c;为我们提供了高度自定义的任务管理解决方案。本文旨在详细介绍如何在Obsid…

AI应用带你玩系列之SadTalker

前段时间我刷微信视频&#xff0c;我无意间点开了一个&#xff0c;画面缓缓展开&#xff0c;是一幅精致的水墨画&#xff0c;画中人物皆是古代装束&#xff0c;衣袂飘飘&#xff0c;仿佛能闻到墨香。然而&#xff0c;这宁静的画面突然被打破了&#xff0c;画中的人物开始动了起…

自动驾驶仿真Carla -ACC功能测试

我将详细说明如何使用Carla进行ACC&#xff08;自适应巡航控制&#xff09;测试&#xff0c;确保每个步骤贴合实际的Carla自动驾驶仿真标准&#xff0c;并提供相应的代码示例。 使用Carla进行ACC测试的步骤&#xff1a; 1. 环境设置和启动Carla 首先&#xff0c;确保你已经安装…

在vue项目中集成cesium

首先创建一个新的vue项目 安装vite中cesium插件 https://github.com/nshen/vite-plugin-cesium 安装插件 npm i cesium vite-plugin-cesium vite -D配置插件 注释原有样式 修改代码 效果

重学java 79.JDK新特性 ⑤ JDK8之后的新特性

别怕失败&#xff0c;大不了重头再来 —— 24.6.20 一、接口的私有方法 Java8版本接口增加了两类成员: 公共的默认方法 公共的静态方法 Java9版本接口又新增了一类成员: 私有的方法 为什么IDK1.9要允许接口定义私有方法呢? 因为我们说接口是规范&#xff0c;规范是…

AI 大模型企业应用实战(08)-LangChain用prompts模板调教LLM的输入输出

超越chatGPT:学习使用prompts模板来调教LLM的输入输出&#xff0c;打造自己版本的"贾维斯" 1 Model I/O&#xff1a;LLM的交互接口 任何语言模型应用程序的核心要素都是......模型。LangChain 为您提供了与任何语言模型连接的构件。 即 Prompts -> Language mod…

免费ddns工具,快解析DNS解析使用教程

DDNS&#xff08;Dynamic Domain Name Server&#xff09;,中文叫动态域名解析&#xff0c;主要用于没有固定公网ip的网络环境下&#xff0c;使用一个固定的域名&#xff0c;解析动态变化的ip地址&#xff0c;达到远程访问的目的。 众所周知&#xff0c;目前公网ip资源非常紧缺…

昇思25天学习打卡营第6天|使用静态图加速

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) 背景介绍 AI编译框架分为两种运行模式&#xff0c;分别是动态图模式以及静态图模式。MindSpore默认情况下是以动态图模式运行&#xff0c;但也支持手工切换为静态图模式。两种运行模式的详细介…

MySQL数据库(三):读取数据库数据

上一节&#xff0c;我们介绍了数据库的基本操作&#xff0c;以及最后演示了如何使用库来连接数据库&#xff0c;在实际应用中&#xff0c;我们通常需要按照指定的条件对数据库进行操作&#xff0c;即增删改查操作&#xff0c;这是非常重要的&#xff01;这一节我们继续通过一个…

【电源专题】案例:电量计遇到JEITA充电芯片,在高温下无法报百怎么办?

在使用电量计芯片时,我们期望的是在产品工作温度下、在产品最低和正常充电电流下都要能报百。 所谓报百,就是电量计RSOC(电量百分比)能到达100%。这看起来简单,如果是常规的操作的话,那么电压达到充电截止要求、电流达到充电截止要求、容量累积变化满足要求,RSOC=100%肯…

数据清洗!即插即用!异常值、缺失值、离群值处理、残差分析和孤立森林异常检测,确保数据清洗的全面性和准确性,MATLAB程序!

适用平台&#xff1a;Matlab2021版及以上 数据清洗是数据处理和分析中的一个关键步骤&#xff0c;特别是对于像风电场这样的大型、复杂数据集。清洗数据的目的是为了确保数据的准确性、一致性和完整性&#xff0c;从而提高数据分析的质量和可信度&#xff0c;是深度学习训练和…

面向卫星遥感的红外微小舰船目标检测方法:MTU-Net

论文简介 空间红外微小舰船检测旨在从地球轨道卫星所拍摄的图像中识别并分离出微小舰船。由于图像覆盖面积极其广大&#xff08;如数千平方公里&#xff09;&#xff0c;这些图像中的候选目标相比空中或地面成像设备观测到的目标&#xff0c;尺寸更小、亮度更低且变化更多。现有…

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上&#xff0c;或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景&#xff1a; 表单…

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象&#xff0c;小弟有哪些&#xff0c;有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些&#xff1a; 基类&#xff1a; ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradient…

用于射频功率应用的氮化铝电阻元件

EAK推出了新的厚膜氮化铝 &#xff08;AlN&#xff09; 电阻器和端接系列&#xff0c;以补充公司现有的产品。传统上&#xff0c;射频功率电阻元件采用氧化铍&#xff08;BeO&#xff09;陶瓷材料作为陶瓷基板;然而&#xff0c;由于国际上要求从产品中去除BeO的压力&#xff0c…

26.3 Django路由层

1. 路由作用 在Django中, URL配置(通常称为URLconf)是定义网站结构的基础, 它充当着Django所支撑网站的目录. URLconf是一个映射表, 用于将URL模式(patterns)映射到Python的视图函数或类视图上. 这种映射机制是Django处理HTTP请求的基础, 它决定了当客户端发送请求时, Django如…

RabbitMQ实践——临时队列

临时队列是一种自动删除队列。当这个队列被创建后&#xff0c;如果没有消费者监听&#xff0c;则会一直存在&#xff0c;还可以不断向其发布消息。但是一旦的消费者开始监听&#xff0c;然后断开监听后&#xff0c;它就会被自动删除。 新建自动删除队列 我们创建一个名字叫qu…