selenium基础语法

news2024/11/24 8:46:50

文章目录

  • selenium基础语法
    • 1.定位页面元素
    • 2.元素的操作
      • 1) 模拟键盘输入(send_keys)
      • 2) 点击操作(click)
      • 3) 清除去对象输入的文本内容(clear)
      • 4) 获取文本(gettext)
    • 3. 等待
    • 4. 信息打印
    • 5. 窗口
    • 6. 导航
    • 7. 弹窗
    • 8. 鼠标和弹窗
    • 9.选择框
    • 10.文件上传
    • 11.屏幕截图


selenium基础语法

1.定位页面元素

通过CSS选择器可以定位到页面的元素,比如常见的基础选择器、Id选择器、类选择器、复合选择器…。

通过Chrome的F12的开发者工具,右击对应的标签选择复制,复制selector。就复制了对应的CSS。选择复制xpath就复制对应的xpath。

  • 通过driver.findElement方法定位页面的元素,该方法的参数为抽象类By里的方法
  • 比如By.cssSelector()By.xpath()、**By.id()**等
  • 需要注意无论哪一种方法定位到的元素一定要唯一

在这里插入图片描述

public static void test1() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(1500);
        driver.get("https://www.baidu.com/");//打开连接
        Thread.sleep(1500);
        driver.findElement(By.cssSelector("#kw")); //CSS选择
        driver.findElement(By.xpath("//*[@id=\"kw\"]"));// 通过xpath选择
        Thread.sleep(3000);
        driver.quit();//退出
    }

2.元素的操作

1) 模拟键盘输入(send_keys)

  • 通过对应的选择器选择对象后可以通过send_keys进行输入
  • 一下代码是在百度输入框输入CSDN
public static void test1() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(1500);
        driver.get("https://www.baidu.com/");//打开连接
        Thread.sleep(1500);
        driver.findElement(By.cssSelector("#kw")).sendKeys("CSDN"); //CSS选择
        Thread.sleep(3000);
        driver.quit();//退出
    }

2) 点击操作(click)

通过click可以实现点击和提交,submit可以实现提交。

click可以的操作submit不一定可以,页面的任何元素都可以click,所有更推荐使用。

public static void test1() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(1500);
        driver.get("https://www.baidu.com/");//打开连接
        Thread.sleep(1500);
        driver.findElement(By.cssSelector("#kw")).sendKeys("CSDN"); //CSS选择后在百度输入框输入CSDN
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();//点击百度搜索按钮
        Thread.sleep(3000);
        driver.quit();//退出
    }

3) 清除去对象输入的文本内容(clear)

通过clerar可以清空输入框里的内容

public static void test1() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(1500);
        driver.get("https://www.baidu.com/");//打开连接
        Thread.sleep(1500);
        driver.findElement(By.cssSelector("#kw")).sendKeys("CSDN"); //CSS选择后在百度输入框输入CSDN
        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#kw")).clear();//清空输入框的内容
        Thread.sleep(1000);
        driver.findElement(By.cssSelector("#kw")).sendKeys("leetcode");
        Thread.sleep(1000);
        driver.findElement(By.xpath("//*[@id=\"su\"]")).click();//点击百度搜索按钮
        Thread.sleep(3000);
        driver.quit();//退出
    }

4) 获取文本(gettext)

通过gettext可以获取文本内容

比如获取百度首页的新闻两字

在这里插入图片描述

public static void test2() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com/");
        Thread.sleep(1000);
        String str = driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).getText();
        System.out.println(str);
    }

需要注意一下:不是说页面上可以看见的文字都能成为文本,有的文本是属性对应的属性值,不能通过getText来获取文本。需要使用getAttribute方法来获取属性值。

比如说要获取百度一下按钮的属性值
在这里插入图片描述

public static void test2() throws InterruptedException {
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--remote-allow-origins=*");
    ChromeDriver driver = new ChromeDriver(options);
    driver.get("https://www.baidu.com/");
    Thread.sleep(1000);
    String str = driver.findElement(By.cssSelector("#su")).getAttribute("value");
    System.out.println(str);
}

3. 等待

代码的执行速度是非常快的,而前端响应页面渲染的速度相对来说是比较慢一点的,可能导致的结果是:代码已经执行到了下一步,页面还没有渲染出来,元素找不到。所以需要进行等待。

