测开(自动化测试selenium(WebDriver API))

news2024/11/19 0:45:38

一个简单的 Web自动化 演示

百度一下 迪丽热巴。这样的一个用户行为 ,会涉及的那些操作呢?
1、打开浏览器

2、在输入框里面输入关键词【迪丽热巴】
PS:当然这里可能还涉及到一个操作,回车执行操作。
或者说:点击 “百度一下” 按钮。
只是说现在的浏览器将执行操作设置成自动执行了。

3、在搜索完成之后,关闭浏览器

操作的大致流程就是这样的,那么自动化脚本该如何去写呢?

1、打开我们的 IDEA 编译器,新建一个Maven项目

2、创建测试脚本文件

selenium 的 依赖我们去 Maven 的中央厂库里下载。注意!千万不要下载 3.0版本 的 selenium,它的语法有所不同。
链接https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0</version>
        </dependency>
    </dependencies>

接下来,哦们就来使用 selenium
此时,脚本代码的测试逻辑已将完成了。
下面,我们回到 RunTest 类,去使用它。

下面我们执行这个类,你们就能看到现象:自动打开浏览器,进入到百度网页,输入关键词进行查询。查询之后,自动关闭浏览器。

1、定位元素的方法 - 只介绍两种最常使用的

1、CSS 选择器【cssSelector 方法】

如果你不懂前端的知识,有更简单获取 css 选择器 的方式:

复制到的就是:  .s_ipt

WebElement element = webDriver.findElement(By.cssSelector(".s_ipt"));

2、xpath 选择器 - 了解

xpath 语法:
1、层级: / 【表示 次级】; // 【表示 跳级】
2、属性: @ 等等。。。
3、函数: contains()等等。。。

复制到的就是://*[@id=\"kw\"]

WebElement element = webDriver.findElement(By.xpath("//*[@id=\"kw\"]"));

效果我就不展示了,都一样。

需要注意的是:定位的元素必须要唯一
意思就是说:
无论我们复制的是 css,还是xpath,都有可能找到复数的结果
那么,就很有可能导致查询的结果,与预期结果不一样!
我们可以通过下面的方法来检查元素的唯一性。

2、元素的操作

前面讲到了不少知识都是定位元素,定位只是第一步定位之后需要对这个元素进行操作。
鼠标点击,还是键盘输入,或者清除元素的内容,或者提交表单等。
这个取决于定位元素需要进行的下一步操作。
其实在我们演示的自动化脚本中,我们已经对元素进行操作了。

后面的输入关键词,以及点击 百度一下的按钮,都是对元素的操作

元素的操作,又称操作测试对象。
webdriver 中比较常用的操作对象的方法有下面几个:
1、click 点击对象
2、sendKeys 在对象上模拟按键输入
3、clear 清除对象输入的文本内容
4、submit 提交【等价于 click】

click 和 submit 都可以操作按钮

【前提:submit 操作的是按钮】
可以使用 submit 的地方,都可以使用 click 来实现。

文本样式的超链接的触发,只能通过 click(点击)的方式来触发。
如果使用 sumbit 的方式来触发,就会报错。
在 selenium 官方文档中,更推荐使用 click
不推荐使用 submit。

5、getText 用于获取元素的文本信息

另外,为什么我们是使用的 String 类型 来接收 getText 的 返回值呢?

还有一个点,这个百度一下按钮的值是获取不到的

我们来分析一下原因:

那么,我们如何获取到 标签的属性值呢?
使用 getAttribute 方法通过指定属性名称,来获取指定的属性值。

3、等待

3.1、强制等待

我们来为 “演出” 做一些准备。

下面我们把这个看似 “没问题” 的操作流程,来执行一下。

这里的延时(等待)操作,是非常重要的,关乎到脚本是否能正常运行!
我们这里所采用的方式是属于:强制等待
让程序强制等待3s之后,给予前端页面加载的时间,再执行下一条程序。

