9. selenium API 【万字】

news2024/11/29 2:29:17

目录

1. 元素的定位

1.1 css selector

1.1.1 id 选择器

1.1.2 类选择器

1.1.3 标签选择器

1.1.4 后代选择器

1.2 xpath

1.2.1 相对路径 + 索引

1.2.2 相对路径 + 元素

1.2.3 相对路径 + 通配符

1.2.4 相对路径 + 部分元素定位

1.2.5 相对路径 + 文本定位

1.3 应用:打开百度页面输入软件测试,点击百度一下

2. 操作测试对象

2.1 鼠标点击(click)与键盘输入(sendkeys)

2.2 submit 提交表单

2.3 getAttribute 获取元素文本

2.4 clear 清除输入

3. 添加等待

3.1 sleep 休眠

3.2 隐式等待

4. 打印信息

4.1 打印 url  

4.2 打印 title

5. 浏览器的操作

5.1 浏览器最大化

5.2 浏览器设置大小

5.3 浏览器的前进、后退、刷新

6. 键盘事件

6.1 键盘组合键用法

7. 鼠标事件

8. 定位一组元素


我们先来看一下之前测试环境搭建时的代码:

public class Main {
    public static void main(String[] args) {
        ChromeOptions options = new ChromeOptions();
        // 创建了一个 options 对象,用来给请求设置一些参数

        options.addArguments("--remote-allow-origins=*");
        // 允许所有的请求

        WebDriver webDriver = new ChromeDriver(options);
        // 创建驱动

        webDriver.get("https://www.baidu.com");
        // 打开百度网页

        webDriver.close();
        // 关闭网页
    }
}

运行以上代码就可以直接打开百度的网页。

接下来,基于以上代码我们来学习 selenium 的 API。

1. 元素的定位

对象的定位是自动化测试的核心,要想操作一个对象,首先应该识别这个对象。
webdriver 提供了一系列的对象定位方法,常用的有以下几种:
  • id
  • name
  • class name
  • link text
  • partial link text
  • tag name
  • xpath
  • css selector

我们主要来学习通过 xpath 和 css selector 进行定位。

1.1 css selector

CSS(Cascading Style Sheets) 是一种语言,它被用来描述  HTML 和  XML 文档的表现。
CSS 使用选择器来为页面元素绑定属性。这些选择器可以被  selenium 用作另外的定位策略。
CSS 比较灵活可以选择控件的任意属性,CSS的获取可以用 chrome F12 开发者模式中 Element- 右键 -copy-copy selector 来获取。

1.1.1 id 选择器

#+对应的 id 值

如何通过 id 选择器进行定位呢?

首先,选择我们要定位的元素(此处以搜索框作为被定位的元素),然后,ctrl + f 键,在搜索框中输入:#kw

此时,可以看到通过上下键定位到元素:

1.1.2 类选择器

. + 对应的 class 值

 找到我们需要定位的元素的代码,找到 class 值:

CTRL + F 键输入: .s_ipt

可以看到同样定位到了元素。

1.1.3 标签选择器

标签名

可以看到由于 span 标签特别多,因此无法具体的定位到某一个元素:

 因此,就需要引入我们下面即将说到的后代选择器。

1.1.4 后代选择器

父标签 + 空格 + 子标签 ( + :nth-child(n) )

 :nth-child(n) 是用来具体的定位子标签中的第 n 个。

父标签 + 空格 + 子标签:

父标签 + 空格 + 子标签  + 空格+ id 选择器:

1.2 xpath

XPath 是一种在  XML 文档中定位元素的语言。因为  HTML 可以看做  XML 的一种实现,所以 selenium 用户可使用这种强大语言在 web 应用中定位元素。
XPath 扩展了上面  id 和  name 定位方式,提供了很多种可能性。
XPATH 的获取可以用 chrome F12 开发者模式中 Element- 右键 -copy-copy xpath 来获取。
通过绝对路径进行定位:/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input

通过相对路径进行定位:以双斜杠开头

1.2.1 相对路径 + 索引

//form/span[1]/input[1]                 ---不写下标时默认是 1

1.2.2 相对路径 + 元素

 //span[@id="s-usersetting-top"]

 //span[@class="s-top-right-text c-font-normal c-color-t s-top-right-new"]

1.2.3 相对路径 + 通配符

 //span[@*="s-usersetting-top"]

1.2.4 相对路径 + 部分元素定位

 //input[starts-with(@autocomplete,'of')]

//*[starts-with(@autocomplete,'of')]

starts-with(string1,string2)

string1 以 string 2 开头 

1.2.5 相对路径 + 文本定位

 //a[text()="新闻"]

推荐使用 CSS 选择器定位元素,因为 xpath 定位元素效率非常低(需要将整个页面加载到内存中,然后再去定位元素)。

