软件测试—— Selenium 常用函数(二)

前一篇文章:软件测试—— Selenium 常用函数(一)-CSDN博客

目录

·前言

一、浏览器

1.常见操作

(1)打开网站

(2)前进、后退、刷新

2.参数设置

(1)设置无头模式

(2)设置加载策略

二、弹窗

1.警告弹窗

2.确认弹窗

3.提示弹窗

4.代码示例

三、文件上传

·总结


·前言

        在前一篇文章中,我们介绍了 Selenium 中对浏览器窗口各种操作的自动化实现函数和等待操作的作用及相关用法,本篇文章将继续对 Selenium 里的常用函数进行介绍,在进行 Web 自动化测试的过程中,并非所有的元素都可以获取到然后进行操作,比如浏览器的导航栏、页面出现的弹窗、上传文件的选择文件弹窗,这里介绍的函数主要是对浏览器导航栏,弹窗、上传文件这些特殊的操作进行自动化,下面就开始本篇文章的内容介绍吧。

一、浏览器

1.常见操作

(1)打开网站

        如上图所示,打开指定的网站就需要我们在浏览器上面的输入框中输入网站对应的 URL 可是这个输入框属于浏览器的导航栏,通过元素定位无法获取到,那么我们该如何操作呢?

        这种操作在前面文章中已经使用过一个简洁的方式,代码如下:

// 更简洁的方式
// 输入完整的网址: https:www.baidu.com
driver.get("https://www.baidu.com/");

        我们使用这种方式来打开百度的首页,然而在浏览器操作中,我们还可以使用如下所示的代码来进行相同的操作:

// 更长的方式
driver.navigate().to("https://www.baidu.com/");

         以上两种打开网站的方式都是一样的,大家凭个人喜好来使用即可。

(2)前进、后退、刷新

         如上图所示,这三种操作是我们在使用浏览器时经常使用到的操作,同样,这三个按键都无法通过定位元素的方式来获取,但是,在 Selenium 中提供了对应的三个函数来实现了这三种操作,下面我就来编写代码让大家直观的感受一下吧,具体代码及详细介绍如下所示:

public class Test {WebDriver driver;// 创建驱动void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 测试浏览器的常见操作void test10() throws InterruptedException {createDriver();Thread.sleep(2000);// 打开工具网站driver.navigate().to("https://tool.lu/");Thread.sleep(2000);// 使用浏览器的回退driver.navigate().back();Thread.sleep(2000);// 使用浏览器的前进driver.navigate().forward();Thread.sleep(2000);// 使用浏览器的刷新driver.navigate().refresh();Thread.sleep(2000);driver.quit();}public static void main(String[] args) throws InterruptedException, IOException {Test test = new Test();test.test10();}
}

        运行过程如下所示: 

2.参数设置

(1)设置无头模式

        在我们自动化程序运行的时候默认是有头模式,也就是可以观察到浏览器的打开,及所进行的一些操作,设置无头模式后,程序运行就是在后台运行了,我们在页面上就观察不到效果了,还是以上面浏览器操作的代码为例,增加无头模式的设置,再运行一遍程序来观察效果,设置无头模式的代码主要就是在创建驱动的方法中做了一点修改,所以我就把创建驱动的代码列在下面了,修改后的创建驱动代码如下所示:

    void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 设置浏览器无头模式options.addArguments("-headless");driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}

        运行过程如下所示:

        可以看出,页面没有任何变化,在过了一段时间后,程序就运行结束了,这就说明我们自动化测试已经完成。 

(2)设置加载策略

        有时我们在打开某个页面时,明明页面元素可见,但是页面却还在加载,此时我们自动化程序就会等待页面加载完成再进行下一步操作,这样无非会增加我们时间成本,所以在 Selenium 中为浏览器引入了加载策略,来应对不时之需,关于浏览器的加载策略有以下三种:

策略就绪状态备注
normalcomplete默认值,等待所有资源加载完成
eagerinteractiveDOM 访问已经准备就绪,但诸如图像的其他资源可能仍在加载
noneAny完全不会阻塞 WebDriver

        下面我来演示一下 normal 与 none 两种不同加载策略下的效果,代码如下所示: 

public class Test {WebDriver driver;// 创建驱动void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 设置浏览器无头模式// options.addArguments("-headless");// 设置浏览器加载策略// options.setPageLoadStrategy(PageLoadStrategy.NORMAL);options.setPageLoadStrategy(PageLoadStrategy.NONE);driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 测试浏览器加载策略void test11() {createDriver();driver.get("https://www.bilibili.com/");driver.quit();}public static void main(String[] args) throws InterruptedException, IOException {Test test = new Test();test.test11();}
}

        normal 加载策略的运行过程如下所示:

        none 加载策略的运行过程如下所示:

        这两种方式一对比,可以直观的感受到这两种加载策略的不同效果了。 

