当前位置: 首页 > news >正文

自动化测试常用函数(Java方向)

目录

一、元素的定位

1.1 cssSelector

1.2 xpath

1.2.1 获取HTML页面所有的节点

1.2.2 获取HTML页面指定的节点

1.2.3 获取⼀个节点中的直接子节点

1.2.4 获取⼀个节点的父节点

1.2.5 实现节点属性的匹配

1.2.6 使用指定索引的方式获取对应的节点内容

二、操作测试对象

2.1 点击/提交对象

2.2 模拟按键输入

2.3 清除文本内容

2.4 获取文本信息

2.5 获取当前页面标题

2.6获取当前页面URL

三、窗口

3.1 切换窗口

3.2 窗口的大小设置

3.3 关闭窗口

3.4 屏幕截图

 四、等待

4.1 强制等待

4.2 隐式等待

4.3 显示等待

五、浏览器导航

5.1 打开网站

5.2 浏览器的前进、后退、刷新

六、弹窗

6.1 警告弹窗+确认弹窗

6.2 提示弹窗

七、文件上传

八、浏览器参数设置

8.1 设置无头模式

8.2 设置浏览器加载策略


一、元素的定位

web自动化测试的操作核心是能够找到页面对应的元素,然后才能对元素进行具体的操作。
常见的元素定位方式非常多,如id,classname,tagname,xpath,cssSelector。常用的主要由cssSelector和xpath。

1.1 cssSelector

选择器的功能:选中页面中指定的标签元素。
选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过id选择器和子类选择器来进行定位。
定位百度首页的“百度热搜”元素,可以使用通过id选择器和子类选择器进行定位:#s-hotsearch-
wrapper > div
“搜索输入框元素”:#kw
“百度一下按钮”:#su

1.2 xpath

XML路径语言,不仅可以在XML文件中查找信息,还可以在HTML中选取节点。 xpath使用路径表达式来选择xml文档中的节点。

xpath语法中:

1.2.1 获取HTML页面所有的节点

//*

1.2.2 获取HTML页面指定的节点

//[指定节点]
//ul :获取HTML页面所有的ul节点
//input:获取HTML页面所有的input节点

1.2.3 获取⼀个节点中的直接子节点

/
//span/input

1.2.4 获取⼀个节点的父节点

..
//input/..  获取input节点的父节点

1.2.5 实现节点属性的匹配

[@...]
//*[@id='kw']  匹配HTML页面中id属性为kw的节点

1.2.6 使用指定索引的方式获取对应的节点内容

注意:xpath的索引是从1开始的。
百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签
更便捷的生成selector/xpath的方式:右键选择复制"Copy selector/xpath"
注意:元素的定位方法必须唯一。

二、操作测试对象

获取到了页面的元素之后,接下来就是要对元素进行操作。常见的操作有点击、提交、输入、清 除、获取文本。

2.1 点击/提交对象

click()

//找到百度一下按钮并点击
driver.findElement(By.cssSelector("#su")).click();

页面大部分可以点击,但也有一部分,例如页面隐藏的标签、不可见的标签就不能点击(带有hidden的标签)。运行会报“ElementNotInteractableException”错误。

2.2 模拟按键输入

sendKeys(""): 输入框可以接收的内容都可以输入。
driver.findElement(By.cssSelector("#kw")).sendKeys("输入⽂字");

2.3 清除文本内容

clear()
输入文本后又想换一个新的关键词,这需要用到 clear()。不使用的话搜索第二个关键词就是直接将第二个关键词拼接在第一个关键词之后再次搜索
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");

2.4 获取文本信息

如果判断获取到的元素对应的文本是否符合预期呢?
获取文本信息: getText()
如下为文本信息:
String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);

获取属性值:getAttribute(参数)

如下为属性值信息:
String bdtext = driver.findElement(By.cssSelector("#su")).getAttribute(name:"value");
System.out.println("百度一下按钮上的文字为:"+bdtext);

2.5 获取当前页面标题

getTitle()
String title= driver.getTitle();
System.out.println("title:"+ title);

2.6获取当前页面URL

getCurrentUrl()
String url= driver.getCurrentUrl();
System.out.println("url:"+ url);

三、窗口

对于程序来说它怎么来识别每一个窗口呢?每个浏览器窗口都有一个唯一的属性句柄(handle)来表示,那么就可以通过句柄来切换。