1.3 应用:打开百度页面输入软件测试,点击百度一下

private static void test02() {
        // 创建一个驱动
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        // 打开百度界面
        webDriver.get("https://www.baidu.com");
        // 通过 css selector选中搜索框 输入数据“软件测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 点击 百度一下 按钮
        // 通过 css selector
        //webDriver.findElement(By.cssSelector("#su")).click();
        // 通过 xpath
        webDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
    }

运行后,怎么确认搜索出来的结果是正确的呢?

可以看到“软件测试”位于 em  标签中。

测试是否实现以上需求的完整代码如下:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        //test01();  // 打开和关闭网页
        test02();
    }

    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");
        // 通过 css selector选中搜索框 输入数据“软件测试”
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 点击 百度一下 按钮
        // 通过 css selector
        //webDriver.findElement(By.cssSelector("#su")).click();
        // 通过 xpath
        webDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
        // 找到所有的“软件测试”文案对应的元素
        sleep(4000);
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("em"));
        System.out.println(String.valueOf(webElements.size()));
    }

    private static void test01() {
        ChromeOptions options = new ChromeOptions();
        // 创建了一个 options 对象,用来给请求设置一些参数
        options.addArguments("--remote-allow-origins=*");
        // 允许所有的请求
        WebDriver webDriver = new ChromeDriver(options);
        // 创建驱动
        webDriver.get("https://www.baidu.com");
        // 打开百度网页
        webDriver.close();
        // 关闭网页
    }

}

可以看到此时的界面中的“软件测试”文案一共有24个,如果以上代码中不添加休眠的话可能会打印0,因为页面的渲染也是需要一定时间的。

// 如果搜索结果不为0,则测试通过;否则,测试不通过
        if(String.valueOf(webElements.size()).equals(0)){
            System.out.println("测试未通过");
        }else {
            System.out.println("测试通过");
        }

2. 操作测试对象

定位元素是第一步,在定位元素后,需要对这个元素进行进一步的操作。

webdriver 中比较常用的操作对象的方法有下面几个:
  • click 点击对象
  • sendkeys 在对象上模拟按键输入
  • clear 清除对象输入的文本内容
  • submit 提交
  • getAttribute 用于获取元素的文本信息

2.1 鼠标点击(click)与键盘输入(sendkeys)

上述通过百度进行搜索的案例即是。

2.2 submit 提交表单

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

可以看到“百度一下”按钮位于 form 表单中:

因此,我们可以直接将 click 方法替换为 submit 方法:

接下来,我们对于不在 form 标签中的元素使用 submit 方法验证一下:

private static void test04() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).submit();
    }

可以看到不在 from 标签内的元素是无法使用 submit 方法的。

2.3 getAttribute 获取元素文本

private static void text03() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("test");
    }

执行以上代码,可以看到已经输入了“test”:

 此时运行代码:

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

可以看到已经将对应的结果搜索出来了:

 接下来,定位想要获取的文本内容:

接下来将 value 的值,添加到 getAttribute 方法中:

String search_result = webDriver.findElement(By.cssSelector("#su")).getAttribute("value");

可以看到上图成功打印了结果。

2.4 clear 清除输入

private static void test05() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        sleep(2000);
        webDriver.findElement(By.cssSelector("#kw")).clear();
    }

3. 添加等待

3.1 sleep 休眠

如上述代码中的 sleep(2000); 我们只需要将异常抛出即可。

3.2 隐式等待

通过添加  implicWait() 方法就可以方便的实现智能等待。
  implicWait() 的用法比 sleep() 更智能,后者只能选择一个固定的时间的等待,前者可以在一个时间范围内智能的等待。
private static void test06() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        webDriver.findElement(By.cssSelector("#su")).click();
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.DAYS);
        webDriver.findElement(By.cssSelector("#kw")).clear();
        webDriver.quit();
    }

在代码中,我们设置了让程序等待 3 天再退出,然而在运行代码后发现,程序运行结束后就立刻退出了。

隐式地等待并非一个固定的等待时间,当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长。

4. 打印信息

4.1 打印 url  

private static void test07() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        // 如果当前页面的 url 等于 https://www.baidu.com 则测试通过
        String url = webDriver.getCurrentUrl();
        System.out.println(url);
        if(url.equals("https://www.baidu.com/")){
            System.out.println("测试通过");
        }else{
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

4.2 打印 title

private static void test08() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        String title = webDriver.getTitle();
        System.out.println(title);
        if(title.equals("百度一下,你就知道")){
            System.out.println("测试通过");
        }else{
            System.out.println("测试不通过");
        }
        webDriver.quit();
    }

5. 浏览器的操作

5.1 浏览器最大化