二、弹窗

        通过页面定位元素,是找不到弹窗的,那么如果页面出现弹窗我们要怎么处理呢?在 Selenium 中提供了 Alert 接口,专门就是来帮我们在编写自动化程序时处理弹窗,下面就对三种弹窗来分别做一下自动化处理吧。

1.警告弹窗

        警告弹框的样式如下图所示:

        它会显示一个包含信息的警告框,并带有一个 “确定” 按钮,当用户点击 “确定” 按钮时,弹窗就会关闭。 

2.确认弹窗

        确认弹窗的样式如下图所示:

        它会显示一个包含消息的确认框,并带有 “确认” 和 “取消” 按钮,如果用户点击 “确认” 按钮, confirm 函数就会返回 true,如果用户点击 “取消” 按钮,则会返回 false,根据 confirm 函数的返回值,可以使用 if 语句来决定接下来的操作。 

3.提示弹窗

        提示弹框的样式如下图所示:

         它会显示一个提示框,要求用户输入一个值,并带有 “确认” 和 “取消” 按钮,如果用户点击 “确认” 按钮,prompt 函数就会返回用户输入的值,如果用户点击 “取消” 按钮或者关闭弹窗,就会返回 null,根据返回的值,可以使用 if 语句来决定接下来的操作。

4.代码示例

        下面我就来编写一段带有三种弹窗的前端代码示例,然后再编写自动化程序代码来对这三种弹窗进行操作,带有弹窗的前端具体代码及详细介绍如下所示:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>弹窗示例</title><script>// 警告弹窗function showAlert() {alert("这是一个警告弹窗!");}// 确认弹窗function showConfirm() {let userConfirmed = confirm("您确定要继续吗?");if (userConfirmed) {document.querySelector('#showConfirm').innerHTML = "用户点击了确定!";} else {document.querySelector('#showConfirm').innerHTML = "用户点击了取消!";}}// 提示弹窗function showPrompt() {let userInput = prompt("请输入您的名字:");if (userInput !== null) {document.querySelector('#showPrompt').innerHTML = "你好, " + userInput + "!";} else {document.querySelector('#showPrompt').innerHTML = "用户取消了输入!";}}</script>
</head>
<body><h1>弹窗示例</h1><div><button onclick="showAlert()">显示警告弹窗</button></div><div><div id="showConfirm"></div><button onclick="showConfirm()">显示确认弹窗</button></div><div><div id="showPrompt"></div><button onclick="showPrompt()">显示提示弹窗</button></div>
</body>
</html>

        自动化测试的具体代码及详细介绍如下所示: 

public class Test {WebDriver driver;// 创建驱动void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 设置浏览器无头模式// options.addArguments("-headless");// 设置浏览器加载策略// options.setPageLoadStrategy(PageLoadStrategy.NORMAL);// options.setPageLoadStrategy(PageLoadStrategy.NONE);driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 测试弹窗操作void test12() throws InterruptedException {createDriver();// 打开弹窗的页面driver.get("file:///D:/%E5%BC%B9%E7%AA%97.html");// 调起警告弹窗driver.findElement(By.cssSelector("body > div:nth-child(2) > button")).click();Thread.sleep(1000);// 切换到弹窗Alert alert = driver.switchTo().alert();// 点击确定alert.accept();Thread.sleep(1000);// 调起确认弹窗driver.findElement(By.cssSelector("body > div:nth-child(3) > button")).click();Thread.sleep(1000);// 点击确认alert.accept();Thread.sleep(2000);// 刷新页面, 重新调起确认弹窗driver.navigate().refresh();driver.findElement(By.cssSelector("body > div:nth-child(3) > button")).click();Thread.sleep(1000);// 点击取消alert.dismiss();Thread.sleep(2000);// 调起提示弹框driver.findElement(By.cssSelector("body > div:nth-child(4) > button")).click();Thread.sleep(1000);// 输入彭于晏alert.sendKeys("彭于晏");// 点击确认alert.accept();Thread.sleep(2000);driver.quit();}public static void main(String[] args) throws InterruptedException, IOException {Test test = new Test();test.test12();}
}

        运行过程如下所示:

三、文件上传

        在网页中上传文件时,会弹出系统窗口,让我们进行文件的选择,我们 Selenium 是无法识别非 Web 的控件,上传文件的窗口属于系统自带,所以我们无法通过 Selenium 识别窗口元素,但是,上传文件本质是在上传文件路径,所以我们可以使用 sendkeys 函数来把文件路径进行发送,从而达到一样的效果。

        下面我就来编写一段提交文件的前端代码示例,然后再编写自动化程序来实现上传文件的操作,提交文件的前端具体代码如下所示:

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>文件上传示例</title><script>function handleFileUpload() {alert("文件上传成功!!")}</script>
</head>
<body><h1>文件上传示例</h1><form id="uploadForm" enctype="multipart/form-data" onsubmit="handleFileUpload()"><label for="fileInput">选择文件:</label><input type="file" id="fileInput" name="file"><br><br><input type="submit" value="上传文件"></form>
</body>
</html>

         自动化测试的具体代码及详细介绍如下所示:

public class Test {WebDriver driver;// 创建驱动void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");// 设置浏览器无头模式// options.addArguments("-headless");// 设置浏览器加载策略// options.setPageLoadStrategy(PageLoadStrategy.NORMAL);// options.setPageLoadStrategy(PageLoadStrategy.NONE);driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 测试文件上传操作void test13() throws InterruptedException {createDriver();// 打开文件上传页面driver.get("file:///D:/%E6%96%87%E4%BB%B6%E4%B8%8A%E4%BC%A0.html");Thread.sleep(1000);// 把文件路径放到查找的元素下,相当于文件的上传driver.findElement(By.cssSelector("#fileInput")).sendKeys("D:\\图片\\时序图.png");Thread.sleep(2000);// 查找 "上传文件" 按钮, 并进行点击操作driver.findElement(By.cssSelector("#uploadForm > input[type=submit]:nth-child(5)")).click();Thread.sleep(1000);// // 切换到弹窗, 并点击确定driver.switchTo().alert().accept();Thread.sleep(2000);driver.quit();}public static void main(String[] args) throws InterruptedException, IOException {Test test = new Test();test.test13();}
}

         运行过程如下所示:

·总结

        文章到此就要结束了,本篇文章介绍了使用 Selenium 中函数来对无法页面定位元素从而进行操作的场景进行自动化,这里主要介绍了关于浏览器导航栏、各种弹窗、文件上传相应操作的自动化方式,以及介绍了浏览器的加载策略,如果对文章内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错希望能收到你的三连支持,那么我们下一篇文章再见吧~~~

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

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

相关文章

webgl threejs 云渲染(服务器渲染、后端渲染)解决方案

云渲染和流式传输共享三维模型场景 1、本地无需高端GPU设备即可提供三维项目渲染 云渲染和云流化媒体都可以让3D模型共享变得简单便捷。配备强大GPU的远程服务器早就可以处理密集的处理工作&#xff0c;而专有应用程序&#xff0c;用户也可以从任何个人设备查看全保真模型并与…

springboot基于Spring Boot的古城景区管理系统的设计与实现docx

摘 要 古城景区管理系统是一个集景区导游功能于一体的综合管理平台&#xff0c;旨在提升游客的参观体验和提高管理效率。系统通过提供详尽的热门景点、客房类型、酒店信息、美食类型、特色美食、文创产品及导游服务&#xff0c;使游客能够深入了解古城的历史与文化。该系统集成…

彻底理解如何保证Redis和数据库数据一致性问题

一.背景 系统中缓存最常用的策略是&#xff1a;服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准&#xff0c;那么就可能出现 DB 和 Cache 数据不一致的问题。 二.读数据 逻辑如下&#xff1a; 当客户端发起查询数据的请求&#xff0c;首先回去Redis中查看没有没该数据&…

openwebui使用

文章目录 1、feature2、安装使用2.1 安装过程2.2 安装好后 1、feature 可以加载多个大模型 同时回复 模型问答: 使用vLLM框架部署模型&#xff0c;再使用Open WebUI直接进行模型问答 多模型支持: 多模型回复比对&#xff08;Qwen2-72B-Instruct, llama3-70b-8192, mixtral-8x7…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…

【已解决】“EndNote could not connect to the online sync service”问题的解决

本人不止一次在使用EndNote软件时遇到过“EndNote could not connect to the online sync service”这个问题。 过去遇到这个问题都是用这个方法来解决&#xff1a; 这个方法虽然能解决&#xff0c;但工程量太大&#xff0c;每次做完得歇半天身体才能缓过来。 后来再遇到该问…

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…

Ubuntu从入门到精通(二)远程和镜像源配置齐全

Ubuntu从入门到精通(二) 1 常见操作配置 1.1 英文语言配置 1.1.1 打开设置 1.1.2 设置语言为英文 1.1.3 重启生效 1.1.4 再次进入,选择更新名字 1.1.5 再次进入,发现已经变成了英文 1.2 输入法配置 1.3 rustdesk安装 1.3.1 Windows系统配置 登陆:https://github.com…

