【软件测试】自动化常用函数

文章目录

  • 元素的定位
    • cssSelector
    • xpath
    • 查找元素
  • 操作测试对象
    • 点击/提交对象——click()
    • 模拟按键输入——sendKeys(“”)
    • 清除文本内容——clear()
    • 获取文本信息——getText()
    • 获取页面标题和 URL
  • 窗口
    • 设置窗口大小
    • 切换窗口
    • 关闭窗口
  • 等待
    • 强制等待
    • 隐式等待
    • 显式等待
  • 浏览器导航

元素的定位

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

cssSelector

选择器的功能:选中页面中指定的标签元素

选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过 id 选择器和子类选择器来进行定位image.png

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"

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

查找元素

  1. findElement,在页面查找元素,返回值 WebElement
    查找页面元素
driver.findElement(By.cssSelector("#s-hotsearch-wrapper > div > a.hot-title > div > i:nth-child(1)")).click();  
driver.findElement((By.xpath("//*[@id=\"s-hotsearch-wrapper\"]/div/a[1]/div/i[1]"))).click();
  • 这两个查找,都是找到百度热搜

  1. findElements,在页面查找元素,返回值为 List<WebElement>
List<WebElement> elements = driver.findElements(By.cssSelector("#hotsearch-content-wrapper > li > a > span.title-content-title"));  
for(WebElement str : elements){  
    System.out.println(str.getText());  
}
  • 打印热搜标题image.png

操作测试对象

点击/提交对象——click()

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

页面中,除了按钮可以点之外,其他绝大多数元素也能点击

  • 页面隐藏的元素不能进行操作,不然会报错image.png

模拟按键输入——sendKeys(“”)

这个方法可以在任意能输入文本的地方进行输入

driver.findElement(By.cssSelector("#kw")).sendKeys("今天天气");  
Thread.sleep(3000);  
driver.quit();

![[屏幕录制 2024-11-16 165917.mp4]]

清除文本内容——clear()

输入文本后,又想换一个新的关键词,这里就需要用到 clear()

若想在一个场景下更换多个关键词,需要将前一个关键词清楚掉;若不清除,每次 sendKeys 将完成拼接的操作

driver.findElement(By.cssSelector("#kw")).sendKeys("我爱游戏");
driver.findElement(By.cssSelector("#kw")).clear();
driver.findElement(By.cssSelector("#kw")).sendKeys("我爱学习");

获取文本信息——getText()

WebElement bdtext =  driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(3) > a > span.title-content-title"));  
System.out.println(bdtext.getText());  

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

//获取百度一下按钮上的文本  
String text = driver.findElement(By.cssSelector("#su")).getText();  
System.out.println("百度一下上的文字为:"+text);
  • 最终得到的结果是:image.png
  • 打印的 text 是空的,因为“百度一下”是 input 标签里面的属性值,需要用 getAttribute(String) 将其拿出来,不能通过拿文本的方式将其拿出来image.png

//获取百度一下按钮上的文本  
String text = driver.findElement(By.cssSelector("#su")).getAttribute("value");  
System.out.println("百度一下上的文字为:"+text);

image.png|360

获取页面标题和 URL

String title = driver.getTitle();  
String url = driver.getCurrentUrl();  
System.out.println(title);  
System.out.println(url);

image.png|327

窗口

设置窗口大小

//设置窗口大小  
//窗口最小化  
driver.manage().window().minimize();  
Thread.sleep(2000);  
//窗口最大化  
driver.manage().window().maximize();  
Thread.sleep(2000);  
//窗口全屏  
driver.manage().window().fullscreen();  
Thread.sleep(2000);  
//自定义尺寸  
driver.manage().window().setSize(new Dimension(800,400));  
Thread.sleep(2000);

切换窗口