3.1 切换窗口

  • 获取当前页面句柄: driver.getWindowHandle();
  • 获取所有页面句柄: driver.getWindowHandles()
  • 切换当前句柄为最新页面:
String curWindow = driver.getWindowHandle();
Set<String> allWindow = driver.getWindowHandles();for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}
}
注意:执行了driver.close()之前需要切换到未被关闭的窗口

3.2 窗口的大小设置

//窗口最⼤化
driver.manage().window().maximize();
//窗口最⼩化
driver.manage().window().minimize();
//全屏窗口
driver.manage().window().fullscreen();
//⼿动设置窗口⼤⼩
driver.manage().window().setSize(new Dimension(1024, 768));

3.3 关闭窗口

注意:窗口关闭后driver 要重新定义
//关闭当前标签页
driver.close();

driver.close()表示关闭当前标签页,driver.quit()表示关闭浏览器或者释放driver对象。

3.4 屏幕截图

自动化脚本一般部署在机器上自动的去运行,如果出现了报错,程序员是不知道的,可以通过抓拍来记录当时的错误场景。
屏幕截图方法需要额外导入包:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version>
</dependency>
File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File(filename));
//简单版本
File srcfile = driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcfile,new File("my.png"));//高阶版本//获取截图时间,需要精确到毫秒才不会发生截图覆盖
List<String> times = getTime();//⽣成的文件夹路径./src/test/autotest-2024-08-01/goodsbroser-20240801-214130.png
String filename ="./src/test/autotest-"+times.get(0)+"/"+str+"-"+times.get(1)+".png";//获取屏幕截图
File srcfile = driver.getScreenshotAs(OutputType.FILE);//把屏幕截图放到指定的路径下
FileUtils.copyFile(srcfile,new File(filename));

 四、等待

通常代码执行的速度比页面渲染的速度要快,如果避免因为渲染过慢出现的自动化误报的问题呢?可以使用selenium中提供的三种等待方法:

4.1 强制等待

Thread.sleep()
优点:使用简单,调试的时候比较有效,直接阻塞程序。
缺点:影响运行效率,浪费大量的时间。假如测试用例过多,那么测试时间太长。

4.2 隐式等待

隐式等待是一种智能等待,它可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执行,直到超时没找到元素才会报错。

implicitlyWait()  参数:Duration类中提供的毫秒、秒、分钟等方法

//隐式等待1000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));
//隐式等待5秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
隐式等待 作用域 是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就⼀直生效。
优点:智能等待,作用于全局。

4.3 显示等待

显示等待也是一种智能等待,在指定超时时间范围内只要满足操作的条件就会继续执行后续代码。
new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)
$press:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
返回值:boolean
WebDriverWait foo = new WebDriverWait(driver, Duration.ofSeconds(3));
foo.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));
ExpectedConditions预定义方法的一些示例:
  • elementToBeClickable(By locator) : 用于检查元素的期望是可见的并已启⽤,以便单击它。
  • textToBe(BylocatorString str) :检查元素,精确匹配。
  • presenceOfElementLocated(Bylocator) : 检查页面的 DOM 上是否存在元素。
  • urlToBe(java.lang.String url) :检查当前页面的 URL 是一个特定的 URL。
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(10));
boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-topleft > a:nth-child(1)"), "新闻"));if(ispass){System.out.println("测试通过");}else {System.out.println("测试失败");
}

优点:显示等待是智能等待,可以自定义显示等待的条件,操作灵活。
缺点:写法复杂。

五、浏览器导航

5.1 打开网站

// 更⻓的⽅法
driver.navigate().to("https://selenium.dev");
// 简洁的⽅法
driver.get("https://selenium.dev");

5.2 浏览器的前进、后退、刷新

driver.navigate().back();
driver.navigate().forward();
driver.navigate().refresh();

六、弹窗

弹窗是在页面是找不到任何元素的,这种情况使用selenium提供的Alert接口。

6.1 警告弹窗+确认弹窗

Alert alert = driver.switchTo.alert();
//确认
alert.accept();
//取消
alert.dismiss();

6.2 提示弹窗

Alert alert = driver.switchTo.alert();
alert.sendKeys("hello");
alert.accept();
alert.dismiss();

七、文件上传

