当前位置: 首页 > news >正文

自动化测试selenium

目录

一、为什么引入自动化测试?

二、为什么选择selenium作为自动化测试工具? 

三、环境部署 

四、什么是驱动?驱动的工作原理? 

五、selenium的基础语法 

元素定位

元素操作

点击元素

模拟键盘输入

清除对象输入的文本内容 

获取文本信息 

等待 

强制等待

隐式等待 

显式等待 

界面操作 

信息打印

窗口 

导航 

弹窗 

鼠标操作 

键盘操作        

选择框 

 上传文件

屏幕截图


一、为什么引入自动化测试?

自动化测试能代替一部分的手工测试,随着软件版本的不断更新,回归测试使用的越来越多,只使用手工测试是不太可能,就需要用到自动化测试。

二、为什么选择selenium作为自动化测试工具? 

  • 开源免费;
  • 支持多个浏览器;
  • 支持多系统;
  • 支持多种语言;
  • selenium包底层有许多实用的API;

三、环境部署 

  1. 下载selenium工具包;
  2. 下载chrome(谷歌)浏览器;
  3. 配置与浏览器版本一致的Chrome谷歌驱动;
  4. Java版本最低要求为8;

四、什么是驱动?驱动的工作原理? 

驱动:对于汽车,驱动可以使汽车跑起来,计算机中驱动可以使程序运行,那么对于自动化测试来说,代码无法直接打来浏览器就需要借助驱动来打开浏览器完成自动化测试。

驱动的工作原理:在自动化测试中,驱动相当于服务器,能够接收利用selenium发送过来的请求,并进行解析请求。

五、selenium的基础语法 

在进行selenium编程之前,需要去中央仓库将selenium相关依赖引入到maven项目中。

元素定位

先定义一个ChromeDriver对象,调用findElement方法,其参数就需要传入元素,那么可以通过如下方式定位元素:

  • id:id选择器
  • name:name属性
  • class name:类名
  • link text:链接文本
  • partial link text:部分链接文本
  • tag name:标签名
  • xpath:XML路径
  • css selector:CSS选择器

这些元素只需在前端页面中双击要测试的元素,然后点击检查,然后点击copy选择相应的定位方式。

注意定位的元素必须是唯一的,使用CSS选择器可能定位的元素不唯一。

例如:定位百度主页的输入框: 

public static void test() throws InterruptedException {//创建谷歌驱动对象打开浏览器ChromeDriver chromeDriver = new ChromeDriver();Thread.sleep(3000);//选择定位百度主页chromeDriver.get("https://www.baidu.com");Thread.sleep(3000);//通过xpath定位元素chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]"));Thread.sleep(3000);//释放驱动对象,关闭浏览器chromeDriver.quit();}

元素操作

点击元素

在定位到元素之后,调用click方法进行点击,也有submit方法,页面中所有按钮都可以进行click,但是能够click的元素不一定能够submit,一般不建议使用submit。

例如:点击百度页面的百度一下按钮,与上述代码基本一致,只需在其后添加click:

//通过xpath定位元素,并进行点击
chromeDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();

模拟键盘输入

在定位到元素之后,调用sendkeys方法进行模拟输入,其参数是字符串。

例如在定位到百度的搜索框页面之后就可以模拟输入之后再点击百度一下按钮。

//通过Xpath定位搜索框,并模拟键盘输入fighting
chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("fighting");
Thread.sleep(300);
//通过xpath定位百度一下按钮,并点击
chromeDriver.findElement(By.xpath("//*[@id=\"su\"]")).click();
Thread.sleep(3000);

清除对象输入的文本内容 

通过clear方法清除输入的文本内容。

//通过Xpath定位搜索框,并模拟键盘输入fighting
chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("fighting");
Thread.sleep(300);
//对搜索框中的元素进行清除
chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]")).clear();

获取文本信息 

使用getText获取文本信息,指的是页面上的带有文本的元素:

但是使用该方法获取不到百度一下按钮中的文字,原因是按钮中的文字是属性,需要用到getAttribute方法来进行获取。 

