软件测试——自动化测试selenium常用函数

目录

    • 元素的定位
      • cssSelector
      • xpath
      • 函数
    • 操作测试对象
    • 窗口
      • 切换窗口
      • 窗口设置大小
      • 窗口切换
      • 屏幕截图
      • 关闭窗口
    • 等待
      • 强制等待
      • 隐式等待
      • 显示等待
    • 浏览器导航
    • 弹窗
      • 警告弹窗+确认弹窗
      • 提示弹窗
    • 文件上传
    • 浏览器参数设置

元素的定位

web⾃动化测试的操作核⼼是能够找到⻚⾯对应的元素,然后才能对元素进⾏具体的操作。常⻅的元素定位⽅式⾮常多,如id,classname,tagname,xpath,cssSelector常⽤的主要由cssSelector和xpath

cssSelector

选择器的功能:选中⻚⾯中指定的标签元素选择器的种类分为基础选择器和复合选择器,常⻅的元素定位⽅式可以通过id选择器和⼦类选择器来进⾏定位。

在这里插入图片描述

  • 打开开发者工具

  • 鼠标右键 copy selector

  • ctrl+f打开查找框,复制到查找框看是否是唯一定位

  • 无法唯一确定时,需要时要自己修改选择器

xpath

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

xpath语法:

  • 获取HTML页面所有的节点
//*
  • 获取HTML页面指定的节点
//[指定节点]
//ul :获取HTML⻚⾯所有的ul节点
//input:获取HTML⻚⾯所有的input节点
  • 获取⼀个节点中的直接子节点
/
//span/input
  • 获取⼀个节点的父节点
..
//input/.. 获取input节点的⽗节点
  • 实现节点属性的匹配
[@...]
//*[@id='kw'] 匹配HTML⻚⾯中id属性为kw的节点
  • 使⽤指定索引的⽅式获取对应的节点内容
注意:xpath的索引是从1开始的。
百度首页通过://div/ul/li[3] 定位到第三个百度热搜标签

在这里插入图片描述

更便捷的⽣成selector/xpath的⽅式:右键选择复制"Copy selector/xpath"

注意:元素的定位⽅法必须唯⼀。建议选择selector。

问题:既然可以⼿动复制 selector/xpath的⽅式 ,为什么还有了解语法?

手动复制的selector/xpath表达式并不⼀定满⾜上⾯的唯一性的要求,有时候也需要⼿动的进行修改表达式,如:想要匹配到百度⾸⻚指定的新闻⽂本或者节点集,直接使⽤ #hotsearch-contentwrapper > li 不能满足

在这里插入图片描述

报错原因:浏览器版本太低与驱动管理器版本不匹配

更新后成功
在这里插入图片描述
在这里插入图片描述

注意:登录状态下和非登录状态下打开的页面不一定相同,在做自动化测试时一定要注意页面状态的一致性

函数

  • 在页面查找元素,返回值为Element
findElement(By);
  • 在页面查找元素,返回值为List
findElements(By);

操作测试对象

public interface WebElement extends SearchContext, TakesScreenshot {void click();//点击 void submit();//提交 void sendKeys(CharSequence... keysToSend);//模拟键输入void clear();//清空String getTagName();default String getDomProperty(String name) {throw new UnsupportedOperationException("getDomProperty");}default String getDomAttribute(String name) {throw new UnsupportedOperationException("getDomAttribute");}String getAttribute(String name);//获取属性值default String getAriaRole() {throw new UnsupportedOperationException("getAriaRole");}default String getAccessibleName() {throw new UnsupportedOperationException("getAccessibleName");}boolean isSelected();boolean isEnabled();String getText();//获取文本信息List<WebElement> findElements(By by);WebElement findElement(By by);default SearchContext getShadowRoot() {throw new UnsupportedOperationException("getShadowRoot");}boolean isDisplayed();Point getLocation();Dimension getSize();Rectangle getRect();String getCssValue(String propertyName);
}
  • click 点击/提交对象
 //找到百度⼀下按钮并点击
driver.findElement(By.cssSelector("#su")).click();//页面绝大多数区域都可以点击,不只是按钮,页面影藏的标签、不可见的标签不能点击
  • sendKeys(“”) 模拟按键输⼊
driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");
  • clear() 清除文本内容
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");
  • getText() 获取文本信息