点击文件上传的场景下会弹窗系统窗口,进行文件的选择。 selenium无法识别非web的控件,上传⽂件窗口为系统自带,无法识别窗口元素,但是可以使用sendkeys来上传指定路径的文件,达到的效果是⼀样的。
WebElement ele = driver.findElement(By.cssSelector("body > div > div > input[type=file]"));
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

八、浏览器参数设置

8.1 设置无头模式

默认情况下是有头模式,无头模式需要手动设置一下。有头模式指的是自动化运行的时候,过程以浏览器的窗口形式运行,而无头模式不显示自动化过程,只显示结果。

ChromeOptions options = new Chrome0ptions();
options.addArguments("-headless");ChromeDriver driver = new ChromeDriver(options);
driver.get("https://www.baidu.com");driver.quit();

8.2 设置浏览器加载策略

//三种策略
options.setPageLoadStrategy(PageLoadStrategy.normal);
options.setPageLoadStrategy(PageLoadStrategy.eager);
options.setPageLoadStrategy(PageLoadStrategy.NONE);

通常情况下不需要设置浏览器加载策略,只有在极端情况下,页面元素可见,但页面还在加载资源的情况下才会使用。 

相关文章:

自动化测试常用函数(Java方向)

目录 一、元素的定位 1.1 cssSelector 1.2 xpath 1.2.1 获取HTML页面所有的节点 1.2.2 获取HTML页面指定的节点 1.2.3 获取⼀个节点中的直接子节点 1.2.4 获取⼀个节点的父节点 1.2.5 实现节点属性的匹配 1.2.6 使用指定索引的方式获取对应的节点内容 二、操作测试对…...

申瓯通信设备有限公司在线录音管理系统(复现过程)

漏洞简介 申瓯通信设备有限公司在线录音管理系统 index.php接口处存在任意文件读取漏洞&#xff0c;恶意攻击者可能利用该漏洞读取服务器上的敏感文件&#xff0c;例如客户记录、财务数据或源代码&#xff0c;导致数据泄露 一.复现过程 fofa搜索语句:title"在线录音管…...

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…...

JavaScript 监听 localStorage 的变化

使用 JavaScript 监听 localStorage 的变化 在Web开发中,localStorage是一种非常常用的本地存储机制。它允许我们在浏览器中存储键值对数据,即使用户关闭了浏览器或刷新页面,数据也不会丢失。但是,有时我们需要实时监控 localStorage 的变化,以便能够及时做出响应。在本文中,我…...

Java 中 HashMap 和 Hashtable 的联系

目录 相同 不同 1. 继承的父类不同 2. 线程安全性不同 3. 包含的 contains 方法不同 4. toString方法不同 5. 是否允许null值不同 6. 计算hash值的方式不同 7. 计算索引位置的方法不同 8. 初始化容量不同 9. 扩容方式不同 10. 内部存储策略不同&#xff08;此处讨论…...

Web3 开发教程

引言 Web3 是指第三代互联网&#xff0c;其核心特征之一是去中心化。通过区块链技术和智能合约&#xff0c;Web3 应用程序&#xff08;dApps&#xff09;能够在无需中心化服务器的情况下运行。本文将引导你完成一个简单的 Web3 应用程序的开发过程&#xff0c;包括环境搭建、智…...

傻瓜式PHP-Webshell免杀学习手册,零基础小白也能看懂

项目描述 一、PHP相关资料 PHP官方手册&#xff1a; https://www.php.net/manual/zh/ PHP函数参考&#xff1a; https://www.php.net/manual/zh/funcref.php 菜鸟教程&#xff1a; https://www.runoob.com/php/php-tutorial.html w3school&#xff1a; https://www.w3school…...

第十九次(安装nginx代理tomcat)

回顾 1.安装nodejs---jdk一样你的软件运行环境 yum -y list install|grep epel $? yum -y install nodejs #版本号 node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config ...淘宝镜像 3.安装vue/cli command line interface 命令行接口 npm ins…...

小红书0510笔试-选择题

Cache-Control&#xff1a;这是一个用于定义缓存行为的头部字段&#xff0c;它可以设定多个值来控制缓存的各个方面&#xff0c;如“public”、“private”、“no-cache”、“max-age”等。虽然Cache-Control的max-age指令可以指定缓存项的有效期&#xff0c;但它并不直接标识资…...

3.Java面试题之AQS

1. 写在前面 AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是Java并发包&#xff08;java.util.concurrent&#xff09;中的一个抽象类&#xff0c;用于实现同步器&#xff08;如锁、信号量、栅栏等&#xff09;。AQS提供了一种基于FIFO队列的机制来管理线程的竞争和…...