等待分为三个:强制等待隐式等待显式等待

  • 强制等待

    使用Thread.sleep,让程序暂停一会,等待指定的时间之后继续执行下一步.

    • 优点:语法简单,适合调试时使用
    • 缺点:需要等待的时间固定,造成测试时间的大量消耗,大大的减少了自动化测试效率。
  • 隐式等待

    在规定 时间范围内,轮询等待元素出现之后就立即结束,如果规定时间内元素仍然没有出现,则会抛出一个NoSuchElementException

    ChromeOptions options = new ChromeOptions();
    options.addArguments("--remote-allow-origins=*");
    ChromeDriver driver = new ChromeDriver(options);
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(1));// 隐式等待1秒
    

    隐式等待作用在webdriver整个生命周期,只要没有执行driver.quit,也就是没有退出浏览器,隐式等待都是一直存在的

    • 优点:节省了大量的等待时间,元素展示之后就可以立即执行下一步,执行效率高
    • 缺点:需要等待所有元素都展现才会执行下一步,仍然会有额外的时间上的浪费(比如我们需要选择的元素已经瞬间渲染了,但是其它元素还没有渲染,此时就需要等待其它元素显示完毕)
  • 显示等待

    强制等待可以针对某一个元素来测试

    • WebDriverWait,第一个参数 webdriver对象,第二个参数,Duration类方法,用于设置等待时间
    public static void test4() {
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--remote-allow-origins=*");
            ChromeDriver driver = new ChromeDriver(options);
            driver.get("https://www.baidu.com/");
            WebDriverWait webDriverWait = new WebDriverWait(driver,Duration.ofSeconds(1));
            webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#kw")));
        
    

    强制等待什么时候停止?等括号里的条件满足为止,如果条件在指定时间内没有满足,就会抛出异常。

    • 优点:针对某一个元素来进行等待,极大的降低了自动化测试的的等待时间
    • 缺点:写法复杂
  • ExpectedConditions是selenium中的一个类,提供了很多方法来进行测试

    • ExpectedConditions.presenceOfElementLocated(检查页面是否存在对应元素)
    • ExpectedConditions.textToBe(检查页面对应的文本信息是否正确)

代码中不建议同时使用隐式等待和强制等待,同时使用可能会出现一个意想不到的结果。

4. 信息打印

  • 打印标题(getTitle())
  • 打印当前URL(getCurrentUrl())
public static void test5() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(1000);
        driver.get("https://www.baidu.com");
        Thread.sleep(1000);
        String title = driver.getTitle();
        String url = driver.getCurrentUrl();
        System.out.println("当前标题:"+title);
        System.out.println("当前url:"+url);
    }

但如果我们进入到百度首页点解新闻页面后,再次打印url和title还是首页的信息

在这里插入图片描述

public static void test5() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        Thread.sleep(2000);
        driver.get("https://www.baidu.com/");
        Thread.sleep(2000);
        String title = driver.getTitle();
        String url = driver.getCurrentUrl();
        System.out.println("当前标题:"+title);
        System.out.println("当前url:"+url);
        Thread.sleep(2000);
        // 点击切换到新闻页面
        driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).click();
        Thread.sleep(2000);
        title = driver.getTitle();
        url = driver.getCurrentUrl();
        System.out.println("当前标题:"+title);
        System.out.println("当前url:"+url);
        Thread.sleep(2000);
        driver.quit();
    }

点击超链接之后打开了新的标签页,这对于selenium来说是不知道该展示的页面是什么,selenium对于每一个标签页都给了唯一标识,称为句柄。

在这里插入图片描述

5. 窗口

  • 获取当前页面的句柄:driver.getWindowHandle()
  • 获取所有标签页的句柄:driver.getWindowHandles()
  • 切换到新标签页面:driver.switchTo().window(句柄)

通过句柄我们就能跳转到指定页面了

public static void test6() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
        Thread.sleep(2000);
        // 获取百度首页句柄
        String window = driver.getWindowHandle();
        Thread.sleep(2000);
        // 点击按钮跳转得到新闻页面
        driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();
        Thread.sleep(2000);
        // 获取所有标签页的句柄
        Set<String> windows = driver.getWindowHandles();
        for (String s : windows) {
            if (!s.equals(window)) {
                // 切换到新闻页窗口
                driver.switchTo().window(s);
            }
        }
        System.out.println("Title:"+driver.getTitle());
        System.out.println("Url:"+driver.getCurrentUrl());
        driver.quit();
    }

