C++入门到进阶(图文详解,持续更新中)
C++入门到进阶(图文详解,持续更新中)
详解C++入门知识到进阶,配合图观看易于理解记录
文章目录
-
目录
C++入门到进阶(图文详解,持续更新中)
文章目录
前言
一、数据
(一)数据类型
1.基本数据类型/内置数据类型
2.自定数据类型/复合数据类型
(1)数组
(2)结构体
(3)指针
(二)C++常用运算符
赋值运算符
关系运算符
逻辑运算符
杂项运算符
(三)数据的本地化存储
1.准备工作:
2.写流即向本地文件中写入数据该如何实现?
(1)创建写流的对象或创建写流的变量
(2)打开文件执行,准备执行写数据(称为开流)
(3)对本地写数据
(4)关闭流
3.读流(即从本地文件中读取数据)
(1)创建读流对象
(2)打开文件准备读取数据(称为开流)
(3)开始从本地读取数据
(4)关闭流
(5)存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)
二、函数
(一)函数的声明和定义
1.函数声明的作用
2.函数的定义
(二)函数传值
1.传出数据(即返回值)
2.传入数据(即传参)
(1)什么是传参?
(2)作用
(3)类型
3.关于形参在函数声明和函数定义中注意点
4.默参
5.函数重载
6.传参方式
三、内联函数
(一)其它名称
(二)怎么写一个内联函数
(三)内联函数有什么用
(四)内联函数的注意事项
(五)内联的优缺点
四、宏
(一)作用
(二)语法
(三)分类
1.简单宏
2.带参数宏
(四)卸载宏
面向对象
前言
C++ 是一门高级语言,是一种编译型的语言,需要先把源代码先编译成机器语言的可执行程序,然后再执行可执行程序。这里就对C++知识进行探究
一、数据
(一)数据类型
1.基本数据类型/内置数据类型
整型:有符号与无符号
int
unsignedf int
long
unsigned long int
short int
ushort
byte
sbyte
long int
unsigned long int
浮点型/实型:
float
double
long double
字符型:
char
布尔型:
bool
2.自定数据类型/复合数据类型
(1)数组
存放一组同质类型的元素(同种类型)
(2)结构体
(3)指针
指向一个内存空间的地址
指针
数组指针
指针数组
函数指针
(二)C++常用运算符
赋值运算符
基本赋值运算符:=
复合赋值运算符:+=(加赋值)、-=(减赋值)、*=(乘赋值)、/=(除赋值)、%=(求余赋值)、 <<=(左移赋值)、>>=(右移赋值)、&=(按位与赋值)、|=(按位或赋值)、*A=(按位异或赋值)
关系运算符
== != < > <= >=
逻辑运算符
&& || !
杂项运算符
sizeof和三目运算符
(三)数据的本地化存储
1.准备工作:
实现本地化存储需要
头文件为:iostream,ofstream
引入头文件
#include<iostream>
#include<ofstream>
命名空间为:std
引入命名空间:
using namespace std;
2.写流即向本地文件中写入数据该如何实现?
使用ofstream的方法,操作步骤为:
(1)创建写流的对象或创建写流的变量
ofstream ofs;
(2)打开文件执行,准备执行写数据(称为开流)
ofs.open("abc.txt", ios::out);
(3)对本地写数据
string name;
getline(cin, name,'q');
ofs << name << endl;
(4)关闭流
ofs.close();
3.读流(即从本地文件中读取数据)
(1)创建读流对象
ifstream ifs;
(2)打开文件准备读取数据(称为开流)
ifs.open("abc.txt", ios::in);
(3)开始从本地读取数据
方法1:
char ValueArrays[1024]{};while (ifs >> ValueArrays)//非零即为真
{
cout << ValueArrays << endl;//这是字符串的打印
}方法2:
string str = " ";
while (ifs >> str)
{
cout << str << endl;
}
(4)关闭流
ifs.close();
(5)存储案例展示:(存储数据到UserInfo的txt文本中,读取数据,新增数据,查找相关姓名、年龄、地址)
#include <iostream>
#include<fstream>
#include<string>
#include"User.h"
/*
预处理
#include中的" "和<>的使用
<>:代表的导入C++库文件
“ ”:先检索是否有没有自己写的头文件,如果检索不到自己写的头文件,会自动查找C++库,找不到就报错
*/using namespace std;
void Save()
{using namespace std;ofstream ofs;ofs.open("abc.txt", ios::out);string name;getline(cin, name,'q');ofs << name << endl;ofs.close();}
int name_index = 0;
void Add(string nameArrays[])//name是一个形参,需要一个string 类型数组的地址
{string name = " ";cin >> name;nameArrays[name_index] = name;name_index++;ofstream ofs;ofs.open("abc.txt", ios::out);for (int i = 0; i < name_index; i++){ofs << nameArrays[i] << endl;}ofs.close();
}void GetValue()
{using namespace std;//1. 创建对象ifstream ifs;//2. 开流ifs.open("abc.txt", ios::in);//3.读取数据,方法1//3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据char ValueArrays[1024]{};//3.2开始取出数据,并将本地数据在数据中while (ifs >> ValueArrays)//非零即为真{cout << ValueArrays << endl;//这是字符串的打印}ifs.close();cout << "---------" << endl;//3.读取数据,方法2//3.1数据本地读取出来了,需要找到一个容器去存放读取出来的数据//读取不走回头路ifs.open("abc.txt", ios::in);string str = " ";while (ifs >> str){cout << str << endl;}ifs.close();cout << "--------" << endl;//3.读取数据,方法3 借助一个ifstream里的一个函数getlineifs.open("abc.txt", ios::in);char buf[1024]{};while (ifs.getline(buf, sizeof(buf)))//getline是ifstream下的一个函数,用于获取到一行数据,函数的第一个参数是用于接收一行数据的字符数组,//第二个参数是用于接收数据的容器的大小{cout << buf << endl;}ifs.close();cout << "--------" << endl;//3.读取数据,方法4 借助一个string里的一个函数getlineifs.open("abc.txt", ios::in);string str_buf = {};while (getline(ifs, str_buf)){cout << str_buf << endl;}ifs.close();cout << "--------" << endl;//3.读取数据,方法5 借助一个ifstream里的一个函数eofifs.open("abc.txt", ios::in);char eof_buf[1024]{};while (!ifs.eof()){ifs >> eof_buf;cout << eof_buf << endl;}ifs.close();
}void SetValue()
{string name = " ";string age = " ";string address = " ";cout << "请输入姓名:" << endl;cin >> name;cout << "请输入年龄:" << endl;cin >> age;cout << "请输入地址:" << endl;cin >> address;ofstream ofs;ofs.open("Value.txt", ios::out);ofs << name << " ";ofs << age << " ";ofs << address << endl;ofs.close();
}void SelValue()
{string r_name = " ";string r_age = " ";string r_address = " ";ifstream ifs;ifs.open("Value.txt", ios::in);while (ifs >> r_name && ifs >> r_age && ifs >> r_address){cout << "姓名:" << r_name << ",年龄:" << r_age << ",地址:" << r_address << endl;}ifs.close();
}//增加用户
User uArray[6] = {};
int uSize = 0;
void AddUser()
{string name;int age;string address;cout << "输入姓名:" << endl;cin >> name;cout << "输入年龄:" << endl;cin >> age;cout << "输入地址:" << endl;cin >> address;User uInstance;uInstance.name = name;uInstance.age = age;uInstance.address = address;uArray[uSize] = uInstance;uSize++;ofstream ofs;ofs.open("UserInfo.txt", ios::out);for (int i = 0; i < uSize; i++){ofs << uArray[i].name << " ";ofs << uArray[i].age << " ";ofs << uArray[i].address << endl;}ofs.close();
}int Find(string name)
{for (int i = 0; i < uSize; i++){if (uArray[i].name == name){return i;}}return -1;
}//查询所有人的所有信息
void SelAllUser()
{ifstream ifs;ifs.open("UserInfo.txt", ios::in);//is_open判断上一行代码中打开的文件是否存在//存在返回真,不存在返回假/*if (ifs.is_open()){cout << "文件存在" << endl;}elsecout << "文件不存在" << endl;*/if (!ifs.is_open()){cout << "文件不存在" << endl;return;//文件不存在,下方逻辑不用执行}char buf[1024];ifs >> buf;if (ifs.eof()){cout << "文件存在,但没数据" << endl;return;//下方逻辑无需进行}ifs.close();ifs.open("UserInfo.txt", ios::in);int i = 1;string name;int age;string address;while (ifs >> name && ifs >> age && ifs >> address){cout << "第" << i << "人的姓名是" << name << ",年龄是" << age << ",地址是" << address << endl;}}
//查询某个人的所有信息
void SelUser()
{cout << "输入名字" << endl;string sel_name = " ";cin >> sel_name;int index = Find(sel_name);//Find()会返回一个int类型的值if (index != -1) {}//ifstream ifs;ifs.open("UserInfo.txt", ios::in);string name = " ";int age = 0;string address = " ";while (ifs >> name && ifs >> age && ifs >> address){if (name == sel_name){cout << "用户名为:" << name << ",年龄是:" << age << ",地址是:" << address << endl;}}
}
//初始化
int Init()
{ifstream ifs;ifs.open("UserInfo.txt", ios::in);if (!ifs.is_open()){cout << "文件不存在" << endl;return -1;//文件不存在,下方逻辑不用执行}char buf[1024];ifs >> buf;if (ifs.eof()){cout << "文件存在,但没数据" << endl;return -1;//下方逻辑无需进行}ifs.close();ifs.open("UserInfo.txt", ios::in);int i = 0;string name;int age;string address;while (ifs >> name && ifs >> age && ifs >> address){uArray[i].name = name;uArray[i].age = age;uArray[i].address = address;i++;}return i;
}
int main()
{ //string str = {};//getline(cin, str, 'q');//控制台输入数据,赋值到str中,按q键再按回车键结束//getline(cin, str, '\t');//控制台输入数据,赋值到str中,按Tab键然后再按回车结束//cout << str << endl;//Save();//GetValue();//SetValue();// SelValue();int addIndex = Init();while (true) {cout << "添加:1,查询:2,退出:0" << endl;int selecter;cin >> selecter;switch (selecter){case 0:exit;break;case 1:AddUser();break;case 2:SelAllUser();break;}}system("pause");
}
二、函数
(一)函数的声明和定义
1.函数声明的作用
代表的是函数的出生位置(占位置的),如果在文件最上方的位置声明了函数,不用担心函数和函数之间互相调用编译不通过的问题
2.函数的定义
为函数声明写函数体(写逻辑)
注 :可能出现的bug,函数只有声明,没有定义,这个函数却被调用了,被编译时期的异常error
(二)函数传值
1.传出数据(即返回值)
(1)作用:在函数内传数据出函数
(2)样式:
返回类型 函数名称(参数)
{
return 对应返回类型的值;
//此处的return有双重作用:
1.跳转语句(跳出函数)
2.返回值
}
(3)可以返回的值:
1.对应返回类型的值
2.对应返回类型的变量
3.带同种返回类型返回值的函数调用——先执行函数调用,再返回值
2.传入数据(即传参)
(1)什么是传参?
传参就是实参传入形参
(2)作用
在函数外部传入数据到函数内部
(3)类型
形参:在函数声明和定义的时候写的是行参
实参:在函数调用的时候 传递的值是实参
实参的种类:
对应形参类型的值
对应形参类型的变量
带同种返回类型返回值的函数调用,即先执行函数调用,再传参数(实参传参数)
3.关于形参在函数声明和函数定义中注意点
-
声明的形参参数名称和定义的形参参数名称
-
可以不一样声明的时候可以省略参数名称
-
如果存在函数的默参,默认是必须写在函数声明位置的,不可以在声明和定义中都写一遍默参
4.默参
作用:函数可以在声明或者定义的时候给出默认的逻辑执行
-
关于默参的放置位置说明
-
如果只有一个默参
-
放在参数结尾处(最右侧)
-
-
如果有多个默参
-
从右到左依次给出默参,中间不可以隔开使用
-
错误演示:void Function(int i=10,int a,bool b=false)
-
正确演示::void Function(int i=10,int a=10,bool b=false)
-
-
-
5.函数重载
-
函数名相同,但是函数参数(参数类型)不同,通过传入不同的实参,调用不同的函数,执行不同的功能
-
注意:
-
函数返回值不参与函数重载的过程
-
如果被重载的函数中出现了默参
-
建议不要写成重载函数
-
如果不接受建议,就需要保证默参的几个参数类型与其他被重载的函数的参数不一致
-
-
6.传参方式
(1)值传递:值传递只能影响本函数,值的修改不会影响其他的功能,也不会影响到实参
(2)地址传递
(3)引用传递
三、内联函数
(一)其它名称
1.内联函数
2.在线函数
3.编译时期展开函数
(二)怎么写一个内联函数
inline声明和定义都需要添加在类中,当一个函数的声明和定义放在一起的时候,默认这个函数是内联函数
(三)内联函数有什么用
简单的逻辑写在内联函数中,可以有效提高程序的执行速度
(四)内联函数的注意事项
switch for while do while这种较为复杂的逻辑不要放在内联函数中
代码尽量不要超过10行
(五)内联的优缺点
用空间换时间
实现的是在编译时期,逻辑的复制粘贴,而不是函数跳转
四、宏
(一)作用
实现文本替换,可以一定程度上减少记忆负担
(二)语法
简单宏:
#define <宏名> <文本内容>
例:#define MINNUMBER 0.01
带参:
#define 宏名 (参数列表) 文本内容
例:#define function(x) x*x
(三)分类
1.简单宏
添加宏:#define 宏名 文本内容
2.带参数宏
添加宏:#define 宏名(参数列表) 文本内容
在使用宏的时候将实参(数或者变量) 传给形参
(四)卸载宏
#undef 被卸载宏名
五、别名
数据类别名
typedef :为数据类型取别名(将复杂的数据类型修改为简单易读的名称)
六、作用域
(一)全局域
1.函数:
全局函数
2.变量:
全局变量:可以不初始化,系统会帮助初始化,但在实际项目开发中,建议程序员手动初始化
3.如果存在命名冲突怎么解决?
添加命名空间namespace全局变量
(二)成员域
1.函数:
成员函数:如果成员函数的声明和定义放在了一起,这个成员函数将被处理为内联函数
2.变量:
成员变量(成员属性):可以不初始化,系统会帮助初始化,但在实际项目开发中,建议程序员手动初始化
(三)局部域
变量:局部变量,必须初始化
(四)语句域
if...else while for do...while 循环中创建的变量
{ }
七、随机数
1.导入头文件
2.添加随机种子
3.使用随机数
参考源码:
面向对象
待更新.....
相关文章:

C++入门到进阶(图文详解,持续更新中)
C入门到进阶(图文详解,持续更新中) 详解C入门知识到进阶,配合图观看易于理解记录 文章目录 目录 C入门到进阶(图文详解,持续更新中) 文章目录 前言 一、数据 (一)数据类…...
【React Hooks原理 - useRef】
概述 在Function Component项目中当我们需要操作dom的时候,第一时间想到的就是使用useRef这个Hook来绑定dom。但是这个仅仅是使用这个Hook而已,为了更好的学习React Hooks内部实现原理,知其所以然。所以本文根据源码从useRef的基础使用场景一…...

MVC之 IHttpModule管道模型《二》
》》》注意:在http请求的处理过程中,只能调用一个HttpHandler,但可以调用多个HttpModule。 HTTP Modules ASP.NET请求处理过程是基于管道模型的,这个管道模型是由多个HttpModule和HttpHandler组成,当请求到达HttpMod…...

2025上海纺织助剂展会+上海织物整理剂展
2025上海纺织助剂展会上海织物整理剂展 2025第十二届中国(上海)纺织助剂及织物整理剂展览会 时间: 2025年4月23-25日 地点:上海跨国采购会展中心(光复西路2739号) 展会简介: 2025第12届中国(上海&#…...

中科亿海微亮相慕尼黑上海电子展
7月8-10日,备受瞩目的全球电子行业盛会“慕尼黑上海电子展”以空前规模启幕,汇聚了超过1600家参展企业,涵盖了从终端产品制造商到元器件供应商、组装/系统供应商、EMS、ODM/OEM、材料供应商及生产设备供应商的完整产业链。中科亿海微电子科技…...
Spring boot 2.0 升级到 3.3.1 的相关问题 (一)
文章目录 Spring boot 2.0 升级到 3.3.1 的相关问题 (一)拦截器Interceptor的变动问题介绍解决方案 WebMvcConfigurerAdapter 自定义Mvc配置问题介绍解决方案 Spring boot 2.0 升级到 3.3.1 的相关问题 (一) 拦截器Interceptor的…...
数据分析——Python网络爬虫(四){爬虫库的使用}
爬虫库 爬虫的步骤urllib库发送请求两种方法案例 爬虫的步骤 #mermaid-svg-h5azjtPInpsU2ZpP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-h5azjtPInpsU2ZpP .error-icon{fill:#552222;}#mermaid-svg-h5azjtPInps…...

C++客户端Qt开发——信号和槽
三、信号和槽 1.信号和槽概述 在Qt中,用户和控件的每次交互过程称为一个事件。比如"用户点击按钮”是一个事件,"用户关闭窗口”也是一个事件。每个事件都会发出一个信号,例如用户点击按钮会发出"按钮被点击"的信号&…...

基于双向长短期记忆 BiLSTM 实现股票单变量时间序列预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...

微信小程序毕业设计-汽车维修项目管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

学习大数据DAY16 PLSQL基础语法5
目录 异常 自定义异常的格式 raise_application_error 处理异常 预定义异常 SQLcode和SQLerrm 非预定义异常 作业 触发器 触发器基本概念 DML触发器 DML触发器使用 instead of 触发器 管理触发器 作业2 函数、过程和包 函数 过程 参数 1. in 参数 2.out 参…...

LabVIEW心电信号自动测试系统
开发了一种基于LabVIEW的心电信号自动测试系统,通过LabVIEW开发的上位机软件,实现对心电信号的实时采集、分析和自动化测试。系统包括心电信号采集模块、信号处理模块和自动化测试模块,能够高效、准确地完成心电信号的测量与分析。 硬件系统…...

最值得推荐的10款Windows软件!
AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频播放量破百万https://aitools.jurilu.com/1.音乐播放器——Dopamine Dopamine是一款音乐播放器,设计简洁美观。它支持多种音频格式,包括wav、mp3、ogg…...

游戏视频是后期配音好还是边录边配 游戏视频怎么剪辑制作才能火 视频剪辑免费软件
游戏视频后期配音是先配还是先剪?游戏视频后期配音没有统一的准则,可以先配,也可以后配,主要是根据内容而定。游戏视频剪辑在游戏玩家中十分流行,那么,游戏视频怎么剪辑制作?下面让我们以具体的…...
配置 Node.js 内存限制
配置 Node.js 内存限制 Node.js 应用程序通常需要配置堆内存的大小以优化性能和避免内存溢出问题。你可以通过命令行参数、环境变量或系统属性来设置 Node.js 的内存限制。下面将分别介绍在 Windows、Linux 和 macOS 系统下的配置方法。 Windows 系统 1. 命令行参数方式 在…...
ORA-12518: TNS: 监听程序无法分发客户机连接
ORA-12518: TNS: 监听程序无法分发客户机连接 OracleService 服务停止了,启动就好了...

2.5 计算机网络
声明:文章参考的《系统架构设计师教程(第二版)》,如有侵权,本人将立即修改和删除。 利用通信线路将地理上分散的、具有独立功能的计算机系统和通信设备按不同的形式连接起来,并依靠网络软件以及通信协议实现…...
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器
同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清HDMI编码器,双路4K超高清编码器 同三维T80004ESL编码器视频使用操作说明书:高清HDMI编码器,高清SDI编码器,4K超清…...

「ETL趋势」分区支持PostgreSQL、Greenplum、Gauss200, 定时任务支持Kettle
FineDataLink作为一款市场上的顶尖ETL工具,集实时数据同步、ELT/ETL数据处理、数据服务和系统管理于一体的数据集成工具,进行了新的维护迭代。本文把FDL4.1.9最新功能作了介绍,方便大家对比:(产品更新详情:…...

vue 前端项目调用后端接口记录
axios中不同的类型的请求附带数据使用的关键字 请求类型关键字示例GETparamsaxios({ method: get, url: example.com, params: { key: value } })POSTdataaxios({ method: post, url: example.com, data: { key: value } })PUTdataaxios({ method: put, url: example.com, dat…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...