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

news2024/9/23 15:23:53

目录

    • 元素的定位
      • cssSelector
      • xpath
        • 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.png
        String 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.coloradmin.cn/o/2068344.html

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

相关文章

RFID光触发标签在多行业的应用与效益差异

在当今数字化和智能化的浪潮下&#xff0c;RFID技术已成为众多行业优化运营、提升竞争力的关键手段。RFID光触发标签作为这一技术的创新成果&#xff0c;以其独特的性能特点&#xff0c;正逐渐在各个领域发挥着重要作用。 一、RFID光触发标签的特点与参数 &#xff08;一&…

优惠券秒杀项目

一、添加优惠券的同时&#xff0c;将优惠券信息&#xff0c;以及用户列表放到redis中 Override Transactional public void addSeckillVoucher(Voucher voucher) {// 保存优惠券save(voucher);// 保存秒杀信息SeckillVoucher seckillVoucher new SeckillVoucher();seckillVou…

linux dig域名DNS 查询与iptables域名ip访问流量限制;PTR 反向解析从 IP 地址到域名的映射

一、域名 dns查询 在 Linux 系统中&#xff0c;你可以使用多种工具和技术来进行 DNS 查询和 IP 限制。以下是一些常用的方法和工具&#xff1a; DNS 查询 dig 命令&#xff1a; dig 是一个强大的命令行工具&#xff0c;用于查询 DNS 信息。 dig example.com你可以指定查询类型…

【TCP】核心机制:滑动窗口、流量控制和拥塞控制

文章目录 滑动窗口窗口滑动滑动窗口丢包 流量控制拥塞控制窗口大小变化过程 滑动窗口 有一类算法题&#xff0c;就是通过滑动窗口的思想来解决的&#xff0c;算法中的“滑动窗口”借鉴自 TCP 的滑动窗口 TCP 是要保证可靠传输的>代价&#xff0c;降低了传输的效率&#xf…

【机器学习】3. 欧式距离,曼哈顿距离,Minkowski距离,加权欧式距离

Euclidean - L2 norm L2范数 D ( A , B ) ( a 1 − b 1 ) 2 ( a 2 − b 2 ) 2 . . . D(A,B) \sqrt{(a_1-b_1)^2(a_2-b_2)^2 ...} D(A,B)(a1​−b1​)2(a2​−b2​)2... ​ Manhattan D ( A , B ) ∣ a 1 − b 1 ∣ ∣ a 2 − b 2 ∣ . . . D(A,B) \sqrt{|a_1-b_1||a_…

全网最简单的Java设计模式【九】策略模式-实战中最常用的设计模式之一

策略模式是一种行为设计模式&#xff0c;它允许你定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。在实际开发中&#xff0c;策略模式可以帮助我们减少大量的 if-else 或 switch 条件判断语句&…

产品的需求分析

一、需求 1.需求概念 用户的预期与现实存在在差异 用户所期望的明确的解决方案 2.需求的常用形式 提问题 提目的 提方案 3.需求的来源 外部需求&#xff1a;用户、市场、其他竞品 内部需求&#xff1a;业务部门、产品经理 4.需求测试方法 定性方式&#xff1a;逻辑…

【生日视频制作】江边夜景游轮观光船霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】

游轮观光船生日视频制作教程AE模板修改文字特效软件生成器素材 怎么如何做的【生日视频制作】江边夜景游轮观光船霓虹灯AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件下载AE模板把AE模板导入AE软件修改图片或文字渲染出视频

鸿蒙(API 12 Beta3版)【使用Image完成图片接收器】图片开发指导依赖JS对象

图像接收类&#xff0c;用于获取组件surface id&#xff0c;接收最新的图片和读取下一张图片&#xff0c;以及释放ImageReceiver实例。 开发步骤 添加依赖 在进行应用开发之前&#xff0c;开发者需要打开native工程的src/main/cpp/CMakeLists.txt&#xff0c;在target_link_…

【Qt】Qt系统 | Qt事件| 鼠标事件

文章目录 鼠标事件鼠标点击事件鼠标释放事件鼠标双击事件鼠标移动事件 滚轮事件 在 Qt 中&#xff0c;鼠标事件是用 QMouseEvent 实现的。当在窗口中按下鼠标或者移动鼠标时&#xff0c;都会产生鼠标事件 鼠标事件 鼠标点击事件 鼠标按下时通过 虚函数 mousePressEvent() 来…

系统编程—进程

一、进程的概念 1.程序与进程的区别 程序:编译后产生的&#xff0c;格式为ELF的&#xff0c;存储于硬盘的文件。可以通过 readelf -s [文件名] 查看文件信息 …

使用OpenRewrite升级SpringBoot项目

使用OpenRewrite升级SpringBoot项目 什么是OpenRewrite? OpenRewrite是一个强大的开源自动化源代码重构工具,专为大规模代码库设计。它的核心理念是通过程序化的方式来改变源代码,而不是依赖于手动编辑或简单的查找替换。 OpenRewrite的主要特点和优势包括: 自动重构: Open…

Unity动画模块 之 Animator中一些常见参数

本文仅作笔记学习和分享&#xff0c;不用做任何商业用途 本文包括但不限于unity官方手册&#xff0c;unity唐老狮等教程知识&#xff0c;如有不足还请斧正 我发现我忘了写Animator了&#xff0c;正好有些不常用的参数还没怎么认识,笔记来源于唐老狮 1.状态窗口参数 2.连线参数…

Lesson05--C/C++内存管理

1. C/C内存分布 2. C语言中动态内存管理方式 3. C中动态内存管理 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placement-new) 7. 常见面试题 1. C/C内存分布 为了方便管理内存被分为了以上的区域 我们来看下面的一段代码和相关问题 …