String str = chromeDriver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).getText();Thread.sleep(3000);System.out.println("except:解码2023年中国经济关键词"+"actual:"+str);String val = chromeDriver.findElement(By.xpath("//*[@id=\"su\"]")).getAttribute("value");Thread.sleep(3000);System.out.println("except:百度一下"+"actual:"+val);

运行结果:

 

等待 

前端渲染的速度相较于代码执行的速度较慢,有时就元素实际存在但出现找不到元素的异常,这就需要进行等待。

强制等待

使用Thread.sleep方法进行强制等待,避免测试太快看不到演示结果。

优点:比较简单,比较适用于调试的时候。

缺点:耗用时间太长,降低了测试的效率。

隐式等待 

在规定时间内轮询等待元素出现,如果元素出现就结束,在指定时间还未找到元素就会出现NoSuchElementException异常。

隐式等待5秒:

chromeDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

优点:找到元素就结束,节约了时间,提高了测试效率。

缺点:隐式等待贯穿于整个driver的整个生命周期,等到所有的元素都出现才结束,还是存在浪费时间的问题。

显式等待 

 针对某一个元素进行等待。

显式等待3秒:

WebDriverWait webDriverWait = new WebDriverWait(chromeDriver,Duration.ofSeconds(3)) ;
webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id=\"kw\"]")));

优点:可以针对某一元素进行等待,大大提高测试的效率。

缺点:代码写法较为复杂。

界面操作 

信息打印

getTitle:打印当前页面标题;