【Node.js】全面解析 Node.js 安全最佳实践:保护您的应用

Node.js 是一种强大的 JavaScript 运行时&#xff0c;广泛用于构建现代 Web 应用和 API。然而&#xff0c;由于其开放性和异步特性&#xff0c;Node.js 应用容易受到多种安全威胁的攻击&#xff0c;比如 SQL 注入、跨站脚本 (XSS) 和拒绝服务攻击 (DoS)。在本文中&#xff0c;我…

Spring Cloud Alibaba、Spring Cloud 与 Spring Boot各版本的对应关系

参考spring-cloud-alibaba github wiki说明&#xff1a;版本说明 下面截取说明&#xff1a; 2022.x 分支 2021.x 分支 2.2.x 分支 组件版本关系

ChatGPT Search VS Kimi探索版:AI搜索哪家强?!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;专注于分享AI全维度知识&#xff0c;包括但不限于AI科普&#xff0c;AI工…

Linux常用命令,持续更新钟

在Linux系统中&#xff0c;你可以使用多种命令来拷贝和移动文件及目录。以下是常用的几个命令及其用法&#xff1a; 一、拷贝文件或目录 cp 命令 cp 命令用于拷贝文件或目录。 拷贝文件&#xff1a; cp source_file destination_file 例如&#xff1a; cp file1.txt /hom…

基于SpringBoot的校园二手商品在线交易系统+含项目运行说明文档

一、项目技术栈 二、项目功能概述 管理员可以完成的功能包括管理员登录、管理员首页展示、系统设置、物品管理、学生管理、评论管理、举报管理、新闻公告、网站设置等&#xff0c;前台的客户可以进行查看所有商品分类、搜索商品、登录或注册、发布商品、求购商品等。 三、部分…

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)

MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk) 1.计算模型介绍 使用GARCH&#xff08;广义自回归条件异方差&#xff09;模型计算VaR&#xff08;风险价值&#xff09;时&#xff0c;方差法是一个常用的方法。GARCH模型能够捕捉到金融时间序列数据中的波…

动态规划 —— 子数组系列-乘积为正数的最长子数组长度

江河入海&#xff0c;知识涌动&#xff0c;这是我参与江海计划的第4篇。 1. 乘积为正数的最长子数组长度 题目链接&#xff1a; 1567. 乘积为正数的最长子数组长度 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/maximum-length-of-subarray-with-posit…

C语言-详细讲解-洛谷P1420 最长连号

1.题目要求 2.题目分析 考虑到说明里的数据规模&#xff0c;我们可以用动态内存分配来创建合适大小的数组&#xff0c;避免栈溢出问题&#xff0c;通过循环遍历&#xff0c;最终找到最长连号。 3.代码实现 #include <stdio.h> #include <stdlib.h>int main() {…

Python Matplotlib 数据可视化全面解析:选择它的七大理由与入门简介

Python Matplotlib数据可视化全面解析&#xff1a;选择它的七大理由与入门简介 本文介绍了Matplotlib这一强大而灵活的数据可视化工具&#xff0c;涵盖其基本概念、独特优势以及为何在众多Python绘图库中脱颖而出。Matplotlib具有广泛的社区支持、高度自定义能力、多样的绘图类…

《基于 PySpark 的电影推荐系统分析及问题解决》

以下是一篇关于上述代码的博客文章&#xff1a; 基于PySpark的电影推荐系统实现与分析 在当今数字化时代&#xff0c;个性化推荐系统在各个领域中都发挥着至关重要的作用&#xff0c;尤其是在娱乐行业&#xff0c;如电影推荐。本文将详细介绍如何使用PySpark构建一个简单的电…

ant-design-vue中table组件多列排序

antD中table组件多列排序 使用前注意实现效果图实现的功能点及相关代码1. 默认按某几个字段排序2. 点击排序按钮可同时对多个字段进行排序3. 点击重置按钮可恢复默认排序状态。 功能实现完整的关键代码 使用前注意 先要确认你使用的antD版本是否支持多列排序&#xff0c;我这里…

【华为】配置VXLAN构建虚拟网络实现相同网段互通(静态方式)

微思网络 厦门微思网络 组网需求 企业已经建成比较成熟的园区网络&#xff0c;但是没有专用的数据中心网络&#xff0c;所有的服务器分布在不同的部门&#xff0c;并且不具备集中放置的条件。现在用户希望在已有园区网络上构建一个虚拟网络&#xff0c;需求如下&#xff1a; 将…