数据结构(邓俊辉)学习笔记】优先级队列 08——左式堆:结构

文章目录 1. 第一印象2. 堆之合并3. 奇中求正4. NPL5. 左倾性6. 左展右敛 1. 第一印象 在学习过常规的完全二叉堆之后&#xff0c;我们再来学习优先级队列的另一变种&#xff0c;也就是左式堆。所谓的左式堆&#xff0c;也就是在拓扑形态上更加倾向于向左侧倾斜的一种堆&#…

Vue3 项目结构

1.main.ts 2.简单写一个src下的结构 App.vue 根组件 <template><div class"app"><!-- html --><h1>你好啊!</h1></div> </template><script lang"ts"> //js 或 tsexport default {name:App,//组件名 }…

MySQL数据库锁机制(全面讲解)

目录 1、全局锁 1.1、全局锁使用语法 1.2、备份数据库&#xff08;不使用全局锁&#xff09; 2、表锁 2.1、读写锁 读锁 写锁 2.2、元数据锁&#xff08;meta data lock MDL&#xff09; 2.3、意向锁 3、行锁 3.1、共享锁和排他锁 共享锁&#xff08;S锁&#xff…

原来marker还能这么玩

在Web GIS开发中&#xff0c;Marker&#xff08;标记&#xff09;是一个基本但强大的工具。今天&#xff0c;我们将探讨如何通过不同的API调用&#xff0c;将Marker玩出新花样&#xff0c;让地图更加生动有趣。 最基础的Marker用法是在地图上标记一个具体位置。我们可以通过“m…

【Unity3D小技巧】Unity3D中实现对InputField的自定义输入限制实例

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 InputField是UGUI的文本输入框&#xff0c;自带的…

粘包,Telnet,SSH,Wireshark

一&#xff0c;粘包 原因&#xff1a;tcp为流式套接字&#xff0c;数据与数据间没有边界&#xff0c;导致多次数据粘到一起。 解决&#xff1a; 1.规定一些数据间的间隔符&#xff0c;"\aa","\r\n"; 2.可以指定要发送对象的数据长度。 3.自己将数据打包。 …