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

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

适应性Java用于现代 API:REST、GraphQL 和事件驱动

在快速发展的软件开发领域&#xff0c;REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名&#xff0c;不断适应这些现代范式的需求。随着不断发展的生态系统&#xff0c;Java 在现代 API 方…...