【软件测试】自动化测试selenium(二)

news2024/10/7 16:17:33

文章目录

  • 三. 掌握Selenium常用的API使用
    • 1. webdriver API
    • 2. 操作测试对象
    • 3. 添加等待
    • 4. 打印信息
    • 5. 浏览器的操作
    • 6. 键盘事件
    • 7. 鼠标事件
    • 8. 定位一组元素
    • 9. 多层框架/窗口定位
    • 10. 下拉框处理
    • 11. 弹窗处理
    • 12. 上传文件
    • 13. 关闭浏览器
    • 14. 切换窗口
    • 15. 截图操作

三. 掌握Selenium常用的API使用

一次完整的测试流程:

    public static void test01() throws InterruptedException {
        int flag = 0;
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        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++) {
            // 如果返回的结果有软件测试,证明测试通过,否则测试不通过
            if(elements.get(i).getText().equals("测试")) {
                flag = 1;
                System.out.println("测试通过");
                break;
            }
        }
        if(flag == 0) {
            System.out.println("测试不通过");
        }
    }

在这里插入图片描述

1. webdriver API

css选择语法

    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));
        //输入"软件测试(要搜索的内容)"
        element.sendKeys("软件测试");
    }

在这里插入图片描述
在这里插入图片描述
2. Xpath定位元素
在这里插入图片描述
点击复制后:

    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        //打开百度首页
        webDriver.get("https://www.baidu.com");
        //找到百度搜索输入框
        WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));
        //输入"软件测试(要搜索的内容)"
        element.sendKeys("软件测试");
    }

在这里插入图片描述
关于Xpath的详细语法见:
Xpath教程

面试题:css选择器和Xpath选择器的常见语法有哪些?
css选择器:

  1. 元素选择器:通过元素名称来选择对应的元素。语法形式为"元素名称",例如"div"表示选择所有的div元素。
  2. 类选择器:通过元素的class属性值来选择对应的元素。语法形式为".class值",例如".myClass"表示选择class属性值为"myClass"的所有元素。
  3. ID选择器:通过元素的id属性值来选择对应的元素。语法形式为"#id值",例如"#myElement"表示选择id属性值为"myElement"的元素
  4. 属性选择器:通过元素的属性和属性值来选择对应的元素。语法形式为"[属性=‘属性值’]“,例如”[href=‘https://example.com’]"表示选择href属性值为"https://example.com"的所有元素。
  5. 伪类选择器:通过元素的特定状态或位置来选择对应的元素。常见的伪类选择器包括:hover(鼠标悬停)、:first-child(第一个子元素)、:last-child(最后一个子元素)等。

Xpath选择器:

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

面试题:
(1)定位一个元素有哪几种方式(你是通过什么方式定位元素的?)
答:CSS选择器,Xpath定位元素.
(2)CSS选择器和Xpath选择器哪个更好?
CSS选择器定位元素更高效.

2. 操作测试对象

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

此处我们主要讲解clear以及submit.