窗口大小设置

  • 最大化:driver.manage().window().maximize()
  • 最小化:driver.manage().window().minimize()
  • 设置指定尺寸:driver.manage().window().setSize(new Dimension(宽,高)
public static void test7() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
        Thread.sleep(1000);

        // 窗口最小化
        driver.manage().window().minimize();
        Thread.sleep(3000);
        // 窗口最大化
        driver.manage().window().maximize();
        Thread.sleep(3000);
        // 指定窗口大小
        driver.manage().window().setSize(new Dimension(1500,1000));
        Thread.sleep(3000);
        driver.quit();
    }

6. 导航

selenium里提供了navigate接口来实现页面的导航

在这里插入图片描述

  • 前进:driver.navigate().forward()
  • 后退:driver.navigate().back()
public static void test8() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        // 打开百度翻译
        driver.get("https://fanyi-pro.baidu.com/?hmsr=%E7%99%BE%E5%BA%A6%E7%BF%BB%E8%AF%91&hmpl=%E5%9B%BA%E5%AE%9A%E5%85%A5%E5%8F%A3&hmcu=%E9%A1%B6%E9%83%A8%E6%8C%89%E9%92%AE");
        // 点击日常快译
        driver.findElement(By.xpath("//*[@id=\"whole-page-header\"]/div/ul/li[2]/a")).click();
        Thread.sleep(2000);
        // 后退
        driver.navigate().back();
        Thread.sleep(1500);
        // 前进
        driver.navigate().forward();
        Thread.sleep(1500);
        // 后退
        driver.navigate().back();
        Thread.sleep(1500);
        // 前进
        driver.navigate().forward();
        Thread.sleep(2000);
        driver.quit();
    }

7. 弹窗

selenium不能直接编译js语言,但是仍然可以使用方法来执行Js语言,使用driver.executeScrip(js语言)

这种方式类似于在F12里执行Js

public static void test9() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
        driver.executeScript("alert('test')");
        Thread.sleep(2000);
        driver.quit();
    }

可以在前端代码里定位到普通的弹窗都可以使用**driver.findElement()**方法来定位到元素,但还有一些弹窗是无法定位到的。

警告弹窗和确认弹窗是不能在前端代码定位到元素的,需要使用Selenium中提供Alert接口来处理
在这里插入图片描述

Alert alert = driver.switchTo().alert();
alert.accept();// 点击弹窗上的确认按钮
alert.dismiss();//点击弹窗上的取消按钮

提示弹窗

在这里插入图片描述

代码

Alert alert = driver.switchTo().alert();
alert.sendKeys("哈哈哈");// 输入
Thread.sleep(2000);
alert.accept();

8. 鼠标和弹窗

selenium提供了Actions接口

鼠标移动到指定元素上

关键代码:actions.clickAndHold(element).perform()

public static void test12() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
        Thread.sleep(2000);
        WebElement element = driver.findElement(By.cssSelector("#form > span.bg.s_ipt_wr.new-pmd.quickdelete-wrap > span.soutu-btn"));
        Actions actions = new Actions(driver);
        actions.clickAndHold(element).perform();
        Thread.sleep(3000);
        driver.quit();
    }

键盘输入sendKeys

driver.findElement(By.cssSelector("#kw")).sendKeys("CSDN");

9.选择框

selenium提供了select接口

在这里插入图片描述

  • selectByValue:通过values属性来选择
  • selectByIndex:通过索引来选择,索引从0开始
  • selectByVisibleText:通过option里的课件文本来选择
<select>
	<option value="default">请选择</option>
	<option value ="one">吃饭</option>
	<option value ="tow">睡觉</option>
	<option value="three">打豆豆</option>

</select>
public static void test13() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);

        driver.get("./test.html");
        Thread.sleep(2000);
        WebElement element = driver.findElement(By.xpath("/html/body/select"));
        Select select = new Select(element);
        select.selectByValue("one");
        Thread.sleep(2000);
        select.selectByIndex(0);
        Thread.sleep(2000);
        select.selectByVisibleText("打豆豆");
        Thread.sleep(1000);
        driver.quit();
    }

10.文件上传

页面中点击上传文件会弹出来系统窗口,selenium不能操作系统窗口。

通过sendKey方法输入我们想要上传的文件路径以及文件名,就能后达到文件上传的一个操作

在这里插入图片描述

// 获取上传文件按钮
WebElement element = driver.findElement(By.cssSelector("#uploadImg"));
// 指定路径选择文件
element.sendKeys("C:\\Users\\HeHanYu\\Desktop\\code\\spring.jpg");

11.屏幕截图

