当前位置: 首页 > 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;那么可以使用默认的三路运…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...