clear操作:

    private static void test02() {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
//        找到百度搜索输入框输入"猫咪"
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("猫咪");
//        点击百度一下按钮
        webDriver.findElement(By.cssSelector("#su")).click();
//        清空输入框中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

在这里插入图片描述
submit操作:

webDriver.findElement(By.cssSelector("#su")).submit();

在这里插入图片描述
我们可以看到,submitclick的效果是一样的,但是submit存在一定的弊端:
如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的.如果点击的元素放在非form标签中,此时使用submit会报错!
如下:(此时submit操作的不是from标签下的元素)
在这里插入图片描述
一般情况下,我们就使用click.
getAttribute操作:

    private static void test04() {
        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");
//        System.out.println(button_value);
        if(button_value.equals("百度一下")) {
            System.out.println("测试通过");
        } else {
            System.out.println(button_value);
            System.out.println("测试不通过");
        }
    }

在这里插入图片描述

3. 添加等待

  1. sleep强制等待
  2. 智能等待:隐式等待,显示等待

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

强制等待:
在这里插入图片描述
智能等待: 隐式等待:

    private static void test02() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        //允许所有请求
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
//        找到百度搜索输入框输入"猫咪"
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("猫咪");
//        点击百度一下按钮
        webDriver.findElement(By.cssSelector("#su")).submit();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
//        清空输入框中的数据
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

在这里插入图片描述
智能等待:显示等待:

    private static void test06() {
//        #bottom_layer > div > p:nth-child(8) > span
        // 创建驱动
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://www.baidu.com/");
        // 判断元素是否可以被点击
        WebDriverWait wait = new WebDriverWait(webDriver, 1);
//        wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#bottom_layer > div > p:nth-child(8)")));
        wait.until(ExpectedConditions.titleIs("百度一下,你就知道"));
    }

在这里插入图片描述

此处需要注意隐式等待和显示等待的区别:

  1. 作用范围:隐式等待是全局性的等待设置,适用于整个页面的元素定位操作;显示等待是针对特定元素或条件的等待设置,更具体、可定制性更强。
  2. 等待时间:隐式等待只需设置一次,并适用于所有元素的定位操作;显示等待可以根据不同情况设定不同的等待时间。
  3. 等待条件:隐式等待没有明确的等待条件,只要在规定时间内找到元素即可;显示等待可以指定等待元素可见、可点击等特定条件。
  4. 操作方式:隐式等待是自动等待的,不需要在代码中显式调用;显示等待需要在代码中显式调用等待方法。

4. 打印信息

打印url&&打印title

    private static void test05() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        String url = webDriver.getCurrentUrl();
        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("测试不通过");
        }
    }

在这里插入图片描述

5. 浏览器的操作

操作说明
browser.maximize_window()浏览器的最大化
browser.set_window_size(width, high)设置浏览器宽、高
browser.forward()浏览器的前进
browser.back()浏览器的后退
document.documentElement.scrollTop=0将浏览器滚动条滑到最顶端
document.documentElement.scrollTop=10000将浏览器滚动条滑到最底端
  1. 浏览器前进,后退,刷新操作
    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://wwww.baidu.com/");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        // 强制等待3秒
        webDriver.findElement(By.cssSelector("#su")).click();
        // 浏览器后退
        sleep(3000);
        webDriver.navigate().back();
        // 强制等待3秒
        sleep(3000);
        //浏览器刷新
        webDriver.navigate().refresh();
        // 浏览器前进
        sleep(3000);
        webDriver.navigate().forward();

在这里插入图片描述
3. 浏览器滚动条操作,窗口操作

    private static void test07() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://wwww.baidu.com/");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        // 强制等待3秒
        webDriver.findElement(By.cssSelector("#su")).click();
        //滚动条操作
        sleep(3000);
        //网页的滚动条会自动向下滚动至10000像素的位置
        ((JavascriptExecutor)webDriver).executeScript("document.documentElement.scrollTop=10000");
        sleep(3000);
        //窗口最大化
        webDriver.manage().window().maximize();
        sleep(3000);
        //窗口全屏
        webDriver.manage().window().fullscreen();
        sleep(3000);
        //设置指定窗口大小
        webDriver.manage().window().setSize(new Dimension(600, 1000));
    }

在这里插入图片描述

6. 键盘事件

操作说明
send_keys(Keys.TAB)# TAB
send_keys(Keys.ENTER)# 回车
send_keys(Keys.SPACE)#空格键
send_keys(Keys.ESCAPE)#回退键(Esc)
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)

键盘的全选,剪切,粘贴操作演示:

    private static void test08() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        // 打开百度首页
        webDriver.get("https://wwww.baidu.com/");
        // 搜索521
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("521");
        // 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);
    }

在这里插入图片描述

7. 鼠标事件

操作说明
context_click()右击
double_click()双击
drag_and_drop()拖动
move_to_element()移动

context_click()演示:

    private static void test09() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("520");
        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);
        //contextClick()右击鼠标
        actions.moveToElement(webElement).contextClick().perform();
    }

在这里插入图片描述

8. 定位一组元素

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

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

在这里插入图片描述
findElements示例(将页面上所有的checkbox都勾上):

    private static void page01() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230925testcode/src/main/Page/test01.html?_ijt=hk3glm0bcb2222roak6kf4826i&_ij_reload=RELOAD_ON_SAVE");
        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 {
                // 否则什么也不操作
                ;
            }
        }
    }