当创建一个驱动之后,驱动对象就会指向打开的那个页面的句柄

  • 每一个标签页都有一个自己的句柄信息
  • 如果想让 driver 指向别的标签页,就需要使其指向改变
  1. 获取所有标签页的句柄信息
  2. 当新建的窗口句柄信息与最初的标签页句柄信息不一样的话,就进行 driver 指向改变
  3. 从而达到切换窗口的效果

  • 获取当前页面句柄:driver.getWindowHandle()
  • 获取所有页面句柄:driver.getWindowHandles()
driver.findElement(By.cssSelector("#s-hotsearch-wrapper > div > a.hot-title > div")).click();  
String curHandle = driver.getWindowHandle();  
Set<String> allHandles = driver.getWindowHandles();  
for(String handle : allHandles){  
    if(handle != curHandle){  
        //切换 driver 的句柄指向  
        driver.switchTo().window(handle);  
    }  
}
  • 根据 driver 获取所有页面的句柄,但指向只有一个

注意:执行了 driver.close() 之前需要切换到未被关闭的窗口

  • 自动化一般不会存在要打开好多个标签页,跳转到任意标签页的操作
  • 可以直接使用 driver.get(URL) 进行跳转

关闭窗口

//关闭当前标签页
driver.close();

//关闭浏览器,释放driver对象
driver.quit();
  • 若 driver 指向标签页 1,那么即使你关闭了标签页 1,没有改变 driver 指向,就无法关闭标签页 2,除非将 driver 的指向改变

close() 用到的场景比较少,只会在以下场景下去使用

  • 测试打开的新的标签页之后还要继续返回到前一个标签页中进行测试

等待

假如写自动化代码出现了 NoSuchElement 错误

  • 第一步:在报错的代码前添加 Thread.sleep(秒),设置的时间长一点
  • 第二步:执行自动化,在自动化打开的页面里打开前端开发者工具,手动检查元素是否真的不一样
    1. 自动化打开的页面确实不存在该元素

      • 手动打开的页面和自动化打开的页面不一样(很有可能是登录和未登录状态下的页面不一样)
      • 元素为动态元素(解决办法:先定位动态元素的前一级标签,再增加要定位的元素标签)
    2. 自动化打开的页面确实存在该元素

      • 代码执行的速度比页面渲染的速度要快。页面还没渲染出来,程序就已经开始找了,导致元素没有找到(解决办法:添加等待)

强制等待

以阻塞线程的方式,达到等待的效果

Thread.sleep();
  • 优点:写法简单,好理解,直接阻塞程序
  • 缺点:极大的增加了自动化的执行时间

100 条测试用例,每个用例添加强制等待平均时间 3 s

  • 总:1000 * 3 = 3000s = 50min
  • 理想的情况下:2 - 3min

隐式等待

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