private static void test09() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        // 浏览器最大化
        //webDriver.manage().window().maximize(); 
        // 浏览器全屏
        webDriver.manage().window().fullscreen(); 
        
    }

5.2 浏览器设置大小

webDriver.manage().window().setSize(new Dimension(500,500));

5.3 浏览器的前进、后退、刷新

private static void test10() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        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();
    }

6. 键盘事件

6.1 键盘组合键用法

private static void test11() throws InterruptedException {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("https://www.baidu.com/");
        webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");
        // 按下 CTRL + A
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "A");
        sleep(3000);
        // 按下 CTRL + X
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "X");
        sleep(3000);
        // 按下 CTRL + V
        webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL + "V");
        sleep(3000);
        webDriver.findElement(By.cssSelector("#su")).click();
    }

7. 鼠标事件

 private static void test12() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        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("#s_tab > div > a.s-tab-item.s-tab-item_1CwH-.s-tab-wenku_GwhrW.s-tab-wenku"));
        actions.moveToElement(target);
        // 对元素进行右击
        actions.contextClick(target).perform();
    }

8. 定位一组元素

我们先运行一段 HTML 的代码:

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

 运行后,出现如上图所示界面。接下来在这个界面我们进行操作:

radio -- 单选;checkbox -- 复选框

 接下来,我们选中页面上的所有复选框:

private static void page01() {
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--remote-allow-origins=*");
        WebDriver webDriver = new ChromeDriver(options);
        webDriver.get("http://localhost:63342/Main.java/Page/tset01.html?_ijt=rk0f3bk1bgfmi7vnh9pdja1905&_ij_reload=RELOAD_ON_SAVE");
        // 获取到 input 标签下的所有元素
        List<WebElement> webElements = webDriver.findElements(By.cssSelector("input"));
        for (int i = 0; i < webElements.size(); i++) {
            if(webElements.get(i).getAttribute("type").equals("radio")){

            }else{
                webElements.get(i).click();
            }

        }
    }

 

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

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

相关文章

gazebo软件建立带摄像和红外功能的小车

背景&#xff1a; 为了方便调整摄像头的高度&#xff0c;我需要重新构建以下带小车的模型。小白分享来了。 目录 1. 先构建一个能跑的小车。 1.1 gazebo设计四个物体&#xff1a;车体三个车轮。组合然后构建好后在本地保存成小车模型。 1.2 打开本地文件添加plugin插件&…

转行软件测试成功的关键因素是什么?

三年前张伟是一名厨师,职高毕业&#xff0c;团队一共有5个人&#xff0c;大家各自负责自己的模块&#xff0c;整体上感觉相差不大&#xff0c;特别的团结稳定。 可是后来随着疫情的发生&#xff0c;对整个社会都产生了严重的冲击&#xff0c;饭店每天的订单是越来越少&#xf…

Spark 4:Spark Core 共享变量

广播变量 # coding:utf8 import timefrom pyspark import SparkConf, SparkContext from pyspark.storagelevel import StorageLevelif __name__ __main__:conf SparkConf().setAppName("test").setMaster("local[*]")sc SparkContext(confconf)stu_inf…

设计模式day03

01gradle极速安装与配置入门 下载6.8.2版本,配置环境变量 配置镜像仓库 给gradle安装目录下init.d文件夹&#xff0c;放一个init.gradle文件&#xff0c;内容如下&#xff1a; gradle.projectsLoaded {rootProject.allprojects {buildscript {repositories {def JCENTER_URL…

go语言计算推算心率算法 http服务

目的 为了计算心率和并且将心率计算作为http服务来运行 几种计算方法 1 基本数据 a&#xff09; hrv heart rate variability b&#xff09; 呼吸 2 傅里叶变换 计算频率 高频和低频 3 隐形马尔科夫 模型 hmm 重在于推测概率 根据最近的心率计算 4 神经网络计算 基本计算 …

APP外包开发原生和H5的对比

在开发APP的技术中&#xff0c;除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高&#xff0c;用户体验更好&#xff0c;但成本高&#xff0c;适用于对质量要求高的APP项目。H5框架的特点是通用性较强&#xff0c;对开发人员的要求相对较低&#xff0c;成本也低&a…

23款奔驰GLE350轿跑加装前排原厂座椅通风系统,夏天必备的功能

通风座椅的主动通风功能可以迅速将座椅表面温度降至适宜程度&#xff0c;从而确保最佳座椅舒适性。该功能启用后&#xff0c;车内空气透过打孔皮饰座套被吸入座椅内部&#xff0c;持续时间为 8 分钟。然后&#xff0c;风扇会自动改变旋转方向&#xff0c;将更凉爽的环境空气从座…

怎么批量查询快递单号的物流状态并导出查询数据