redis的集群(高可用)

redis集群的三种模式&#xff1a; 主从复制 奇数 三台 一主两从 哨兵模式 3 一主两从 cluster集群 六台 主从复制&#xff1a;和mysql的主从复制类似&#xff0c;主可以写&#xff0c;写入主的数据通过RDB方式把数据同步到从服务器&#xff0c;从不能更新到主&#xff0c;也…...

随机森林的算法

1、随机森林算法简介 随机森林算法(Random Forests)是LeoBreiman于2001年提出的&#xff0c;它是一种通过重采样办法从原始训练样本集中有放回地重复随机抽取若干个样本生成多个决策树&#xff0c;样本的最终预测值由这些决策树的结果投票决定的一种有监督集成学习模型。 其核…...

3.1、数据结构-线性表

数据结构 数据结构线性结构线性表顺序存储和链式存储区别单链表的插入和删除练习题 栈和队列练习题 串&#xff08;了解&#xff09; 数据结构 数据结构该章节非常重要&#xff0c;上午每年都会考10-12分选择题下午一个大题 什么叫数据结构&#xff1f;我们首先来理解一下什…...

记一次对HTB:Carpediem的渗透测试

信息收集 端口扫描 通过nmap对靶机端口进行探测&#xff0c;发现存在22和80端口。 访问web页面。发现是一个静态页面&#xff0c;没有可利用的部分。 目录扫描 子域枚举 通过对域名进行fuzz子域名&#xff0c;发现存在portal一级域名。 将它加入/etc/hosts&#xff0c;访问之…...

MATH2 数据集:AI辅助生成高挑战性的数学题目

随着大型语言模型&#xff08;LLMs&#xff09;在理解和生成复杂数学内容方面的能力显著提高&#xff0c;通过利用所有公开数据以及相当一部分私有数据&#xff0c;已经取得了进展。然而&#xff0c;高质量、多样化和具有挑战性的数学问题来源正在逐渐枯竭。即使是寻找新的评估…...

加密货币“蓄势待发”!美国松口降息!九月开始连续降息8次?2025年利率目标3.25-3.5%?

今晨&#xff0c;美国联准会&#xff08;Fed&#xff09;结束FOMC会议&#xff0c;一如市场预期第八度冻涨利率在5.25%-5.5%。不过主席鲍威尔(Jerome Powell)在会后的记者会访出鸽派讯号&#xff0c;暗示9月降息脚步将近。这一消息令金融市场顿时沸腾&#xff0c;美股全面大涨&…...

Vue.js 3.x 必修课|005|代码规范与 ESLint 入门

欢迎关注公众号:CodeFit 创作不易,如果你觉得这篇文章对您有帮助,请不要忘了 点赞、分享 和 关注,为我的 持续创作 提供 动力! 1. 代码规范的重要性 在现代软件开发中,代码规范扮演着至关重要的角色。 特别是在团队协作的环境中,统一的代码风格可以大大提高工作效率和…...

【Linux】动态库|静态库|创建使用|动态库加载过程

目录 ​编辑 前言 静态库 为什么要使用库(形成原理 ) 生成一个静态库 静态库的使用 动态库 生成一个动态库 动态库的使用 解决方法 动态库加载过程 ​编辑 前言 库&#xff08;Library&#xff09;是一种方式&#xff0c;可以将代码打包成可重用的格式&#xff08;站…...

WebSocket 协议与 HTTP 协议、定时轮询技术、长轮询技术

目录 1 为什么需要 WebSocket&#xff1f;2 WebSocket2.1 采用 TCP 全双工2.2 建立 WebSocket 连接2.3 WebSocket 帧 3 WebSocket 解决的问题3.1 HTTP 存在的问题3.2 Ajax 轮询存在的问题3.3 长轮询存在的问题3.4 WebSocket 的改进 参考资料&#xff1a; 为什么有 h…...

二叉树节点问题

问题:设一棵二叉树中有3个叶子结点&#xff0c;有8个度为1的结点&#xff0c;则该二叉树中总的结点数为&#xff08; 13&#xff09;个 设某种二叉树有如下特点&#xff1a;每个结点要么是叶子结点&#xff0c;要么有2棵子树。假如一棵这样的二叉树中有m&#xff08;m>0&…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...