你的女朋友转校了,让你等她三年。但第二年的时候,她回来了

  • 你坚持要等完三年再和她在一起(强制等待
  • 她回来后,你就和她在一起了(隐式等待
  • implicitlyWait() 参数:Duration 类中提供的毫秒、秒、分钟等方法
//隐式等待3秒
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

//隐式等待3000毫秒
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(3000));
  • 3s 内找到元素,继续执行
  • 3s 内没有找到元素,报错 NoSuchElement
  • 以轮询的方式来查找这个元素,一直在询问找到没有
  • 优点:智能等待,作用全局

隐式等待作⽤域是整个脚本的所有元素。即只要 driver 对象没有被释放掉(driver.quit()),隐式等待就⼀直⽣效。

显式等待

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

new WebDriverWait(driver, Duration.ofSeconds(3).until($express))
  • $press:涉及到 selenium.support.ui.ExpectedCondition 包下的 ExprxtedCondition
  • 返回值:boolean
WebDriverWait wait = new WebDriverWait(driver,Duration.ofSeconds(3));  
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#su")));  
//先保证元素存在且可以点击后  
driver.findElement(By.cssSelector("#su")).click();
  • 优点:显式等待是智能等待,可以自定义显式等待的条件,操作灵活
  • 缺点:写法复杂

ExpectedConditions 预定义的一些示例:

  • elementToBeClickable(By location):用于检查元素的期望是可见的并已启用,以便可以单击它
  • textToBe(By locator, String str):检查元素(精确匹配)
  • presenceOfElementLocated(By locator):检查页面的 DOM 上是否存在元素
  • urlToBe(java.lang.String url):检查当前页面的 URL 是一个特定的 URL

浏览器导航

  • 打开网站
//更长的方法
driver.navigate().to("https://www.bytedance.com");

//简单的方法
driver.get("https://www.bytedance.com");
  • 浏览器的前进、后退、刷新
//后退
driver.navigate().back();  
//前进
driver.navigate().forward();  
//刷新
driver.navigate().refresh();

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CC4学习记录

&#x1f338; CC4 CC4要求的commons-collections的版本是4.0的大版本。 其实后半条链是和cc3一样的&#xff0c;但是前面由于commons-collections进行了大的升级&#xff0c;所以出现了新的前半段链子。 配置文件&#xff1a; <dependency><groupId>org.apach…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

5. ARM_指令集

概述 分类 汇编中的符号&#xff1a; 指令&#xff1a;能够编译生成一条32位机器码&#xff0c;并且能被处理器识别和执行伪指令&#xff1a;本身不是指令&#xff0c;编译器可以将其替换成若干条指令伪操作&#xff1a;不会生成指令&#xff0c;只是在编译阶段告诉编译器怎…

小程序租赁系统开发为企业提供高效便捷的租赁服务解决方案

内容概要 在这个数字化飞速发展的时代&#xff0c;小程序租赁系统应运而生&#xff0c;成为企业管理租赁业务的一种新选择。随着移动互联网的普及&#xff0c;越来越多的企业开始关注如何利用小程序来提高租赁服务的效率和便捷性。小程序不仅可以为用户提供一个快速、易用的平…

计算机组成原理——高速缓存

标记表示——主存块号和缓存块之前的一一对应关系

赛元免费开发板申请

在作者网上冲浪的时候&#xff0c;突然发现了一个国内的良心企业&#xff0c;虽然现在不是很有名&#xff0c;但是他现在是有一个样品申请的活动&#xff0c;他就是国内的Redfine新定义&#xff0c;他申请的板子是用的赛元MCU&#xff0c;作者本着有板子就要申请的原则&#xf…

Ubuntu 的 ROS 操作系统 turtlebot3 SLAM仿真

引言 SLAM&#xff08;同步定位与地图构建&#xff09;在Gazebo仿真环境中的应用能够模拟真实机器人进行环境建图和导航。通过SLAM仿真&#xff0c;开发者可以在虚拟环境中测试算法&#xff0c;而不必依赖真实硬件&#xff0c;便于调试与优化。 Gazebo提供了多个虚拟环境&…

【解决】Layout 下创建槽位后,执行 Image 同步槽位位置后表现错误的问题。

开发平台&#xff1a;Unity 6.0 编程语言&#xff1a;CSharp 编程平台&#xff1a;Visual Studio 2022   一、问题背景 | 开发库存系统 图1 位置同步失败问题 图2 位置正常同步效果表现 黑框 作用于 UnityEngine.UI.GridLayoutGruop&#xff0c;形成 4x6 布局&#xff0c;如…

红日靶场-1详细解析(适合小白版)

红日靶场涉及内网知识&#xff0c;和前期靶场不太一样&#xff0c;前期靶场大部分都是单个靶机获得root权限&#xff0c;而这一次更综合&#xff0c;后期也会继续学习内网知识&#xff0c;继续打红日靶场&#xff0c;提高自己的综合技能。 环境搭建 首先本题的网络拓扑结构如…

LabVIEW大数据处理

在物联网、工业4.0和科学实验中&#xff0c;大数据处理需求逐年上升。LabVIEW作为一款图形化编程语言&#xff0c;凭借其强大的数据采集和分析能力&#xff0c;广泛应用于实时数据处理和控制系统中。然而&#xff0c;在面对大数据处理时&#xff0c;LabVIEW也存在一些注意事项。…

小米路由器用外网域名访问管理界面

本文在Redmi AX3000 (RA81)设置&#xff0c;其他型号路由器的管理界面端口可能各不相同。 开始之前需要保证路由器SSH功能正常&#xff0c;如果没有SSH可以参考这里。 1. 给WAN口开放80端口 可以通过下载mixbox的firewall插件或者其他防火墙插件开放端口。 2. 把域名解析到路…

【AI图像生成网站Golang】雪花算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 雪花算法 雪花算法 (Snowflake) 是一种高效、可扩展的分布式唯一ID生成算法&#xff0c;最早由 Twitter 开发&…

【计算机网络】协议定制

一、结构化数据传输流程 这里涉及协议定制、序列化/反序列化的知识 对于序列化和反序列化&#xff0c;有现成的解决方案&#xff1a;①json ②probuff ③xml 二、理解发送接收函数 我们调用的所有发送/接收函数&#xff0c;根本就不是把数据发送到网络中&#xff01;本质都是…

用sqlmap工具打sqli-labs前20关靶场

这个星期我们用手动注入打了前20关靶场&#xff0c;今天我们用sqlmap直接梭哈前20关 1.介绍sqlmap sqlmap是一个自动化的SQL注入工具&#xff0c;其主要功能是扫描&#xff0c;发现并利用给定的URL和SQL注入漏洞。 2.下载和使用sqlmap 官方下载地址&#xff1a;GitHub - sq…

Unreal engine5实现类似鬼泣5维吉尔二段跳

系列文章目录 文章目录 系列文章目录前言一、实现思路二、具体使用蓝图状态机蓝图接口三、中间遇到的问题 前言 先看下使用Unreal engine5实现二段跳的效果 一、实现思路 在Unreal Engine 5 (UE5) 中使用蓝图系统实现类似于《鬼泣5》中维吉尔的二段跳效果&#xff0c;可以通…

【大数据学习 | flume】flume之常见的sink组件

Flume Sink取出Channel中的数据&#xff0c;进行相应的存储文件系统&#xff0c;数据库&#xff0c;或者提交到远程服务器。Flume也提供了各种sink的实现&#xff0c;包括HDFS sink、Logger sink、Avro sink、File Roll sink、HBase sink&#xff0c;。 ​ Flume Sink在设置存…

C++构造函数详解

构造函数详解&#xff1a;C 中对象初始化与构造函数的使用 在 C 中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建对象时自动调用&#xff0c;用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态&#xff0c;并且在不传递任何…

最小的子数组(leetcode 209)

给定一个正整数数组&#xff0c;找到大于等于s的连续的最小长度的区间。 解法一&#xff1a;暴力解法 两层for循环&#xff0c;一个区间终止位置&#xff0c;一个区间起始位置&#xff0c;找到大于等于s的最小区间长度&#xff08;超时了&#xff09; 解法二&#xff1a;双指…

应用系统开发(10) 钢轨缺陷的检测系统

涡流检测系统框图 其中信号发生器为一定频率的正弦信号作为激励信号&#xff0c;这个激励信号同时输入给交流电桥中的两个检测线圈&#xff0c;将两个线圈输出的电压差值作为差分信号引出至差分放大电路进行放大&#xff0c;经过放大后信号变为低频的缺陷信号叠加在高频载波上…

结构化需求分析与设计

前言: 感觉书本上和线上课程, 讲的太抽象, 不好理解, 但软件开发不就是为了开发应用程序吗?! 干嘛搞这么抽象,对吧, 下面是个人对于软件开发的看法, 结合我的一些看法, 主打简单易懂, 当然,我一IT界小菜鸟, 对软件开发的认识也很浅显, 这个思维导图也仅仅是现阶段我的看…