「自动化测试」Selenium 的使用

news2024/11/25 4:29:12

使用 Selenium 需要先导入相关依赖

<dependency> 
    <groupId>org.seleniumhq.selenium</groupId> 
    <artifactId>selenium-java</artifactId> 
    <version>4.0.0</version> 
</dependency>

<dependency>
    <groupId>io.github.bonigarcia</groupId>
    <artifactId>webdrivermanager</artifactId>
    <version>5.8.0</version>
    <scope>test</scope>
</dependency>

定位元素

CSS 选择器(cssSelector)可用于选中页面中指定的标签元素

在这里插入图片描述
复制后得到:

#kw

除了 CSS 选择器,常用的还有 xpath,它是 XML 路径语言,不仅可以在 XML 文件中查找信息,也可以在 HTML 中选取节点
xpath 使用路径表达式来选择 xml 文档中的节点
在 xpath 语法中:

//:获取 HTML 页面中所有节点
//[ 指定节点 ]:获取 HTML 页面中指定节点。比如 //ul 表示获取 HTML 页面所有 ul 节点
[@…] :匹配节点属性。比如 //
[@id=‘kw’] 表示匹配 HTML 页面中 id 属性为 kw 的节点

查找元素时,有时候会出现 NoSuchElementException,说明没找到元素,下面给出排查步骤:

  1. 在报错代码前添加 Thread.sleep(),设置的时间长一点
  2. 执行自动化,在自动化打开的页面中打开前端开发者工具,手动检查元素是否真的不存在
    如果自动化打开的页面确实不存在该元素,有两种可能:
    ① 手动打开的页面和自动化打开的页面不一样(很可能是登陆和未登录状态下页面不一样)
    ② 元素为动态元素
    如果元素是动态元素,那我们可以先定位动态元素的上一级标签,再增加要定位的元素标签,例如driver.findElement(By.cssSelector(“body > div > section article”));。
    如果自动化打开的页面有该元素,那就是因为代码执行的速度比页面渲染的速度快,页面还没渲染出来,程序就已经找到了,导致元素没有找到。这种情况的解决办法就是添加等待

操作测试对象

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

点击

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

模拟按键输入

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("百度贴吧");

获取文本信息&属性值

如何判断获取到的元素对应的文本是否符合预期呢?此时我们需要获取元素对应的文本并打印⼀下

String bdtext = driver.findElement(By.xpath("//*[@id="title-content"]/span[1]")).getText();
System.out.println("获取到的内容是:"+bdtext); 

获取属性值使用方法 getAttribute("属性名称")

其他

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


窗口

当我们进行手工测试时,我们可以通过肉眼来判断当前在哪个窗口,但对于程序来说它是不知道当
前最新的窗口是哪一个。那程序怎么识别每一个窗口呢?
每个浏览器窗口都有一个唯一的属性——句柄(handle),我们可以通过句柄来切换窗口

切换窗口

  1. 获取当前页面句柄
driver.getWindowHandle(); 
  1. 获取所有页面句柄:
driver.getWindowHandles();
  1. 将当前句柄切换为最新页面的
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))

截屏

自动化脚本一般是部署在机器上自动运行的,如果出现了报错,我们是不知道的,可以通过抓拍来记录当时错误的场景
屏幕截图方法需要额外导入包:

<dependency> 
    <groupId>commons-io</groupId> 
    <artifactId>commons-io</artifactId> 
    <version>2.6</version> 
</dependency>
public void getScreenShot(String str) throws IOException {
    // 创建日期格式化对象
    SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
    SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");

    // 通过时间来给截图文件命名,这样可以避免文件名覆盖的问题
    // 获取当前时间并分别进行格式化。dirTime 格式化为 "yyyy-MM-dd"
    String dirTime = sim1.format(System.currentTimeMillis());
    String fileTime = sim2.format(System.currentTimeMillis());

    // 构建截图文件的文件名
    String filename = "./src/test/image/" + dirTime + "/" + str + "-" + fileTime + ".png";
    System.out.println("filename:" + filename);


    File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    // 把 srcFile 放到指定位置
    FileUtils.copyFile(srcFile,new File(filename));
}

等待

强制等待

Thread.sleep(毫秒);

优点:使用简单,调试的时候比较有效
缺点:影响运行效率,浪费大量的时间。所以一般用于调试

隐式等待

隐式等待是⼀种智能等待,用于解决元素未完全加载时 WebDriver 查找和操作元素的问题。它可以规定在查找元素时,在指定时间内不断尝试查找元素。如果找到则代码继续执行,超时没找到元素则抛出 NoSuchElementException