selinium还提供了屏幕截图API,就可以验证代码的执行速度比页面的渲染速度快不少了。

public static void test15() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        ChromeDriver driver = new ChromeDriver(options);
        driver.get("https://www.baidu.com");
        driver.findElement(By.cssSelector("#kw")).sendKeys("selenium");
        driver.findElement(By.cssSelector("#su")).click();
        // 屏幕截图
        File srcFile = driver.getScreenshotAs(OutputType.FILE);
        // 将截图问价保存到指定路径下
        File fileName = new File("./src/test/img/demo.jpg");
        FileUtil.copyFile(srcFile,fileName);

    }

当点击搜索后,进行了屏幕截图,发现页面的确没有渲染出来,所有在使用selenium操作页面元素时要使用一些等待操作

在这里插入图片描述


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

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

相关文章

面试官问:kafka为什么如此之快?

前言 天下武功&#xff0c;唯快不破。同样的&#xff0c;kafka在消息队列领域&#xff0c;也是非常快的&#xff0c;这里的块指的是kafka在单位时间搬运的数据量大小&#xff0c;也就是吞吐量&#xff0c;下图是搬运网上的一个性能测试结果&#xff0c;在同步发送场景下&#…

OpenStack介绍

OpenStack 1. OpenStack1.1 简介1.2 OpenStack和KVM有什么关系和区别&#xff1f;1.3 编写语言 2. 主要模块介绍2.1 OpenStack计算设施 - Nova1. API服务器&#xff08;nova-api&#xff09;2. 消息队列&#xff08;Rabbit MQ Server&#xff09;3. 运算工作站&#xff08;nova…

LibTorch部署图像处理相关算法详细教程(附代码)

深度学习图像处理相关代码LibTorch部署详细教程 前言LibTorch简介LibTorch环境安装及问题解决LibTorch涉及的Tensor基本操作张量初始化张量变形张量截取张量间操作 部署过程测试环境推理过程代码Demo扩展部分 前言 本文写于调研深度学习部署方法工作中&#xff0c;需要将图像分…

如何将PDF转Excel并保持原有格式不变?分享三个方法给大家!

在日常办公中&#xff0c;我们常常面临一个问题&#xff1a;领导给我们发了一个PDF文件&#xff0c;并要求我们尽快修改其中的表格数据。然而&#xff0c;当我们将PDF文件转换成Excel格式时&#xff0c;经常会出现文件排版错乱的情况。时间的紧迫和数据的混乱可能会让我们感到十…

【FTP】FTP被动模式跨网传输失败

FTP被动模式所需的端口21、20、60000-60050 假如端口20未开策略的话&#xff0c;造成传输失败 需要在FTP服务端用户配置文件里设置pasv_address&#xff08;对外的ip地址&#xff09; 特此记录一下&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…

NLP(2)N-gram language Model (缺了一些平滑的方式介绍)

文章目录 N-gram Language ModelTrigram Example存在的问题smoothingLaplacian &#xff08;add-one&#xff09; smoothing案例 1案例 2 Add-k smoothingAbsolute Discounting案例 Interpolation 在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;语言模型&#xff08…

机器鸟实现扇动翅膀功能

1. 功能说明 本文示例将实现机器鸟扇动翅膀的功能。 2. 结构说明 鸟类的翅膀主要由肩关节、肘关节、腕关节组成&#xff0c;本样机利用组合机构设计机器鸟的扑翼机构。 拥有两个关节的机器鸟扑翼机构结构图 单侧翅膀 双翅 尾部 整机 3. 电子硬件 在这个示例中&#xff0c;我们…

使用Optuna进行PyTorch模型的超参数调优

Optuna是一个开源的超参数优化框架&#xff0c;Optuna与框架无关&#xff0c;可以在任何机器学习或深度学习框架中使用它。本文将以表格数据为例&#xff0c;使用Optuna对PyTorch模型进行超参数调优。 Optuna可以使用python pip安装&#xff0c;如pip install Optuna。也可以使…

【Spring】— 动态SQL :<foreach>元素、<bind>元素

目录 <foreach>元素<bind>元素 <foreach>元素 MyBatis中已经提供了一种用于数组和集合循环遍历的方式&#xff0c;那就是使用<foreach>元素。假设在一个用户表中有1000条数据&#xff0c;现在需要将id值小于100的用户信息全部查询出来&#xff0c;就可…

MFC(十三)多个对话框