在这里插入图片描述

9. 多层框架/窗口定位

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

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

有以下页面:

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

frame演示:

    private static void page02() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230925testcode/src/main/Page/test02.html?_ijt=sdck9iv3t1f7l8bv2khvu2k87t&_ij_reload=RELOAD_ON_SAVE");
        webDriver.switchTo().frame("f1");
        webDriver.findElement(By.cssSelector("body > div > div > a")).click();
    }

10. 下拉框处理

有以下界面:

<html>
<body>
<select id="ShippingMethod" onchange="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>

通过IndexValue来选择演示:

    private static void page03() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230925testcode/src/main/Page/test03.html?_ijt=ibu1q228hs9l4q026vbbfjp8r3&_ij_reload=RELOAD_ON_SAVE");
        WebElement webElement = webDriver.findElement(By.cssSelector("#ShippingMethod"));
        Select select = new Select(webElement);
        //通过下标来选择
//        select.selectByIndex(3);
        //通过value值来选择
        select.selectByValue("12.51");
    }

在这里插入图片描述
在这里插入图片描述

11. 弹窗处理

有以下页面:

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

在这里插入图片描述
alert相关操作:

    private static void page04() throws InterruptedException {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230925testcode/src/main/Page/test04.html?_ijt=bv9np3tl8gm9kv04oam7i2sfij&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("button")).click();
        sleep(3000);
        // alert弹窗取消
        webDriver.switchTo().alert().dismiss();
        sleep(3000);
        // 点击按钮
        webDriver.findElement(By.cssSelector("button")).click();
        // 在alert弹窗中输入"xxxflower"
        webDriver.switchTo().alert().sendKeys("xxxflower");
        // alert弹窗确认
        sleep(3000);
        webDriver.switchTo().alert().accept();
    }

在这里插入图片描述

12. 上传文件

上传过程一般要打开一个本地窗口,从窗口选择本地文件添加。所以,一般会卡在如何操作本地窗口添加上传文件。
其实,在selenium webdriver 没我们想的那么复杂;只要定位上传按钮,通过send_keys 添加本地文件路径就可以了。绝对路径和相对路径都可以,关键是上传的文件存在.

    private static void page05() {
        WebDriver webDriver = new ChromeDriver();
        webDriver.get("http://localhost:63342/_20230925testcode/src/main/Page/test05.html?_ijt=16g56va44mth0ok9g9lfkdqj32&_ij_reload=RELOAD_ON_SAVE");
        webDriver.findElement(By.cssSelector("input")).sendKeys("E:\\壁纸\\haimianbaobao.png");
    }

在这里插入图片描述

13. 关闭浏览器

关闭浏览器有两种方式,分别为

  • quit();
  • close();

需要注意的是quit();close之间的区别:
(1)quit关闭了整个浏览器,close关闭了当前的页面.
close的当前页面指的是操作的该页面,也就是百度首页.
(2)quit清空缓存,close不会清空缓存

quit();close();的演示:

    private static void test10() 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(2000);
        webDriver.quit();
//        webDriver.close();
    }

quit();
在这里插入图片描述
close();
在这里插入图片描述

14. 切换窗口

当我们从百度页面打开新闻页面的时候,此时我们如果想要在新闻页面操作百度一下,那么就得切换窗口.即改变句柄(操作的对象).此时我们就可以使用.getWindowHandles();获取全部的句柄,遍历存储全部句柄的Set获取到我们需要的最后一个句柄,然后通过webDriver.switchTo().window(target_handle);切换窗口.于是我们就可以操作新闻页面的百度一下了.

    private static void test11() 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(1000);
        // 通过getWindowHandles获取所有的窗口句柄
        // 通过getWindowHandle获取的get打开的页面窗口句柄
        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);
        sleep(3000);
        //在输入框中搜索新闻联播
        webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");
        //点击"百度一下"
        webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
    }

在这里插入图片描述

15. 截图操作

引入Maven依赖:

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>

截图操作演示:

    private static void test12() 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);
        //将截图好的图片存储到E://20231005jietu.png路径下
        FileUtils.copyFile(file, new File("E://20231005jietu.png"));
    }