implicitlyWait(Duration 类中提供的毫秒、秒、分钟等方法);
//隐式等待 1000 毫秒 
driver.manage().timeouts().implicitlyWait(Duration.ofMillis(1000)); 
//隐式等待 5 秒 
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));

隐式等待的作用域是整个脚本所有元素,也就是说每次查找元素都需要等待,这样就很浪费时间
注意:隐式等待对非 HTML 页面的元素是不生效的。比如弹窗是无法等待的


显式等待

显式等待也是一种智能等待,在指定超时时间的范围内只要满足条件就会继续执行后续的代码
可以看到这里面提供了很多种条件,不用刻意去记,多用用就熟悉了

在这里插入图片描述


浏览器导航

打开网站:

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

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

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

关于页面的刷新,这里需要补充一下,就是如果在一个页面有输入内容(比如登录页输入账号密码),希望清除掉输入框中内容的话,可以选中输入框然后 clear,也可以直接 refresh 页面


弹窗

弹窗不属于页面的元素,需要使用 selenium 提供的 Alert 接口来定位

  1. 警告 & 确认弹窗
    在这里插入图片描述
Alert alert = driver.switchTo.alert(); 
//点击确定
alert.accept() 
//点击取消
alert.dismiss()
  1. 提示弹窗
    这种弹窗一般需要输入内容

在这里插入图片描述

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

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

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

相关文章

免费录屏神器!这四款软件让你快捷录屏~

随着技术的进步&#xff0c;免费的录屏软件如雨后春笋般涌现&#xff0c;为我们的工作、学习和娱乐提供了极大的便利。今天&#xff0c;就让我来为大家推荐几款备受好评的免费录屏软件&#xff0c;并分享一下使用感受吧&#xff01; 一、福昕录屏 直通车&#xff08;粘贴到浏览…

OJ在线评测系统 微服务高级 Gateway网关接口路由和聚合文档 引入knife4j库集中查看管理并且调试网关项目

Gateway微服务网关接口路由 各个服务之间已经能相互调用了 为什么需要网关 因为我们的不同服务是放在不同的端口上面的 如果前端调用服务 需要不同的端口 8101 8102 8103 8104 我们最好提供一个唯一的 给前端去调用的路径 我们学习技术的时候必须要去思考 1.为什么要用&am…

回溯算法:一个模板解决排列组合问题

回溯算法 在初遇排列组合题目时&#xff0c;总让人摸不着头脑&#xff0c;但是当我做了很多题目后&#xff0c;发现几乎能用同一个模板做完所有这种类型的题目&#xff0c;大大提高了解题效率。回溯是递归的副产品&#xff0c;只要有递归就会有回溯。 回溯法很难&#xff0c;…

77寸OLED透明触摸屏有哪些应用场景

说到77寸OLED透明触摸屏&#xff0c;那可真是市场营销中的一大亮点&#xff0c;应用场景多到数不清&#xff01;我这就给你细数几个热门的&#xff1a; 商业展示&#xff1a;这可是77寸OLED透明触摸屏的拿手好戏&#xff01;在高端零售店铺里&#xff0c;它可以作为陈列窗口&am…

yolov测试各项指标的流程

# yolov测试各项指标的流程: 载入模型, 其中包括类别数等; 按照 batch_size 逐张图片进行预测 得到预测标签: predn 和 实际标签 labelsn, 其中 末尾的 n 表示经过了原图适配的 bbox坐标. predn: {tensor: (3,6)},表示预测到了3个标签, 表示[x1, y1, x2, y2, confidence, clas…

IO重定向

文章目录 IO重定向概念3个标准文件描述符“最低可用文件描述符”原则 默认的连接&#xff1a;tty使用close then open将stdin定向到文件使用open..close..dup..close将stdin定向到文件使用open..dup2..close将stdin重定向到文件课上实验 IO重定向 大多数的程序不接收输出文件名…

Deformable Transformer论文笔记

原文链接 [2010.04159] Deformable DETR: Deformable Transformers for End-to-End Object Detection (arxiv.org)https://arxiv.org/abs/2010.04159 原文笔记 What 作者结合了可变形卷积的稀疏空间采样和 Transformer 的关系建模能力的优点。提出了Deformable Detr Defor…

算法笔记(十三)——BFS 解决最短路问题

文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下&#xff0c;我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目&#xff1a;…

can 总线入门———can简介硬件电路

文章目录 0. 前言1. CAN简介2. 主流通讯协议对比3. CAN 硬件电路4. CAN 电平标准5. CAN 收发器 0. 前言 博客内容来自B站上CAN总线入门教程视频讲解&#xff0c;博客中的插图和内容均为视频中的内容。视频链接 CAN总线入门教程 1. CAN简介 先来看看一它名字的意思&#xff0c…