getUrl:打印当前页面的url;

 public static void print(){chromeDriver.get("https://www.baidu.com");//打印页面标题System.out.println(chromeDriver.getTitle());//打印urlSystem.out.println(chromeDriver.getCurrentUrl());chromeDriver.quit();}

窗口 

getWindowHandle:获取当前窗口句柄

getWindowHandles:获取所有窗口的句柄,利用String集合进行接收。

可以利用上述方法可以切换页面:

public static void print(){chromeDriver.get("https://www.baidu.com");//打印页面标题System.out.println(chromeDriver.getTitle());String currentWindow = chromeDriver.getWindowHandle();chromeDriver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[1]/a/span[2]")).click();Set<String> windows = chromeDriver.getWindowHandles();for(String window : windows){if(window != currentWindow){chromeDriver.switchTo().window(window);}}//打印页面标题System.out.println(chromeDriver.getTitle());chromeDriver.quit();}

运行结果:

 

设置窗口大小:

chromeDriver.manage().window().minimize():窗口设置最小化

chromeDriver.manage().window().maximize():窗口设置最大化chromeDriver.manage().window().setSize(new Dimension(width,height)):自定义窗口大小

导航 

 chromeDriver.navigate().back():后退;

 chromeDriver.navigate().forward():前进;

public static void navigate() throws InterruptedException {chromeDriver.get("https://www.baidu.com");chromeDriver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[6]/a/span[2]")).click();Thread.sleep(2000);chromeDriver.navigate().forward();Thread.sleep(2000);chromeDriver.navigate().back();Thread.sleep(2000);chromeDriver.quit();}

弹窗 

警告弹窗+确认弹窗:

切换到弹窗:Alert alert = chromeDriver.switchTo().alert();

确认按钮 :alert.accept();

取消按钮 :alert.dismiss();

提示弹窗:

alert.sendkeys();

鼠标操作 

可以模拟鼠标的点击、移动效果。

context_click() 右击

double_click() 双击

drag_and_drop() 拖动

move_to_element() 移动

public static void mouse() throws InterruptedException {chromeDriver.get("https://www.baidu.com");WebElement webElement = chromeDriver.findElement(By.xpath("//*[@id=\"hotsearch-content-wrapper\"]/li[6]/a/span[2]"));Actions actions = new Actions(chromeDriver);actions.clickAndHold(webElement);Thread.sleep(3000);chromeDriver.quit();}

键盘操作        

模拟键盘的一系列操作。

 public static void keyboard(){chromeDriver.get("https://www.baidu.com");WebElement webElement = chromeDriver.findElement(By.xpath("//*[@id=\"kw\"]"));webElement.sendKeys("计算机");chromeDriver.quit();}

选择框 

在一些注册页面可能就会出现选择框,就可以利用Select利用如下方式来进行选择:

 

public static void select() throws InterruptedException {chromeDriver.get("http://city.zhenai.com/");WebElement webElement = chromeDriver.findElement(By.xpath("/html/body/div[2]"));Select select = new Select(webElement);select.selectByIndex(1);Thread.sleep(3000);chromeDriver.quit();}

 上传文件

页面中点击文件上传就会弹出系统窗口,但是selenium不能操作系统窗口,但是可以先选择上传文件按钮,然后通过sendkey()输入要上传的文件路径即可。

屏幕截图

我们可以在测试时利用代码进行截图,并保存到指定路径。

//屏幕截图
File file =chromeDriver.getScreenshotAs(OutputType.FILE);
File pngFile = new File(".src/test/test.png");
//将文件拷贝到指定路径
FileUtils.copyFile(file,pngFile);

相关文章:

自动化测试selenium

目录 一、为什么引入自动化测试&#xff1f; 二、为什么选择selenium作为自动化测试工具&#xff1f; 三、环境部署 四、什么是驱动&#xff1f;驱动的工作原理&#xff1f; 五、selenium的基础语法 元素定位 元素操作 点击元素 模拟键盘输入 清除对象输入的文本…...

熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验

程序的栈和堆 栈先进后出&#xff0c;且里面的数据自动释放&#xff0c; 堆内的空间则需要手动释放 java python go 只管创建&#xff0c;不用像c,c需要手动释放空间&#xff0c; 因为他们都会开一个进程GC&#xff08;Garbage Collector&#xff09;&#xff0c;由垃圾回收…...

常量和变量——“Python”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰的内容是Python的一些基础语法噢&#xff0c;会讲解一些常量和变量的知识点&#xff0c;那么&#xff0c;现在就让我们进入Python的世界吧 常量和表达式 变量和类型 变量是什么 变量的语法 变量的类型 常量和表达式 …...

《蓝桥杯每日一题》KMP算法·AcWing 141. 周期

1.题目描述一个字符串的前缀是从第一个字符开始的连续若干个字符&#xff0c;例如 abaab 共有 55 个前缀&#xff0c;分别是 a&#xff0c;ab&#xff0c;aba&#xff0c;abaa&#xff0c;abaab。我们希望知道一个 N 位字符串 S 的前缀是否具有循环节。换言之&#xff0c;对于每…...

URL介绍

前言Internet上的每一个网页都具有一个唯一的名称标识&#xff0c;通常称之为URL&#xff08;Uniform Resource Locator, 统一资源定位器&#xff09;。它是www的统一资源定位标志&#xff0c;简单地说URL就是web地址&#xff0c;俗称“网址”。一、URL概念URL是对互联网上得到…...

学习 Python 之 Pygame 开发魂斗罗(一)

学习 Python 之 Pygame 开发魂斗罗&#xff08;一&#xff09;Pygame回忆Pygame1. 使用pygame创建窗口2. 设置窗口背景颜色3. 获取窗口中的事件4. 在窗口中展示图片(1). pygame中的直角坐标系(2). 展示图片(3). 给部分区域设置颜色5. 在窗口中显示文字6. 播放音乐7. 图片翻转与…...

ARM uboot 源码分析8 - uboot的环境变量

一、uboot 的环境变量基础 1、环境变量的作用 (1) 让我们可以不用修改 uboot 的源代码&#xff0c;而是通过修改环境变量&#xff0c;来影响 uboot 运行时的一些数据和特性。譬如说&#xff0c;通过修改 bootdelay 环境变量&#xff0c;就可以更改系统开机自动启动时倒数的秒…...

【蓝牙mesh】Network协议层介绍

【蓝牙mesh】Network协议层介绍 Network层简介 上一章节我们讲解了蓝牙Mesh中Lower层的功能和数据格式。 Lower层的数据往下传输就到了网络层&#xff08;Network Layer&#xff09;。网络层定义了收到Lower层的数据后&#xff0c;如何对其进行判断、封装、加密、认证&#xf…...

基于遗传算法的配电网故障定位(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5;&#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密…...

Leetcode.1247 交换字符使得字符串相同

题目链接 Leetcode.1247 交换字符使得字符串相同 Rating &#xff1a; 1597 题目描述 有两个长度相同的字符串 s1和 s2&#xff0c;且它们其中 只含有 字符 "x"和 "y"&#xff0c;你需要通过「交换字符」的方式使这两个字符串相同。 每次「交换字符」的时…...

python语音识别whisper

一、背景 最近想提取一些视频的字幕&#xff0c;语音文案&#xff0c;研究了一波 二、whisper语音识别 Whisper 是一种通用的语音识别模型。它在不同音频的大型数据集上进行训练&#xff0c;也是一个多任务模型&#xff0c;可以执行多语言语音识别以及语音翻译和语言识别。 …...

Prometheus -- 浅谈Exporter

Prometheus系统 – Exporter原理 为什么我们需要Exporter&#xff1f; 广义上讲所有可以向Prometheus提供监控样本数据的程序都可以被称为一个Exporter。而Exporter的一个实例称为target&#xff0c;如下所示&#xff0c;Prometheus通过轮询的方式定期从这些target中获取样本…...

如何确定RocketMQ中消费者的线程大小

背景 随着物联网行业的发展、智能设备数量越来越多&#xff0c;随着设备活跃量过大&#xff0c;常常存在一些高并发的请求&#xff0c;形成了流量尖峰&#xff0c;过多的请求会压垮服务器&#xff0c;影响其他服务运行。因此&#xff0c;为了保护云端服务&#xff0c;需要对请求…...

OpenAPI SDK组件之Spring Aop源码拓展

Spring Aop 看这个分享的应该都用过Spring Aop&#xff0c;这里就不再过多介绍了它是什么了。 我抽取了Spring Aop的部分源码&#xff0c;通过它实现请求参数可变拦截&#xff0c;同时apisdk离开Spring框架&#xff0c;仍然可以正常运行。 讲拦截也好&#xff0c;通知也罢&a…...

蓝桥杯C/C++VIP试题每日一练之龟兔赛跑预测

&#x1f49b;作者主页&#xff1a;静Yu &#x1f9e1;简介&#xff1a;CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家&#xff0c;前端知识交流社区创建者 &#x1f49b;社区地址&#xff1a;前端知识交流社区 &#x1f9e1;博主的个人博客&#xff1a;静Yu的个人博客…...

为你的Vue2.x老项目安装Vite发动机吧

天下苦webpack久矣&#xff0c;相信作为前端开发者一定经历过在项目迭代时间较长的时候经历漫长等待的这一过程&#xff0c;每一次保存都会浪费掉大量时间&#xff0c;这是webpack这种机制所带来的问题。 于是&#xff0c;尤大为我们带来了新一代前端构建工具&#xff1a;vite…...

ZCMU--5012: 铺设道路(差分思路)

Description 春春是一名道路工程师&#xff0c;负责铺设一条长度为 n 的道路。 铺设道路的主要工作是填平下陷的地表。 整段道路可以看作是 n 块首尾相连的区域&#xff0c;一开始&#xff0c;第 i 块区域下陷的深度为 di。  春春每天可以选择一段连续区间 [L,R]&…...

算法模板总结(自用)

算法模板总结滑动窗口双指针算法数组相关合并两个有序数组左右指针技巧快慢指针技巧字符串相关左右指针反转字符串问题快慢指针替换空格字符问题链表相关快慢双指针删除链表的倒数第N个节点链表相交环形链表链表操作几数之和两数之和四个数组的四数之和三数之和同一数组中四数之…...

【架构师】零基础到精通——架构发展

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小留言…...

C++(20):三路比较运算符

C20增加了三路比较运算符<>&#xff08;戏称航天飞机运算符&#xff09;&#xff0c;用于对类的比较运算符进行统一的设计。有两种使用方式&#xff1a;默认比较对于某些类&#xff0c;如果按照其成员逐一比较即可决定比较运算符的值&#xff0c;那么可以使用默认的三路运…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

二维FDTD算法仿真

二维FDTD算法仿真&#xff0c;并带完全匹配层&#xff0c;输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...