在这里插入图片描述

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

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

相关文章

python实现 线性卷积用Toeplitz 矩阵运算

python实现 线性卷积用Toeplitz 矩阵运算 前言 在看论文的时候&#xff0c;发现Toeplitz 矩阵和线性卷积有关系&#xff0c;于是翻了程佩青老师的数字信号处理课本&#xff0c;发现是有讲过这点的。 Toeplitz 矩阵&#xff1a;从左上到右下的斜对角线都相同&#xff0c;如下…

性能测试工具 - LoadRunner

什么是性能测试&#xff1f; 性能测试就是测试人员利用性能测试工具模拟系统在不同情况下的性能指标是否正常。 性能测试工具 - LoadRunner 接下来介绍LoadRunner的作用和使用。 LoadRunner 就是一个很常见的性能测试工具&#xff0c;它有三个部分组成&#xff1a; 这三个组…

GhostNet原理解析及pytorch实现

论文&#xff1a;https://arxiv.org/abs/1911.11907 源码&#xff1a;https://github.com/huawei-noah/ghostnet 简要论述GhostNet的核心内容。 Ghost Net 1、Introduction 在训练良好的深度神经网络的特征图中&#xff0c;丰富甚至冗余的信息通常保证了对输入数据的全面理…

MySQL:数据库的物理备份和恢复-冷备份(3)

介绍 物理备份&#xff1a; 直接复制数据文件进行的备份 优点&#xff1a;不需要其他的工具&#xff0c;直接复制就好&#xff0c;恢复直接复制备份文件即可 缺点&#xff1a;与存储引擎有关&#xff0c;跨平台能力较弱 逻辑备份&#xff1a; 从数据库中导出数据另存而进行的备…

Linux YUM源(本地/网络源)配置详解

目录 一、挂载 二、建立本地源 配置详解&#xff1a; 三、建立网络源 配置详解&#xff1a; 四、验证 一、挂载 ——将光盘挂载到 /mnt ——挂载光盘时要保证虚拟机光盘处于连接状态 命令&#xff1a;[rootlocalhost mnt]# mount /dev/sr0 /mnt # 此时还未挂载 [rootlo…

安装cad显示找不到msvcp140.dll怎么解决?靠谱的msvcp140.dll丢失的解决方法分享

在安装 CAD 软件时&#xff0c;出现找不到 msvcp140.dll 的困扰&#xff0c;让许多用户感到十分沮丧。msvcp140.dll 是 Visual C Redistributable for Visual Studio 2015 的运行库文件&#xff0c;对于 CAD 软件的正常运行至关重要。因此&#xff0c;解决这个问题是当务之急。…

玩转Linux—如何在Linux环境中部署MySQL、Redis和nginx

1、Linux常用命令 Linux学习之路&#xff1a; VMware虚拟机安装Linux系统(详解版) 查看当前文件目录&#xff1a;ls查看目录中文件详细信息&#xff1a;ll输出当前所处的目文件目录&#xff1a;pwdLinux查看当前IP地址&#xff1a;ifconfigWindows查看当前IP地址&#xff1…

如何使用大语言模型来绘制图画

请创作一张科技感十足的图片&#xff0c;包含siri和iphone两个元素&#xff0c;请帮我挑选合适的style和background 好的&#xff0c;我会为你创作一张科技感十足的图片&#xff0c;包含siri和iphone两个元素。我会根据你的要求&#xff0c;选择一种适合的风格和背景。请稍等一…

制作电子期刊没模板?请疯狂看我

你们是不是也在为制作电子期刊而烦恼&#xff1f;没有合适的模板&#xff0c;内容再精彩也难以展现。今天给大家分享一个超级实用的秘籍&#xff01;✨ 首先&#xff0c;我们要明白&#xff0c;电子期刊制作的关键在于模板的选择。一个好的模板可以让你的内容瞬间焕发光彩。但是…

Nodejs 第十七章(events)