Redis 缓存策略详解:提升性能的四种常见模式

在现代分布式系统中&#xff0c;缓存是提升性能和减轻数据库负载的关键组件。Redis 作为一种高性能的内存数据库&#xff0c;被广泛应用于缓存层。本文将深入探讨几种常用的 Redis 缓存策略&#xff0c;包括旁路缓存模式&#xff08;Cache-Aside Pattern&#xff09;、读穿透模…

强化学习入门到不想放弃-4

上回的地址&#xff1a;强化学习入门到不想放弃-3 (qq.com) 上上回地址&#xff1a;强化学习入门到不想放弃-2 (qq.com) 上上上回地址&#xff1a;强化学习入门到不想放弃-1 (qq.com) 好久没更新了&#xff0c;也是不知道写啥啊&#xff0c;&#xff08;有些文章刚写了就被有些…

鸽笼原理与递归 - 离散数学系列(四)

目录 1. 鸽笼原理 鸽笼原理的定义 鸽笼原理的示例 鸽笼原理的应用 2. 递归的定义与应用 什么是递归&#xff1f; 递归的示例 递归与迭代的对比 3. 实际应用 鸽笼原理的实际应用 递归的实际应用 4. 例题与练习 例题1&#xff1a;鸽笼原理应用 例题2&#xff1a;递归…

三、Python基础语法(注释、三种波浪线、变量)

一、注释 注释是对代码进行解释说明的文字&#xff0c;不会被解释器执行&#xff0c;可以更方便阅读代码和了解代码的作用。 1.单行注释 使用#开头的文字就是注释&#xff0c;可以使用快捷键Ctrl / 2.多行注释 多行注释就是注释的内容&#xff0c;可以换行书写&#xff0c…

集智书童 | 用于时态动作检测的预测反馈 DETR !

本文来源公众号“集智书童”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;用于时态动作检测的预测反馈 DETR ! 视频中的时间动作检测&#xff08;TAD&#xff09;是现实世界中的一个基本且具有挑战性的任务。得益于 Transformer …

提升 CI/CD 稳定性:Jenkins 开机自检与推送通知

简介&#xff1a;Jenkins 是一个广泛使用的开源自动化服务器&#xff0c;常用于持续集成和持续交付。在某些情况下&#xff0c;服务器重启可能导致 Jenkins 构建任务中断或失败。为了解决这个问题&#xff0c;可以使用一个自检服务&#xff0c;定期检查系统的启动时间&#xff…

3559 pcie配置流程

目录 EP配置 uboot配置 uboot代码修改 内核代码修改 带宽配置 带宽查看 硬件管脚配置 EP配置 uboot配置 1)make CROSS_COMPILE=aarch64-himix100-linux- hi3559av100_emmc_defconfig 2) make menuconfig CROSS_COMPILE=aarch64-himix100-linux- 修改配置: 3) 合入…

一种将RAG、KG、VS、TF结合增强领域LLM性能的框架

SMART-SLIC框架&#xff1a;旨在将RAG结合向量存储&#xff08;Vector Stores&#xff09;、知识图谱&#xff08;Knowledge Graphs&#xff09;和张量分解&#xff08;Tensor Factorization&#xff09;来增强特定领域的大型语言模型&#xff08;LLMs&#xff09;的性能。 SM…

codetop标签动态规划大全C++讲解(二)!!动态规划刷穿地心!!学吐了家人们o(╥﹏╥)o

一篇只有十题左右&#xff0c;写少一点好复习 1.目标和2.分割等和子集3.完全平方数4.比特位计数5.石子游戏6.预测赢家7.不同的二叉搜索树8.解码方法9.鸡蛋掉落10.正则表达式匹配11.通配符匹配12.交错字符串 1.目标和 给你一个非负整数数组 nums 和一个整数 target 。 向数组中…

01-python+selenium自动化测试-基础学习

前言 基于python3和selenium3做自动化测试&#xff0c;俗话说&#xff1a;工欲善其事必先利其器&#xff1b;没有金刚钻就不揽那瓷器活&#xff0c;磨刀不误砍柴工&#xff0c;因此你必须会搭建基本的开发环境&#xff0c;掌握python基本的语法和一个IDE来进行开发&#xff0c…

短剧系统源码短剧平台开发(H5+抖小+微小)部署介绍流程

有想法加入国内短剧赛道的请停下脚步&#xff0c;耐心看完此篇文章&#xff0c;相信一定会对您有所帮助的&#xff0c;下面将排序划分每一个步骤&#xff0c;短剧源码、申请资料、服务器选择、部署上架到正常运行等几个方面&#xff0c;整理了一些资料&#xff0c;来为大家举例…