String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("打印的内容是:"+bdtext);

注意区分文本和属性值

问题:是否可以通过 getText() 获取到“百度⼀下按钮”上的⽂字“百度⼀下”呢?

注意:⽂本和属性值不要混淆。获取属性值需要使⽤⽅法 getAttribute("属性名称") ;

  • getTitle() 获取当前页面标题
  • getCurrentUrl() 获取当前页面URL

窗口

切换窗口

  • 获取当前页面句柄:
driver.getWindowHandle(); //返回值String
  • 获取所有页面句柄:
driver.getWindowHandles();//返回值Set<Sreing>
  • 切换当前句柄为最新页面:
 String curWindow = driver.getWindowHandle();Set<String> allWindow = driver.getWindowHandles();for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}}

窗口设置大小

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

窗口切换

//获取所有句柄
//获取当前停留⻚⾯句柄String curWindow = driver.getWindowHandle();Set<String> allWindow = driver.getWindowHandles();for( String w : allWindow){if(w!=curWindow){driver.switchTo().window(w);}}

​ 自动化一般不会存在打开好多个标签页 不要为难自己

屏幕截图

我们的⾃动化脚本⼀般部署在机器上⾃动的去运⾏,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时的错误场景
在这里插入图片描述

  • 屏幕截图方法需要额外导⼊包:
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</version></dependency>
	//屏幕截图void getScreenShot(String str) throws IOException {// /src/test/image///                  /2024-08-23///                             /test01-13470.png//                             /test02-13470.png//                  /2024-0-24///                             /test01-12470.png//                             /test01-12470.png//屏幕截图SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmss");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());// .src/test/image/2024-08-24/test01-13470.pngString filename ="./src/test/image/"+ dirTime + "/"+str + "-" + fileTime + ".png";System.out.println(filename);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);//scrFile放到指定位置FileUtils.copyFile(srcFile, new File(filename));}+ 屏幕截图⽅法需要额外导⼊包:~~~java
<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));

关闭窗口

driver.close();//关闭当前标签页注意:窗⼝关闭后driver要重新定义driver.quit(); //关闭浏览器、释放driver对象

等待

在这里插入图片描述

假如写自动化代码出现了NoSuchElement错误
第一步:在报错的代码前添加Thread. sleep(秒),设置的时间长一点
第二步:执行自动化,在自动化打开的页面里打开前端开发者工具,手动检查元素是否真的不存在

  1. 自动化打开的页面确实不存在该元素
  • 手动打开的页面和自动化打开的页面不一样(很可能是登陆和未登录状态下页面不一样)
  • 元素为动态元素
    在这里插入图片描述
  1. 自动化打开的页面确实存在该元素
  • 代码执行的速度比页面渲染的速度要快,页面还没渲染出来,程序已经开始找到了,导致元素没有找到解决办法 ---- 添加等待

通常代码执行的速度比页面渲染的速度要快,如果避免因为渲染过慢出现的⾃动化误报的问题呢?

可以使用selenium中提供的三种等待方法:

强制等待

  • Thread.sleep()
  • 优点:使用简单,调试的时候比较有效
  • 缺点:影响运行效率,浪费大量的时间

隐式等待

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

  • implicitlyWait() 参数:Duration类中提供的毫秒、秒、分钟等方法
  • 隐式等待作用域是整个脚本的所有元素
  • 优点:智能等待,作用于全局
  • 缺点:只能查找元素、每次查找元素都要等待
 //隐式等待1000毫秒driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000));//隐式等待5秒driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

在这里插入图片描述

显示等待

显示等待也是⼀种智能等待,在指定超时时间范围内只要满⾜操作的条件就会继续执⾏后续代码

new WebDriverWait(driver, Duration.ofSeconds(3)).until($express)
  • $press:涉及到selenium.support.ui.ExpectedConditions包下的ExpectedConditions类
  • 返回值:boolean
    在这里插入图片描述

ExpectedConditions预定义方法的一些示例:

  • elementToBeClickable(By locator) ‒ 用于检查元素的期望是可见的并已启用,以便可以单击。

  • textToBe(Bylocator,String str) - 检查元素。精确匹配

  • presenceOfElementLocated(Bylocator) ‒ 检查页⾯的 DOM 上是否存在元素。

  • urlToBe(java.lang.String url) ‒ 检查当前页面的 URL 是⼀个特定的 URL。

WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(10));
2 boolean ispass = wait.until(ExpectedConditions.textToBe(By.cssSelector("#s-topleft > a:nth-child(1)"), "新闻"));if(ispass){System.out.println("测试通过");}else {System.out.println("测试失败");}
  • 优点:显式等待是智能等待,可以⾃定义显⽰等待的条件,操作灵活

  • 缺点:写法复杂、只做用在当前条件上

问题:显示等待和隐式等待一起使用会怎么样?

可能会导致不可预测的等待时间,谨慎使用

浏览器导航

  • 浏览器的前进、后退、刷新
 driver.navigate().back();driver.navigate().forward();driver.navigate().refresh();
  • 打开网站
// 更⻓的⽅法driver.navigate().to("https://selenium.dev");// 简洁的⽅法driver.get("https://selenium.dev");

​案例:百度首页测试https://tool.lu/标签⼊⼝

弹窗

弹窗是在⻚⾯是找不到任何元素的,这种情况怎么处理?

使⽤selenium提供的Alert接⼝

警告弹窗+确认弹窗

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

提示弹窗

 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");

浏览器参数设置

  • 设置无头模式

  • 设置浏览器加载策略
    在这里插入图片描述

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

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

相关文章

【操作系统】14.I/O设备怎么分配和回收?

5.2 I/O设备怎么分配和回收&#xff1f; 5.2.1 I/O核心子系统 I/O调度 设备保护 假脱机技术&#xff08;SPOOLing技术&#xff09; ​ 输入井和输出井 ​ 输入进程和输出进程 ​ 输入缓冲区和输出缓冲区 设备分配与回收 ​ 设备分配应考虑的因素 ​ 静态分配与动态分配 ​ 设备…

上传文件(用户导入),第二次选择文件时没有反应(可用)

https://gitee.com/y_project/RuoYi-Cloud/issues/I582YB PS&#xff1a;恰好我使用的版本是 支持 handleRemove &#xff0c;所以很容易就解决了

企业如何选型人力资源管理系统?(附HR系统对比分析)

随着企业规模的扩大&#xff0c;人力资源管理系统成为了大中型企业不可或缺的工具。近年来&#xff0c;众多新技术产品层出不穷&#xff0c;这些技术和产品的实际功能和适用性并不明确&#xff0c;大量的新概念和新厂商通过各种渠道宣传&#xff0c;市场上信息过载使得企业难以…

美畅物联丨物联网平台的标准化之路:物模型设计的创新及应用

随着物联网&#xff08;IoT&#xff09;技术以前所未有的迅猛之势蓬勃发展&#xff0c;海量的物联网终端与应用纷纷接入&#xff0c;这不可避免地引发了数据与应用层面的异构化难题&#xff0c;进而形成了复杂且多变的碎片化问题。物联网感知数据因其具备多源异构的显著特性&am…

Linux中的常见命令——时间日期类命令

1、date显示当前时间 基本语法 写法功能描述date显示当前时间date %Y显示当前年份【四位数】date %m显示当前月份date %d显示当前是哪一天date "%Y-%m-%d %H:%M:%S" 显示年月日时分秒 【由于年月日和时分秒中间有空格所以需要用引号引起来】 实操案例 1、显示当…

【VUE入门级温故知新】一文向您详细介绍~组件属性Props(选项式API)

大家好&#xff0c;我是DX3906 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘大前端领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; 前面和大家分享了《如何从零开始创建一个 Vue 应用》 《VUE模板语法(超详细讲解)》 《一文向您详细介绍~Vu…

uniapp中H5网页怎么实现自动点击事件