EventEmitter Node.js 核心 API 都是采用异步事件驱动架构&#xff0c;简单来说就是通过有效的方法来监听事件状态的变化&#xff0c;并在变化的时候做出相应的动作。 fs.mkdir(/tmp/a/apple, { recursive: true }, (err) > {if (err) throw err; });process.on(xxx,()>…

玩转ChatGPT:DALL·E 3生成图像

一、写在前面 好久不更新咯&#xff0c;因为没有什么有意思的东西分享的。 今天更新&#xff0c;是因为GPT整合了自家的图像生成工具&#xff0c;名字叫作DALLE 3。 DALLE 3是OpenAI推出的一种生成图像的模型&#xff0c;它基于GPT-3架构进行训练&#xff0c;但是它的主要目…

STM32CubeMX学习笔记-USART_DMA

STM32CubeMX学习笔记-USART_DMA 一、DMA的概念二、数据传输方式普通模式循环模式 三、以串口方式讲解串口DMA方式发送函数&#xff1a;HAL_UART_Transmit_DMA串口DMA方式接收函数&#xff1a;HAL_UART_Receive_DMA获取未传输数据个数函数&#xff1a;__HAL_DMA_GET_COUNTER关闭…

IIS解决上传文件大小限制

IIS解决上传文件大小限制 目的&#xff1a;通过配置文件和IIS来解决服务器对上传文件大小的限制 1&#xff1a;修改配置文件&#xff08;默认为4M 值的大小根据自己情况进行修改&#xff09; <httpRuntime maxRequestLength"2048000" /> 2&#xff1a;修改IIS配…

LVGL_基础控件Switch_Button

LVGL_基础控件Switch_Button 1、创建switch_button /* 创建一个 switch 部件(对象) */ lv_obj_t * sw lv_switch_create(lv_scr_act()); // 创建一个 switch 部件(对象),他的父对象是活动屏幕对象 lv_obj_center(sw); // 方法1&…

我的创作纪念日-第1024天

文章目录 一、机缘二、收获三、日常四、憧憬 一、机缘 不知不觉&#xff0c;已经加入CSDN这个大家庭5年多了&#xff0c;回想起3年前发布第一篇博客的时候&#xff0c;那时我记得很清楚&#xff0c;我在做项目时遇到报错&#xff0c;解决问题之后&#xff0c;然后想起了好多人…

10分钟了解数据架构、数据模型

写在前面&#xff1a;很多小伙伴分不清数据架构与数据模型&#xff0c;同时如何做好数据建模也有一定的疑问 1. 数据架构、数据模型、数据建模区别与联系 企业架构包含业务架构、数据架构、应用架构和技术架构。数据架构的主要目标是有效的管理数据&#xff0c;以及有效地管理…

Docker---cgroups资源限制

目录 一、cpu资源控制 1、 设置cpu使用率上限 2、设置cpu资源占用比&#xff08;设置多个容器时才有效&#xff09; 3、设置容器绑定指定的CPU 三、内存资源控制 四、磁盘IO配额控制 1、限制Block IO 2、限制bps和iops进行限制 一、cpu资源控制 cgroups是一个非常强大的…

Vue组件路由

1&#xff0c;安装vue-router组件&#xff0c;终端输入&#xff1a; npm i vue-router3.5.3 2&#xff0c;在src文件夹下创建router目录 3&#xff0c;创建index.js文件&#xff0c;配置路由&#xff0c;导入需要路由的组件。以后每次添加路由只要在routes中改变即可。 impo…

YOLOV7改进实操-添加Wise IoU,实现有效提点

1、打开utils->general.py&#xff0c;找到bbox_iou&#xff08;&#xff09;&#xff0c;345行左右&#xff0c;将下面的与源码进行替换 wiou有三个版本&#xff0c;可以替换&#xff0c;看看哪一个提点多 class WIoU_Scale: monotonous: {None: origin v1True: monotoni…

NEFU数字图像处理(1)绪论

一、简介 1.1什么是数字图像 图像是三维场景在二维平面上的影像。根据其存储方式和表现形式&#xff0c;可以将图像分为模拟图像和数字图像两大类 图像处理方法&#xff1a;光学方法、电子学方法 模拟图像&#xff1a;连续的图像数字图像&#xff1a;通过对时间上和数值上连续…