强制等待的优点 && 缺点

优点:
语法简单,适合测试的时候复用。

缺点:
效率很低!【延长测试时间】

我们使用自动化测试 的 目的 就在于 提升效率。
将 人工测试操作 交由机器来进行,节省人力成本。
并且机器的执行效率是非常高的,这样就节省了时间成本(效率得到了提升)。

但是由于我们的强制等待操作,让程序执行的过程中出现了 “停顿”,这毫无疑问会影响程序的执行效率。这种问题在 C++ 中是不被允许存在的!

另外,如果每个测试用例使用 强制等待的时间平均为 3 ~ 5s
我们以 5s 为例,通常一个web自动化测试用例与几百个,我们假如测试用例有 100个。
那么,强制等待的时间:100 x 5 == 500 s 约等于 8分钟.20s
还没完!还要加上 自动化测试脚本执行的时间呢!
考虑最坏情况(硬件环境,软件环境,网络环境都不太理想的情况),自动化测试的时间可能会超过 15 min,甚至更久!

一刻钟,这是非常久的!
像我们这个测试用例执行的时间,如果不加sleep,(软硬件都非常给力的情况)执行 0.01s 都算是非常漫长的时间!!!
更别说 15 分钟了,简直就是离谱!!!

那么,存不存在一种更高效的方法?
在获取(定位)一个元素的时候,如何没有获取到,进行等待,一旦元素加载完成,立即获取。
也就是说:等待的时间不再是固定的,而是自适应。
下面,我们就看看 “隐式等待”。

3.2、隐式等待

简单来说:
在规定的时间范围内,轮询等待元素出现之后就立即结束。
如果在规定的时间范围内,元素仍然没有出现,则会抛出一个异常【NoSuchElementException】,脚本停止运行。

没有报错,执行过程非常丝滑!
另外, 隐式等待 作用于 WebDriver 整个生命周期。
【只要没有走到 driver.quit,即没有退出浏览器,隐式等待都是一直存在的】
所以,隐式等待的代码的位置,可以随意。
需要注意的是:
规定的时间要合理,时间太短,那就和没设置一样了。

隐式等待的优缺点

优点:
节省了大量的等待时间,元素展示之后,就可以直接执行下一步。

缺点:

需要等待页面元素全部加载完成,才能执行下一步。
因此,仍然会有额外的时间浪费。【但是比强制等待要强一点】

3.3、显示等待

这里我们需要使用到 selenium 里中的一个类 ExpectedConditions,以及 until 方法。

如果在规定的等待时间内,没有找到元素,就会报异常【NoSuchElementException】。
至于代码运行,非常丝滑,没有问题。
非要说有问题的话:写法太复杂了。
ExpectedConditions 类中还有很多其它的方法

显示等待的优缺点:

优点:
针对某一个元素来进行等待,极大降低了自动化整体的等待时间。

缺点:
写法相比前面两种,要复杂一些。

注意事项

代码里面是可以同时使用显示等待和隐式等待!
但是!不推荐!
因为同时使用可能会造成一些意向不到的结果。
比如:
显示等待10s,隐式等待 5s。【等待时间不可以累加】
那么它等待时间可能是 10s,11s。。。。
总之等待时间不是固定的,

4、打印信息

我们先来做一些准备工作。
创建新的包 和 测试脚本类

1、打印网页标题

下面我们就来书写 messagePrint 方法。

2、打印当前网页的链接(网址)

方法很简单,直接中译英:获取当前网址 -> getCurrentUrl

这里我们来增加一丢丢难度,我们来获取 点击 新闻之后的网址。

下面我们来修改一下代码

我们怎么去获取到句柄呢?
这就关乎到下一个内容:窗口

5、窗口

窗口切换

通过 driver 的 getWindowHandle 方法 来获取句柄.

我们来调用一下这个方法。

我们再来试试 上一个案例的情况,看看是否能获取到 新页面的句柄