随着互联网技术的不断发展&#xff0c;电商行业想做大做强&#xff0c;售后环节一定要做到位。想要做好售后服务&#xff0c;需要借助一些技巧与手段。今天小编给大家安利一款软件&#xff1a;“固乔快递查询助手”&#xff0c;这是一款可以批量查询快递信息的软件&#xff0c;…

python_PyQt5开发股票日数据更新工具

写在前面&#xff1a; 该工具更新的股票日数据来自优矿&#xff0c;为了把股票日数据在本地存储一份&#xff0c;这就面临需要定期更新的需求&#xff0c;为此开发了这个工具。 定期更新的股票日数据特征&#xff1a; 1 旧股票日数据&#xff08;也就是上次更新的数据&#…

【机器学习】吴恩达课程2-单变量线性回归

一、单变量线性回归 1. 模型描述 监督学习的流程 & 单变量线性回归函数 代价函数&#xff1a;&#xff0c;其中 m 表示训练样本的数量 公式为预测值与实际值的差&#xff0c;平方为最小二乘法和最佳平方/函数逼近。 目标&#xff1a;最小化代价函数&#xff0c;即 2. 只…

PR模板-33组故障干扰文字标题动画 Motion Glitch Typography

Motion Glitch Typography包含33组故障干扰文字标题动画pr模板。不需要任何插件或脚本&#xff0c;只需点击几下&#xff0c;您的视频就有很酷的故障标题动画&#xff0c;适用于预告片、宣传片或任何类型的视频。 适用软件&#xff1a;Premiere Pro 2020 或更高版本 分辨率&a…

Go语言之函数补充defer语句,递归函数,章节练习

defer语句是go语言提供的一种用于注册延迟调用的机制&#xff0c;是go语言中一种很有用的特性。 defer语句注册了一个函数调用&#xff0c;这个调用会延迟到defer语句所在的函数执行完毕后执行&#xff0c;所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句…

密码学学习笔记(十四):SHA-3 Sponge Construction - 海绵结构

SHA-3算法满足了哈希函数的三个安全属性&#xff0c;并且和SHA-2的变体达到同样级别的安全性。此外&#xff0c;SHA-3算法不容易受到长度扩展攻击&#xff0c;并可用于计算秘密消息的哈希值。 SHA-3是一种建立在Permutation(置换)之上的密码算法。 置换就是假设有两个数组a和…

Hadoop第一课之环境配置

1.配置一个模板机 要求&#xff1a;IP DNS地址页 网址 防火墙 安装包 1.ip ifconfig 查询 先用虚拟机看一下自己的网关 vim search/provides 命令 查找 # 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 如果提示找不到vim命令&#xff0c;使用yum下载v…

Springboot Excel 最简单的 多sheet表 导入导出

前言 上周学习群里有人问到&#xff0c;多个sheet的导出导入&#xff0c;我第一反应就是easypoi不是自己就有方法了么&#xff1f; 后面一想&#xff0c;可能有些看客还处于是 找工具类&#xff0c;然后调试 的写代码 的 阶段&#xff0c;可能还不会去看jar包的一些函数。 既然…

SpringMVC入门篇5 --- 拦截器

目录 1. 简介 拦截器&#xff08;Interceptor&#xff09;是一种动态拦截方法调用的机制。 作用&#xff1a; 在指定的方法调用前后执行预先设定后的代码。阻止原始方法的执行。 拦截器与过滤器的区别 归属不同&#xff1a;Filter属于Servlet技术&#xff0c;Interceptor…

使用vue3 + Ts + Vite + ElementPlus实现一个抽奖程序

一. 说明 这是一个通过vue3 Ts Vite ElementPlus实现的一个抽奖程序。项目链接 二. 整体架构与功能描述 左侧设置了奖品说明&#xff0c;每个奖项配有文字和图片简介。总共设置了四个奖项&#xff0c;分别是特等奖1名&#xff0c;一等奖2名&#xff0c;二等奖5名&#xf…

平安养老险党委书记、董事长甘为民:聚焦养老主业 助推养老保障事业高质量发展

每经记者 涂颖浩 每经编辑 马子卿 随着人口老龄化趋势加剧&#xff0c;中国养老金融市场呈现出巨大的潜力&#xff0c;逐步迈入养老新时代。近日&#xff0c;平安养老险党委书记、董事长甘为民在接受《每日经济新闻》记者专访时表示&#xff0c;过往单纯的养老发展模式难以满足…

Jmeter性能测试 —— 性能测试的概念

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

浅析编译与链接

生成可执行文件的四个过程 当编写和构建计算机程序时&#xff0c;预处理、编译、汇编和链接是将源代码转化为可执行程序的关键过程。以下是对每个阶段的详细解释&#xff1a; 1. 预处理&#xff08;Preprocessing&#xff09;&#xff1a;将.c/.cpp文件中的头文件展开、宏展开…