<template><view><button ref"myButton" click"handleClick">点击我</button></view> </template><script> export default {mounted() {this.$nextTick(() > {const button this.$refs.myButton;console.l…

并发服务器---IO多路复用

单循环服务器&#xff1a;同一时刻只能处理一个客户端任务 并发服务器&#xff1a; 同一时刻&#xff0c;只能处理多个客户端的任务 实现方法&#xff1a;多进程 多线程 IO多路复用 IO多路复用&#xff1a; 1.阻塞io&#xff08;fgets scanf recv getchar read&#x…

算法的学习笔记—数据流中的中位数(牛客JZ41)

&#x1f600;前言 在处理动态数据时&#xff0c;实时计算中位数是一个经典问题。中位数是排序后处于中间位置的数值&#xff0c;数据流中的中位数计算面临两个挑战&#xff1a;首先是数据量的动态变化&#xff0c;其次是需要保持元素的有序性。为了高效地解决这个问题&#xf…

并发式服务器

并发式服务器是一种设计用来同时处理多个客户端请求的服务器。这种服务器能够提高资源利用率和响应速度&#xff0c;适用于需要服务大量用户的网络应用。以下是并发式服务器的一些关键特点&#xff1a; 多任务处理&#xff1a;并发式服务器能够同时处理多个任务或请求&#xff…

DDOS攻击学习-渗透测试-域名信息收集

文章目录 wordpress漏洞利用域名信息收集域名介绍域名分类 whoiswhois反查子域名收集子域名发现网络空间安全搜索引擎SSL证书查询js文件发现子域名 wordpress漏洞利用 这个一般都需要安装wordpress服务使用wpscan扫描&#xff0c;但现在一般很少人知道或者使用wordpress所以这个…

Mysql的查询指令

整理了一些Mysql的查询语句&#xff0c;希望对大家有帮助&#xff0c;祝大家心想事成万事如意&#xff01; 基本查询 select 字段 from 表名 where 条件&#xff1b; 排序查询 select 字段 from 表名 order by 排序字段 [asc升序|desc降序] limit 前几行/中间几行&#xff1…

美股投资迷思大揭秘:理性投资,绕开六大陷阱

你是否也对美股投资充满了期待&#xff0c;但又担心踏入误区&#xff1f;美股市场作为全球金融的璀璨明珠&#xff0c;吸引着无数投资者的目光&#xff0c;但同时也伴随着一些常见的误解。今天&#xff0c;我们就来一一拆解这些迷思&#xff0c;助你美股投资之路更加顺畅&#…

产品中的影响力六大原则

罗伯特B西奥迪尼(Robert B. Cialdini)是全球知名的说服术与影响力研究权威专家。他在著作《影响力&#xff1a;说服心理学》中提出有效的影响和说服必须遵循统一的六项心理学原则&#xff1a;互惠、承诺与一致、社会认同、喜好、权威和稀缺性。不论在生活还工作中我们或多或少会…

算法-有效的字母异位词

这道题很简单&#xff0c;就不做过多的解释&#xff0c;只需要创建一个哈希表统计s中出现的次数&#xff0c;然后遍历t&#xff0c;如果没找到&#xff0c;或者找到了但是次数为0则返回错误&#xff0c;否则返回true。代码如下&#xff1a; class Solution { public:bool isAn…

【python】Python如何通过FFmpeg处理音视频

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

06:【江科大stm32】:定时器输入捕获功能

定时器输入捕获功能 1、通过定时器的输入捕获功能测量PWM波的频率2、PWMI模式测量频率和占空比 1、通过定时器的输入捕获功能测量PWM波的频率 定时器标准库相关的编程接口&#xff1a; ①PWM.c文件的代码如下&#xff1a; /*通过定时器TIM2生成一个分辨率为10us,频率为1KHz的…

RabbitMQ中的死信交换机?(RabbitMQ延迟队列有了解过吗)

延迟队列 延迟队列:进入队列的消息会被延迟消费的队列。 延迟队列死信交换机 TTL&#xff08;过期时间&#xff09; 延迟队列的使用场景:超时订单、限时优惠、定时发布 死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信(dead letter): 消费者使…

iOS工程:获取手机相册权限,iOS原生系统弹窗, Privacy隐私政策选择,如何添加系统弹出并修改描述文字

【iOS工程】获取手机相册权限&#xff0c;iOS原生系统弹窗, Privacy隐私政策选择&#xff0c;如何添加系统弹出并修改描述文字 设备/引擎&#xff1a;Mac&#xff08;11.6&#xff09;/Mac Mini 开发工具&#xff1a;Xcode&#xff08;15.0.1&#xff09; 开发需求&#xff…

【Java设计模式】Builder模式:在Java中清晰构建自定义对象

文章目录 【Java设计模式】Builder模式&#xff1a;在Java中清晰构建自定义对象一、概述二、Builder设计模式的意图三、Builder模式的详细解释及实际示例四、Java中Builder模式的编程示例五、Builder模式类图六、Java中何时使用Builder模式七、Builder模式的优点和权衡八、源码…