此时,我们得出结论:
getWindowHandle 方法无法感知新键页面
getWindowHandles 可以获取到所有页面的句柄(唯一标识).

那么问题来了,我们如何切换到最新页面呢?
关键就在于 getWindowHandles 上。
想要跳转到想要去的页面,从 getWindowHandles 的结果集(allWindow)中获取。

重点就在于 getWindowHandle 和 getWindowHandles 方法的配合。
再通过 switchTo.window 方法 来进行页面跳转。

其实每次都要从一个页面跳转到另一个页面,不如直接 driver.get( url ) 直接访问来的简单。
像这种辗转操作,其实在自动化测试中,并不常见。

窗口大小的设置

这个很简单,自己尝试一下

窗口 置顶 / 置底 - 了解

相信大家都遇到过浏览器 “一键置顶”的功能。
点击一个 按钮,窗口自动回到 页面顶部

那么,有一键置顶,就有一键置底

关于这个方法 selenium 提供了 driver.executeScript 方法。
意思就是执行一个 JS 语言(脚本),完成某项操作。
【PS:selenium 是无法直接编译 js 语言的,所以只能通过上面这个方法来执行】

我们先来看置底操作【window.scroll(0,document.body.scrollHeight)】

再来看置顶操作【window.scroll(0,document.body.scrollTop)】

在 selenium 中 使用,就是将我们刚才那两条脚本语言 复制到 driver.executeScript 方法中。

调用的时候,先调用 windowTest 方法 来切换页面,再来调用 windowTest2 来操作界面。

效果没有问题,我执行了。

操作浏览器的前进、后退

我以CSDN为例

接下来,我们就是要实现一组这样的操作。【页面的前进与后退】

selenium 里提供了 navigate 接口 来实现页面的导航

  • 浏览器的前进通过 driver.navigate().forward()
  • 浏览器的后退通过driver.navigate().back()

但是问题来了,我们的例子是在一个页面中执行。
如果是那种点击之后创建新页面的情况呢?

答案是:不会跳转回到之前的页面。
因为弹出的是一个新的页面,与原先的页面并不是前后的关系。

有点类似于 转发 和 重定向 之间的关系。
我们这个在线工具网站就相当于 转发。【同源】
新建页面 就相当于重定向。【异源】

操作弹窗

我就网上随便找了几个图,我就说一下思路。

就是找到点击键,点击之后,弹出窗口后,在锁定 关闭窗口键元素,进行点击(click)
【 driver.findElement(By.cssSelector(“”)).click();】

但是!,还有一种情况:弹窗元素无法选中的情况。

这种类型的弹窗被我们称为 “警告弹窗”
这种弹窗是无法通过 driver.findElement()方法 来定位元素。
这里需要用到 selenium 中提供的 Alert 接口。

另外,有确认按钮,那么就有 取消按钮

使用 dismiss 方法就可以了。

还有一种特别的弹窗,可以让我们进行输入

这里的输入框也是无法定位的!
想要输入内容也很简单!还是使用 sendKeys 方法

模拟 鼠标,键盘操作

selenium 提供了 Actions 接口,来模拟 鼠标的操作

代码如下

虽然上述操作中,通过对元素的定位完成了选择。
但是,我们是要模拟 鼠标 操作的,因此我们需要鼠标 “动起来”,通过鼠标去点击选择。

键盘的操作,我们已经用过了,就是 sendKeys 方法


选择框

下面的这个场景才是真正的 下拉菜单,上面那个算是点击菜单

selenium 就是提供了 select 接口

我们还可以通过value属性值来选择选项

还有最后一个方法:根据可见文本来选择

文件的上传

此时,我们来思考一件事:能不能定位 系统框中的元素,并进行操作?
selenium 不能直接操作系统框。

但是,这个操作是可以模拟实现。【sendKeys方法 输入 上传文件路径(包含文件名称)】

8、屏幕截图

这里我们回顾一下前面的内容:

我们在百度页面搜索关键词 “迪丽热巴”,然后从中获取到某些数据。
在不添加等待的情况下,由于代码执行的速度过快,导致页面元素获取不到【页面元素还未加载完成】,从而抛出异常 【NoSuchElementException】

如果我不告诉你:获取不到元素的原因,你能推导出原因吗?
这个时候就可以使用屏幕截图来解决。

我对我的代码执行的过程进行 “拍照(截图)”,去发现它的一个问题是什么?
举个例子:
高速公路的车辆行驶速度是非常快的。【类比 代码的执行速度】
而且 在高速公路上是最容易发生 超速问题(元素获取不到的问题)的!
于是就有了高速抓怕摄像头(屏幕截图)来抓住 问题的情况(证据)。

selenium 提供了相应的(屏幕截图)方法:driver.getScreenshotAs(OutputType.返回的文件类型);
在使用之间,我们需要导入一个依赖

     <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.6</version>
        </dependency>

代码如下:

注意!我们是没有使用等待的,所以当前这个方法是一定会报异常的,会得到一下截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1141964.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…

Spring的执行流程与Bean的生命周期

目录 一、Spring的执行流程&#xff08;生命周期&#xff09; 二、Bean的生命周期 一、Spring的执行流程&#xff08;生命周期&#xff09; 首先在Spring的执行过程中会先启动容器&#xff0c;这里是将配置文件进行加载。根据配置文件完成Bean的实例化&#xff0c;比如是配置的…

通过cpolar分享本地电脑上有趣的照片:部署piwigo网页

通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 前言 作为一个游戏爱好者&#xff0c;笔者在闲暇之余也会登录…

ChatGLM系列二:ChatGLM2的介绍及代码实践

一、介绍 2023年06月25日&#xff0c;清华大学开源了 ChatGLM2-6B 模型&#xff0c;是 ChatGLM 模型的升级版本。ChatGLM2-6B 在多个方面有显著提升&#xff1a;模型性能更强&#xff0c;在各种测试集上的表现更好&#xff1b;支持更长的上下文&#xff0c;最大上下文长度提升…

Java练习题2021-3

"某地大数据防疫平台记录了往来的所有防疫相关信息&#xff0c;包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地希望依据平台数据组织新一轮的疫苗接种&#xff0c;现有2针免疫的疫苗A和1针免疫的疫苗B。 对于本地人员&…

漏洞复现-Apache Druid 任意文件读取 _(CVE-2021-36749)

Apache Druid 任意文件读取 _&#xff08;CVE-2021-36749&#xff09; 漏洞信息 Apache Druid Version 0.22以下版本中存在安全漏洞CVE-2021-36749文件读取漏洞 描述 ​ 由于用户指定 HTTP InputSource 没有做出限制&#xff0c;可以通过将文件 URL 传递给 HTTP InputSourc…

氧化锌纳米线 Zinc oxide nanowires

氧化锌纳米线 英文&#xff1a;Zinc oxide nanowires 分子式&#xff1a;ZnO 直径&#xff1a; 50nm 长度&#xff1a; 20um 纯度: 99% 外观&#xff1a;白色 描述&#xff1a;纳米线可以被定义为一种具有在横向上被限制在100纳米以下(纵向没有限制)的一维结构。悬置纳米…

Builder 请进:波卡最新开发入门指南

撰文&#xff1a;Dennis Zoma 编译&#xff1a;OneBlock 社区 本文更新于 2023 年 10 月 3 日&#xff0c;来源&#xff1a;https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议&#xff0c;有两个目标&#xff1a;在所有连接的平行链之间提供共享安全…

你绝对不知道的JMeter中如何实现接口之间的关联?

关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的&#xff0c;要获取并使用这些数据&#xff0c;就要使用关联。 比如&#xff1a;用户登录后&#xff0c;session信息都不同&#xff0c;有些操作要使用session&#xff0c;就需要将这个动态的信…

计算机网络_04_传输层

