Selenium常用API详解,从入门到进阶(全套)
目录
1、打开页面
2、查找页面元素
3、输入文本
4、点击操作
5、提交操作
6、清除文本
7、获取文本、属性
8、获取页面的标题和URL
9、窗口
9.1、设置窗口大小
9.2、窗口切换
9.2.1、为什么需要窗口切换?
9.2.2、获取句柄的方式
9.2.3、切换句柄
10、屏幕截图
10.1、为什么需要屏幕截图
10.2、屏幕截图应用
11、等待
11.1、强制等待
11.2、隐式等待
11.3、显示等待
12、浏览器导航
12.1、前进、后退、刷新
13.弹窗
13.1、弹窗类型
13.2、处理弹窗的步骤
13.3、示例
14、选择框
14.1、处理步骤
14.2、示例
15、执行脚本
16、文件上传
16.1、使用方式
16.2、示例
17、浏览器参数设置
结语
1、打开页面
在Selenium中,通过在ChromeDriver类中的get方法里输入网址,即可打开一个页面,例如你要打开百度的网址,如下代码:
ChromeDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com/");
Ps:本文讲的所有API都是基于谷歌浏览器驱动,也就是ChromeDriver类下的API~
2、查找页面元素
在Selenium中,在打开页面的情况下,通过indElement方法,输入By类(通过什么方式来定位元素)参数,即可定位页面元素。
例如定位百度页面的“百度一下”按钮,如下代码:
driver.findElement(By.cssSelector("#su"));//#su就是"百度一下"的CSS选择器
上述栗子中使用的是CSS选择器定位,你也可以使用xpath来定位~
详细的,如下:
By类中最常用的两个定位方法:
1. cssSelector(),它可以通过css选择器来定位元素;(推荐使用)
2. className(),它可以通过xpath来定位元素;
xpath如何使用呢?
最常用的是用层级的方式来表示: /子级 //跳级;(@为属性)
例如:谷歌浏览器中的Google标志
这样你就可以拿到这个标签的xpath://*[@id="logo"] 这便是跳级(前面的路径都不显示,直接表示属性id=“logo”这个标签)
或者是xpath://*[@id="csdn-copyright-footer"]/ul[1]/li[2]/a 这便是一个跳级加子集的方式;
值得注意的是:我们不要一个一个去推这个子集表示的方式,可以直接按照上图的方式进行拷贝xpath路径,配合着className()方法使用即可,但是有时候赋值selector或者xpath元素不一定是唯一的,需要我们进行手动修改到唯一(检查的时候通过 ctrl + f 即可检查是否唯一),这就是为什么我们要对xpath的语法要有一定了解的原因;
3、输入文本
在Selenium中,使用sendKeys方法即可对你选中的元素进行输入文本,但是仅适用于文本文字和内容可以编辑的元素,例如在百度页面的搜索框内输入“你好”,如下代码:
//先使用findElement定位元素(返回一个WebElement类型的元素),再对定位的元素进行输入文本
driver.findElement(By.cssSelector("#kw")).sendKeys("你好");
Ps:即使反向操作,也就是对不可编辑的元素进行操作,也不会报错,但是不会产生任何实际效果。
4、点击操作
在Selenium中,对你定位到的元素使用click方法,即可进行鼠标点击操作,例如点击百度界面的“百度一下”按钮,代码如下:
//先使用findElement定位元素(返回一个WebElement类型的元素),再进行click
driver.findElement(By.cssSelector("#su")).click();
5、提交操作
提交操作是干什么的?实际上就和你按下Enter键的效果是一样的,通过submit方法即可实现,例如在百度页面通过submit方法实现自动按下回车键,如下代码:
//先使用findElement定位元素(返回一个WebElement类型的元素),再进行submit
driver.findElement(By.cssSelector("#su")).submit();
Ps:selenium官方不推荐使用submit,更推荐click,因为可以使用submit的地方click都能代替,并且click使用场景更广(submit仅适用于表单元素)。
6、清除文本
在Selenium中,可以使用clear将你定位的元素的文本内容进行清除,例如清除百度输入框中的文本,如下代码:
driver.findElement(By.cssSelector("#kw")).clear();
Ps:用来频繁的测试是否可以重复输入(适用sendKeys输入后,在用clear清除、再输入然后清除......)。
7、获取文本、属性
在Selenium中,通过getText可以获取你定位的元素的文本,例如获取百度页面热搜中的文本,如下代码:
//获取到的文本返回值是一个String类型
String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a > span.title-content-title")).getText();
System.out.println(text);
但如果你要获取“百度一下”这个按钮的文本就无法获取(但程序不会报错,只是返回一个空字符串),因为这个元素它不含文本,只有一些属性(id、class、type、value......),如下F12检查可以看到:
所以我们只能获取它的属性,那么属性该如何获取呢?通过getAttribute方法即可获取到,方式和获取文本一样,先定位元素,再获取;例如你要获取class属性,那么就是getAttribute("class);
8、获取页面的标题和URL
在Selenium中,这个没什么特别要注意的点,基础操作,直接上代码:
System.out.println(driver.getTitle());
System.out.println(driver.getCurrentUrl());
9、窗口
9.1、设置窗口大小
在Selenium中,可以设置窗口的大小:最大化、最小化、全屏窗口、手动设置窗口大小;如下代码:
//窗口最大化driver.manage().window().maximize();//窗口最小化driver.manage().window().minimize();//全屏driver.manage().window().fullscreen();//手动设置大小(按顺序分别是宽和高)driver.manage().window().setSize(new Dimension(1024, 500));
9.2、窗口切换
9.2.1、为什么需要窗口切换?
想象这样一个场景,我们使用Selenium打开一个网页,在从这个网页通过click点击超链接打开另一个网页,那么我们继续使用Selenium操作网页时,是对刚刚这两个网页中的哪一个网页进行操作?实际上还是第一个网页,如果你一意孤行还认为是对第二个网页进行操作,就有可能引发如下异常:(找不到该元素)
实际上,当浏览器每次打开一个标签页的时候,都会自动给每个标签页进行标识,也叫做“句柄”。
9.2.2、获取句柄的方式
在Selenium中,我们有如下两种方式获得句柄:
//获取所有标签页的句柄Set<String> handles = driver.getWindowHandles();//获取当前页面的句柄String curHandle = driver.getWindowHandle();
并且哪个页面对应哪个句柄,我们是不可知的,例如我打开了两个页面,获取句柄并打印,如下:
9.2.3、切换句柄
//获取当前页面的句柄String curHandle = driver.getWindowHandle();//切换到curHandle句柄driver.switchTo().window(curHandle);
Ps:自动化基本没有需要切换窗口的场景,因为要进行测试,就直接拿到这个网页的地址即可,没必要这样切换!
10、屏幕截图
10.1、为什么需要屏幕截图
想象一下,程序执行的速度 和 页面渲染的速度 谁快?必然是程序执行快,那么当代码执行到查找结果页的元素时,页面还没有加载完全,程序就会报错,如下代码:
public void test2() {ChromeDriver driver = new ChromeDriver();//打开百度页面driver.get("https://www.baidu.com");//在输入框中输入"你好"driver.findElement(By.cssSelector("#kw")).sendKeys("你好");//点击“百度一下”按钮driver.findElement(By.cssSelector("#su")).click();//点击一个搜索结果driver.findElement(By.cssSelector("#\\31 > div > div > h3 > a")).click();driver.close();}
报错,如下图(找不到该元素)
解决办法:在点击“百度一下”这个按钮以后,休眠几秒即可(等待页面加载出来)。
但是自动化程序执行的速度非常快,我们怎么能知道这个地方出了什么问题呢?接着往下看~
10.2、屏幕截图应用
首先需要在pom.xml中导入依赖,如下:
<!-- 保存屏幕截图文件需要用到的包 --><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
接着如下代码:
public void test2() throws IOException {ChromeDriver driver = new ChromeDriver();//打开百度页面driver.get("https://www.baidu.com");//在输入框中输入"你好"driver.findElement(By.cssSelector("#kw")).sendKeys("你好");//点击“百度一下”按钮driver.findElement(By.cssSelector("#su")).click();//屏幕截图(保存现场)File srcfile = driver.getScreenshotAs(OutputType.FILE);//FILE表示以文件的形式保存//把截图保存到指定路径下String filename = "my.png";//没输入路径,就是当前项目下FileUtils.copyFile(srcfile, new File(filename));//点击一个搜索结果driver.findElement(By.cssSelector("#\\31 > div > div > h3 > a")).click();driver.close();}
接着就可以观察到截图如下:
这样我们就可以发现原因,是由于页面没有加载出来的原因~
Ps:保存截图的时候,文件名时固定的格式(已经存在重名文件),程序多次生成的截图都会被同名覆盖,为了避免这个情况,我们可以将文件名设置为动态的,也就是加入时间戳。
11、等待
我们知道,程序执行的速度要比浏览器渲染的速度要快很多,那么就有可能出现这样一种情况,例如当使用自动化打开一个页面后需要选中这个页面中的一个元素,但是由于由于执行的太快,在页面还没有渲染出来的情况下(被选中的元素还没有出现),就选中这个元素,程序就会报错,为了解决这种情况,有四种等待方式来解决,下面我来讲解一下:
11.1、强制等待
强制等待就是通过线程阻塞来进行,也就是我们熟知的 Thread.sleep() ,这种方式在自动化中会用到,但是用的不是很多,为什么呢?每一个自动化方法就是一个测试用例,假设一个用例你设置2s的等待时间,那么100个测试用例就是100s,效率十分低下,而且很大概率,在我们设置的等待时间之内,页面就已经渲染出来了。
11.2、隐式等待
隐式等待作用于driver的整个生命周期,会在你设置的一个时间内,反复判断元素是否存在,直到元素被找到才停止等待(类似于自旋锁的自旋操作),若超出时间,就执行下一步;
例如,通过自动化 打开百度网址->输入"你好"->点击百度一下按钮->点击"你好——百度百科",整个过程隐式等待,如下代码:
private ChromeDriver driver = new ChromeDriver();public void test1() {//隐式等待——作用driver的整个生命周期,直到quit(设置时间为3秒)driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));//打开百度网页driver.get("https://www.baidu.com");//在搜索框输入"你好" driver.findElement(By.cssSelector("#kw")).sendKeys("你好");//点击百度一下driver.findElement(By.cssSelector("#su")).click();//点击"你好-百度百科";driver.findElement(By.cssSelector("#\\31 > div > div > h3 > a")).click();//退出driver.quit();}
Ps:Duration这个类中的等待单位有很多种,可以是毫秒、秒、小时...如下:
11.3、显示等待
当等待的条件满足后(一般用来判断需要等待的元素是否加载出来),就继续下一步操作。等不到就一直等,如果在规定的时间之内都没找到,那么就跳出Exception,和隐式等待不同的是,显示等待一般作用某一条代码。
例如,通过自动化 打开百度网址 -> 输入"你好" -> 点击百度一下按钮 -> 显示等待"你好——百度百科"元素出现 -> 点击"你好——百度百科",如下代码:
private ChromeDriver driver = new ChromeDriver();public void test2() {//打开百度网页driver.get("https://www.baidu.com");//在搜索框输入"你好"driver.findElement(By.cssSelector("#kw")).sendKeys("你好");//点击百度一下driver.findElement(By.cssSelector("#su")).click();//显示等待 “你好——百度百科”元素出现new WebDriverWait(driver, Duration.ofSeconds(3)).until(driver->driver.findElement(By.cssSelector("#\\31 > div > div > h3 > a")));//退出driver.quit();}
Ps:until就表示等待的元素,也就是一直等待到xxx元素出现
12、浏览器导航
12.1、前进、后退、刷新
就是通过自动化控制如下三个按钮:
例如,打开百度 -> 输入"你好" -> 点击百度一下按钮 -> 后退到百度主页 -> 前进到"你好" -> 刷新当前网页 ,如下代码:
private ChromeDriver driver = new ChromeDriver();public void test3() {//打开百度driver.get("https://www.baidu.com/");//输入框输入"你好"driver.findElement(By.cssSelector("#kw")).sendKeys("你好");//点击“百度一下”按钮driver.findElement(By.cssSelector("#su")).click();//回退driver.navigate().back();//前进driver.navigate().forward();//刷新driver.navigate().refresh();driver.quit();}
13.弹窗
13.1、弹窗类型
共有以下三种弹窗
13.2、处理弹窗的步骤
a)将driver对象作用到弹窗上(切换到弹窗)
driver.switchTo.alert()
b)得到弹窗对象后,选择 确认/取消/输入文本(提示弹窗)
确认:accept();
取消:dismiss();
输入(提示弹窗):sendKeys();
注意:
1.提示弹窗输入文本,在页面上是看不到输入文本的执行效果。
2.虽然警告弹窗只有确认按钮,但是accept和dismiss都能处理。
3.虽然警告弹窗和确认弹窗都没有输入文本的地方,凡是如果要执行alert.sendKeys代码,也不会报错。
13.3、示例
a)出现提示弹窗,进行输入文本,并点击确认,如下代码:
//将driver作用对象切换到弹窗上Alert alert = driver.switchTo().alert();//输入文本alert.sendKeys("hello");//点击确认alert.accept();
b)出现确认弹窗,点击取消,如下代码:
//将driver作用对象切换到弹窗上Alert alert = driver.switchTo().alert();//点击取消alert.dismiss();
14、选择框
14.1、处理步骤
在Selenium执行自动化的过程中,我们知道,没法通过F12检查对选择框中的选项进行选择,实际上,可以通过以下三种方式进行选择:
- 根据文本来选择;
- 根据属性值来选择;
- 根据序号来选择(序号是从0开始的);
文本、属性值、序号又是什么呢?如下图:
注意:序号是从上往下,从0开始数。
14.2、示例
对一个选择框分别进行文本、属性、序号的选择,如下代码:
//得到选择框对象WebElement ele = driver.findElement(By.cssSelector("#ShippingMethod"));//创建选择框对象Select select = new Select(ele);//根据文本来进行选择select.selectByVisibleText("UPS Next Day Air ==> $12.51");//根据属性来进行选择select.selectByValue("12.51");//根据序号来进行选择select.selectByIndex(0);
15、执行脚本
实际上就是执行js代码
使用方法如下代码:
driver.executeScript();//参数是js代码
16、文件上传
16.1、使用方式
使用方式很简单,如下代码:
sendKeys("文件的绝对路径");
16.2、示例
如下场景:
例如我要上传D盘下的test.txt文件,代码如下:
//选择“上传文件按钮”WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));//上传文件ele.sendKeys("D:\\test.txt");
执行效果如下:
Ps:注意上图中的test.txt文件,并不是直接上传到服务器了,而是把要上传的文件的绝对路径放在了这里;
17、浏览器参数设置
实际的工作中,测试人员将自动化部署在机器上自动执行,测试人员不会每次都一直盯着自动化执行的过程,而是直接查看自动化执行的结果。
ChromeDriver类提供了一个构造参数,可以实现以上场景,也叫做“无头模式”。
如下代码:
ChromeOptions options = new ChromeOptions();options.addArguments("-headless");ChromeDriver driver = new ChromeDriver(options);
Ps:浏览器的参数设置需要在创建浏览器对象之前。
结语
如果文章对你有帮助,
相关文章:

Selenium常用API详解,从入门到进阶(全套)
目录 1、打开页面 2、查找页面元素 3、输入文本 4、点击操作 5、提交操作 6、清除文本 7、获取文本、属性 8、获取页面的标题和URL 9、窗口 9.1、设置窗口大小 9.2、窗口切换 9.2.1、为什么需要窗口切换? 9.2.2、获取句柄的方式 9.2.3、切换句柄 10、…...

自从学会了Python,我实现了壁纸自由(6)
小朋友们好,大朋友们好!我是猫妹!哈哈哈,又到周末啦!这周过得怎么样?马上就要开学了,寒假作业早已写好了吧?开学让人兴奋,上了很久网课都要吐啦!开学也让人有…...
Ruby 发送邮件 - SMTP
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。 Ruby提供了 Net::SMTP 来发送邮件,并提供了两个方法 new 和 start: new 方法有两个参数&am…...

Python爱心代码
前言 Python漂浮爱心,具体源码见:Python动态爱心代码_爱心代码-Python文档类资源-CSDN下载 爱心类 class Heart(): #每个爱心(爱心类) def __init__(self): self.r ra.randint(10,15) #爱心的半径 …...
【二分查找法及其应用】
文章目录一. 前提二. 基本思路三. 代码实现四. 封装在STL中的二分查找算法五. 浮点数二分一. 前提 待查找的序列是有序的;待查找的 a 采取顺序存储结构。 二. 基本思路 设在升序序列 a [ low…high ] 查找的 k , 首先找中间值 mid a [ ( lowhigh )/2 …...

Android 进阶——Framework核心 之Binder Java成员类详解(三)
文章大纲引言一、Binder Java家族核心成员关系图二、Binder Java家族核心成员源码概述1、android.os.IBinder1.1、boolean transact(int code, Parcel data, Parcel reply, int flags) send a call to an IBinder object1.2、String getInterfaceDescriptor()1.3、boolean ping…...

Maven
Maven 1.什么是Maven 官方网站 https://maven.apache.org/ Maven是一款服务于Java平台的自动化构建工具,它可以帮助我们更方便的对项目进行构建、管理项目jar包 ,包括: bulid 项目,切换 jar 版本,添加 jar, 删除 jar 包等 1.…...

1947抓住那头牛(队列 广度优先搜索)
目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径: 题目描述 农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<N<100000)&…...
基于linux5.15.5的IMX 参考手册 ---21
基于linux5.15.5的IMX 参考手册 — 21 10.5.2高清多媒体接口(HDMI)和显示端口(DP)概述 10.5.2.1测试名称 •mxc_cec_test.out 10.5.2.1.1位置 /unit_tests/HDMI/ 10.5.2.1.2功能 验证HDMI CEC功能并向HDMI接收器发送断电命令。 1…...

Android Dalvik虚拟机 堆初始化流程
前言 上篇文章介绍了dalvik虚拟机启动流程,在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中,堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中ÿ…...
0讲(补)——开发前必备基本常识
前言 专栏内容持续补充更新,目前正在进行优惠活动 目录 前言 一、函数的声明和定义 二、预编译 三、串口打印中的printf函数的使用...

JS学习笔记
1.WebAPIs简介导读Web APIs 和JS 基础关联性JS 基础阶段以及 Web APIs 阶段JS基础学习 ECMAScript 基础语法为后面作铺垫,Web APIs 是JS 的应用,大量使用JS基础语法做交互效果①JS 基础阶段我们学习的是ECMAScript 标准规定的基本语法要求同学们掌握JS 基…...
linux005之用户、组管理
linux用户管理简介: 任何使用linux系统的用户,都必须使用一个合法的账号和密码,账号和密码一般都是超级管理员创建,当然普通用户也可以创建用户,前提是必须拥有创建用户权限。 root是linux系统中默认创建的超级用户 创…...

列线图工具_Nomogram
定义 列线图是一种相对传统的分析方法,用于展示自变量和因变量的线性关系,及其特征的重要程度。 现在用SHAP,和机器学习库中的 Feature importance 工具可以实现类似甚至更好效果。不过很多传统的研究领域比较认这种方法。 列线图工具建立在…...

【C++】类和对象(一)
目录一、面向过程和面向对象初步认识二、类的引入三、类的定义四、类的访问限定符及封装4.1、访问限定符4.2、封装五、类的作用域六、类的实例化七、类对象的大小八、this指针8.1、this指针的引出8.2、this指针的特性8.3、C语言和C实现Stack的对比一、面向过程和面向对象初步认…...

Python获取搜索引擎结果
前言 想快速获取各个高校的博士招生网站,于是通过python先获取出有可能包含高校博士招生网站的URL,然后通过人为筛选得到了想要的招生网站(注意,并非直接爬取,是间接获取的)。 整理了一份网站名单&#x…...

2.4.8 PCIe——物理逻辑层——REFCLK
一、概述 pcie的参考时钟由板级输入,提供给IP内PHY层的PLL使用,由PLL产生core_clk和pipe_clk。 二、REFCLK产生方式 Serdes 所用时钟由 PHY 模块内的PLL生成,PLL的参考时钟可以由common clock(外部背板提供)、separ…...
树莓派4B arm64 搭建 docker+drone+gitea
树莓派4B arm64 搭建 dockerdronegitea 记录时间: 2023年02月10日 树莓派烧录 如何用树莓派搭建一台永久运行的个人服务器? https://mp.weixin.qq.com/s?__bizMzI5NjA0ODkwNA&mid2651847658&idx1&sn267a1257b43d4a76f2a081ed157b77f9&chksmf7b11…...

Java的JDBC编程
目录 1. 打开IDEA,新建Project 2. 引入依赖 (1)下载驱动包 (2)将驱动包导入Project 3. 编写代码 (1)创建数据源 (2)让代码和数据库服务器建立联系 (3&…...
CSS:块格式化上下文(BFC)
块格式化上下文是块级盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域。 块格式化上下文(BFC)的创建 满足以下条件将创建块格式化上下文: 根元素()浮动元素(float 值不为 none)绝对定位元素…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...