设置向导模式 1.打开类视图&#xff0c;右键项目--->类向导-->添加Cpropsheet类&#xff0c;命名为mypropsheet CPropertySheet 是 MFC 的一个类&#xff0c;用于创建包含多个属性页的对话框。它可以使用内置的向导模式&#xff0c;向用户显示“下一步”和“上一步”按…

unity创建urp的方法

Unity里URP项目的介绍和创建 URP(Universal Render Pipeline)通用渲染管线&#xff0c;是Unity在2019.3版本之后推出的一种新的渲染管线。 对比起默认的渲染管线&#xff0c;他的使用上会产生了一些变化&#xff0c;包括了摄像机的使用、Shader的编写等。 传统的渲染管线在渲染…

采用动态规划来处理有向无环图最短路径问题,c++实现

采用动态规划来处理有向无环图最短路径问题&#xff0c;c实现 需求描述实现思路代码实现 需求描述 如图&#xff0c;在一个无环有向图中&#xff0c;找到起点0到终点的最短路径 实现思路 设s1,s2,…, st 是一条最短路径假设s1&#xff0c;s2&#xff0c;已求出&#xff0c;则…

JS 事件循环机制、调用栈、堆、主线程、宏任务队列、微任务队列、缓存管理之间的关系

一、事件循环机制 你是否想过&#xff0c;在控制台执行代码时&#xff0c;为什么能立即得到响应&#xff1f; 实际上&#xff0c;底层有一套模型机制叫 事件循环&#xff0c;换句话说&#xff0c;它是一个”死循环“&#xff0c; 里面负责监听&执行我们写的 JS 代码&#…

spring+springMVC+mybatis实现的物业管理系统

本系统借用了前辈的页面框架来实现了一个物业管理系统&#xff0c;使用到的主要技术有&#xff1a;SSM框架&#xff0c;MySql 8.0数据库&#xff0c;tomcat 8.0&#xff0c;使用maven进行依赖管理&#xff0c;前端页面使用的是jsp。整个系统分为用户端和管理员端。 用户端功能有…

Vue.js 中的权限控制是什么?如何进行权限控制?

Vue.js 中的权限控制是什么&#xff1f;如何进行权限控制&#xff1f; 在现代 Web 应用程序中&#xff0c;权限控制是一个重要的话题。Vue.js 作为一种现代的前端框架&#xff0c;提供了一些有用的工具和技术来实现权限控制。本文将介绍 Vue.js 中的权限控制的概念、作用以及如…

一文教你认清云渲染的优势和劣势

在当今数字化时代&#xff0c;云渲染作为一项创新的技术方案&#xff0c;正逐渐成为许多行业中的热门话题。与传统的本地渲染相比&#xff0c;云渲染具备许多独特的优势和劣势。本文将深入探讨云渲染的各项特点&#xff0c;帮助您全面了解这一技术&#xff0c;并为您提供有关云…

js+canvas实现劈腿关系图

【我愿称多对一 一对多关系为劈腿关系】 【仓库地址】gitgithub.com:yyccmmkk/rl.git 【显示所有线路细节】 【合并线路】 【合并同一个目标点线路】 【合并同一个出发点线路】 【数据结构】 原始数据只需要提供节点自身id 父点节id&#xff0c;劈腿关系图自动处理 [{id:z…

基于CSDN上海城市开发者社区第一次线下沙龙的筹备经验分享

引言 由于时间较为紧张、邹老师行程安排紧凑等因素影响&#xff0c;结合实际情况&#xff0c;改茶话会为聚餐&#xff0c;所以在举办线下沙龙的时候一定要根据实际情况来斟酌活动形式。本次活动是和哈士奇&#xff0c;哈哥一起筹备&#xff0c;也得到了哈哥的大力支持&#xff…

如何进行物联网开发可以快速完成产品研发?

物联网产品的研发与开发过程&#xff0c;是一个不断探索、创新、实践的过程&#xff0c;需要很长的周期&#xff0c;在这个过程中&#xff0c;项目团队往往需要投入大量的人力、物力和时间。同时&#xff0c;物联网产品研发过程中还涉及到大量的专业技术和知识&#xff0c;需要…

从git上拉取项目

目录 一、前期准备&#xff0c;获取git下载链接 二、idea下载 2.1.打开git下载界面 2.2.进入下载界面 2.3.下载前期配置 2.4.输入账号密码 2.5.下载完成后idea打开 2.6.下载完成后文件目录展示 三、命令行下载 3.1.打开所需要下载的项目路径 3.2.进入黑窗口 …