文章目录 1.什么是传输层2.传输层提供了什么服务3.传输层协议TCP 1.什么是传输层 传输层是OSI七层体系架构中的第四层, TCP/IP四层体系架构中的第二层, 从通信和信息处理两方面来看&#xff0c;“传输层”既是面向通信部分的最高层&#xff0c;与下面的三层一起共同构建进行网…

bootstap_小项目

通过bootstrap画一个简单的后台管理页面&#xff0c;知识有限&#xff0c;页面粗糙&#xff0c;一种记录方式 页面效果展示 首页页面代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible&qu…

Uva11059 Maximum Product(最大乘积)

1、题目 Uva 11059 2、题意 输入 n n n 个元素组成的序列 S S S&#xff0c;你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数&#xff0c;应输出0&#xff08;表示无解&#xff09;。 1 ≤ n ≤ 18 &#xff0c; − 10 ≤ S i ≤ 10 1 \le n \le 18&…

测试小白必看!接口测试必需掌握的知识要点!

接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试原理 通过测试程序模拟客…

SpringBoot中使用JdbcTemplate访问Oracle数据库

Oracle相信大家都不陌生吧&#xff0c;一个大型的数据库&#xff0c;至于数据库&#xff0c;我相信各位都比较熟悉了&#xff0c;一个软件系统&#xff0c;不论是我们常做的App、小程序、还是传统的web站点&#xff0c;我们都有用户的信息&#xff0c;相关业务的数据&#xff0…

公司如何禁止拷贝文件

公司如何禁止拷贝文件 安企神U盘管理系统下载使用 禁止拷贝文件是一种数据安全措施&#xff0c;通常在企业中用于保护重要信息和知识产权。禁止拷贝文件的方法需要根据公司的实际情况来选择和实施&#xff0c;以下是一些常见的方法&#xff0c;可用于防止文件拷贝&#xff1a…

Splunk 之 filed 恢复

1: 背景&#xff1a; 我们在工作过程中&#xff0c;或者是和很多team 进行交互的时候&#xff0c;总会有 filed 共用的情况&#xff0c;还有就是filed 会被相同权限的同事删除等等&#xff0c;这种情况下&#xff0c;就要求做好 /opt/splunk/etc/apps 的备份工作。 如果知道原…

Amazon Lambda 转 Container Image 方式部署

背景描述 对于从 Lambda Console通过 Author from scratch 创建的函数, 可以直接在浏览器中编辑代码和调试, 非常方便. 不过由于 Lambda 函数 Quota 限制 Console 编辑器最大 3MB, 包含 Layer 和自定义 Runtim 后最大 250MB, 并且此配额不支持提限, 因此当函数体量较大时就不适…

基于AI与物联网技术的智能视频监控系统架构剖析

智能视频监控系统正逐渐成为我们日常生活和工作中不可或缺的一部分。基于物联网的智能监控系统架构为我们在各个领域提供了更高效、智能化和安全的监控解决方案。本文将以旭帆科技EasyCVR视频监控云平台为例&#xff0c;介绍基于AI、物联网的智能监控系统的架构&#xff0c;并探…

一网打尽——线粒体基因组高级分析

线粒体堪称生命活动的“能量供给站”&#xff0c;这种存在于大多数细胞中的细胞器&#xff0c;拥有自身的遗传物质和遗传体系&#xff0c;除了为细胞供能之外&#xff0c;线粒体还参与到多种细胞功能过程中&#xff0c;拥有调控细胞生长和细胞周期的能力。 典型的动物线粒体是…

【BUG】Nginx转发失败解决方案

最近在做项目的时候出现了一个问题&#xff0c;琢磨了好久&#xff0c;来浅浅记录一下。 这个项目后端使用的是gateway网关和nacos实现动态的路由&#xff0c;前端使用nginx来管理前端资源&#xff0c;大体流程&#xff1a;浏览器发起请求&#xff0c;经过nginx代理&#xff0c…