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

MySQL workbench 字符集、字符序的概念与联系

在数据的存储上&#xff0c;MySQL提供了不同的字符集支持。而在数据的对比操作上&#xff0c;则提供了不同的字符序支持。 MySQL提供了不同级别的设置&#xff0c;包括server级、database级、table级、column级&#xff0c;可以提供非常精准的设置。 什么是字符集、字符序&am…...

DBA之路---数据库启动与关闭过程

DBA之路—数据库启动与关闭过程 1、启动过程 oracle启动的四个状态 shutdown、就是数据库关闭状态。 nomount模式 #启动instance &#xff0c;读取参数文件、分配sga空间启动后台进程&#xff0c;打开alter日志和其他trace文件startup nomount #该模式下只会创建实例并不加…...

Shell文件包含

和其他语言一样&#xff0c;Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。 一、语法格式 Shell 文件包含的语法格式如下&#xff1a; . filename # 注意点号(.)和文件名中间有一空格 或 source filename 在当前bash环境下读取并执行file…...

计算机网络(六): HTTP,HTTPS,DNS,网页解析全过程

文章目录一、HTTP头部包含的信息通用头部请求头部响应头部实体头部二、Keep-Alive和非Keep-Alive的区别三、HTTP的方法四、HTTP和HTTPS建立连接的过程4.1 HTTP4.2 HTTPS五、HTTP和HTTPS的区别六、HTTPS的加密方式七、cookie和sessionsessioncookie八、HTTP状态码状态码200&…...

Android仿京东金融的数值滚动尺功能

自定义数值滚动尺,这个用的还是挺多的&#xff0c;例如京东金融的通过滚动尺选择金额等,而这次就是高仿京东金融的数值滚动尺。首先看看下效果图&#xff0c;如下&#xff1a;首先先给你们各个变量的含义&#xff0c;以免在后面的讲解中不知变量的意思&#xff0c;代码如下://最…...

Nginx 和 Tomcat 实现负载均衡

Nginx 和 tomcat 实现负载均衡 &#x1f3c6;荣誉认证&#xff1a;51CTO博客专家博主、TOP红人、明日之星&#xff1b;阿里云开发者社区专家博主、技术博主、星级博主。 &#x1f4bb;微信公众号&#xff1a;微笑的段嘉许 &#x1f4cc;本文由微笑的段嘉许原创&#xff01; &am…...

【万能排序之qsort、b_sort 、s_sort】

文章目录前言:star:qsort函数函数参数qsort函数的使用:star:模拟实现万冒泡排序函数参数模拟实现b_sort注意点:star:模拟实现万能选择排序函数参数模拟实现s_sort最后前言 我们所熟悉的冒泡排序&#xff0c;选择排序&#xff0c;插入排序&#xff0c;二分排序等都是基于给定的一…...

利用InceptionV3实现图像分类

最近在做一个机审的项目&#xff0c;初步希望实现图像的四分类&#xff0c;即&#xff1a;正常&#xff08;neutral&#xff09;、涉政&#xff08;political&#xff09;、涉黄&#xff08;porn&#xff09;、涉恐&#xff08;terrorism&#xff09;。有朋友给推荐了个github上…...

【Java】CAS锁

一、什么是CAS机制&#xff08;compare and swap&#xff09; 1.概述 CAS的全称为Compare-And-Swap&#xff0c;直译就是对比交换。是一条CPU的原子指令&#xff0c;其作用是让CPU先进行比较两个值是否相等&#xff0c;然后原子地更新某个位置的值。经过调查发现&#xff0c;…...

Linux服务器配置系统安全加固方法

1. SSH空闲超时时间建议为: 600-900 解决方案: 在【/etc/ssh/sshd_config】文件中设置【ClientAliveInterval】设置为600到900之间 vim /etc/ssh/sshd_config #将 ClientAliveInterval 参数值设置为 900 2. 修改检查SSH密码修改最小间隔 解决方案: 在【/etc/login.defs】文件…...