自动化测试selenium(Java版)

1.准备工作

1.1.下载浏览器

自动化测试首先我们要准备一个浏览器,我们这里使用谷歌(chrome)浏览器.

1.2.安装驱动管理

每一个浏览器都是靠浏览器驱动程序来启动,但是浏览器的版本更新非常快,可能我们今天测试的是一个版本,第二天发布了一个新的版本,那么我们就要重构代码,很不方便.于是selenium帮我们生成了驱动管理依赖,只要引入依赖.就不要我们手动的去处理浏览器版本的问题,只需要我们在pom.xml文件中引入依赖,每次使用都会帮助我们下载新的驱动

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

此外我们还要引入selenium依赖

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


1.3创建项目

创建一个maven项目

引入相关依赖

到此准备工作就完成了


2. 编写自动化脚本

2.1 创建文件

对于代码的测试我们一般都是在test目录下创建,也可以在main方法中创建,但是一般规范都是让我们在test中创建,FirstTest用来编写我们的自动化脚本,run是执行我们的脚本

 2.2 编写代码

2.2.1 使用代码下载对应的浏览器驱动

 //自动下载与当前系统和浏览器版本匹配的驱动程序WebDriverManager.chromedriver().setup();

2.2.2  浏览器访问限制处理

//访问限制处理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");

2.2.3 生成一个浏览器对象完成初始访问

//生成一个浏览器对象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();

整体代码:

public void test(){//自动下载与当前系统和浏览器版本匹配的驱动程序WebDriverManager.chromedriver().setup();//访问限制处理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一个浏览器对象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.quit();}

当我们完成一次操作之后要关闭driver对象.[driver.quit();]

这样我们就完成了一次简单的简单的测试用例


3.自动化常用方法

我们先把下载驱动,创建一个浏览器对象,解除浏览器限制封装成一个方法,这样就减少了代码的冗余

public void createDriver() throws InterruptedException {//自动下载与当前系统和浏览器版本匹配的驱动程序WebDriverManager.chromedriver().setup();//访问限制处理ChromeOptions options=new ChromeOptions();options.addArguments("--remote-allow-origins=*");//生成一个浏览器对象WebDriver driver=new ChromeDriver(options);driver.get("https://www.baidu.com/");}

3.1 元素的定位

一般定位一个元素我们一般使用cssSelector和Xpath.

获取web元素按照上述操作定位元素位置之后,右键可以复制 Selector和Xpath

3.1.1 cssSelector

public void test01(){createDriver();//找到搜索框之后,输入搜索关键字鞠婧祎driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");//点击按钮,也就是"百度一下".click(点击操作)driver.findElement(By.cssSelector("#su")).click();driver.quit();}

findeElement:用于定位某个元素

By.cssSelector 使用 CSS 选择器语法来定位 HTML 元素.

"#kw" 表示通过 id 属性为 kw 的元素进行定位.(百度的搜索框元素id为kw)

sendKeys:用于向指定的页面元素发送按键(输入文本或模拟键盘操作)

click:用于模拟用户点击页面上的某个元素

driver.quit():关闭由 WebDriver 打开的所有浏览器窗口,并终止与浏览器的会话连接。


3.1.2 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] 定位到第三个百度热搜标签
//使用Xpath定位public void test02() {createDriver();driver.findElement(By.xpath("//*[@id=\"kw\"]")).sendKeys("鞠婧祎");driver.findElement(By.xpath("//*[@id=\"su\"]")).click();driver.quit();}


3.2 操作测试对象

3.2.1 click

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

 3.2.2 sendKeys("")

driver.findElement(By.cssSelector("#kw")).sendKeys("输⼊⽂字");

3.2.3清除⽂本内容(clear)

将一开始输入的鞠婧祎删除后紧接着搜索章若楠

如果不使用clear(),我们搜索的词条就是"鞠婧祎章若楠"

public void test03() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("鞠婧祎");driver.findElement(By.cssSelector("#su")).click();driver.findElement(By.cssSelector("#kw")).clear();driver.findElement(By.cssSelector("#kw")).sendKeys("章若楠");Thread.sleep(3000);driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.quit();}


3.2.4 获取文本信息(getText())

 public void test04() {createDriver();String text = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(1) > a")).getText();System.out.println(text);driver.quit();}

 


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

//获取标题或urlpublic void test05() {createDriver();String title = driver.getTitle();String currentUrl = driver.getCurrentUrl();System.out.println(title);System.out.println(currentUrl);driver.quit();}


3.2.6窗口

句柄:每个浏览器窗口或标签页都有一个唯一的标识符(字符串形式),称为窗口句柄 

3.2.6.1 获取百度首页句柄以及新闻页面句柄
public void test06() {createDriver();//进入新闻页面driver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();//获取百度首页句柄String curHandle = driver.getWindowHandle();System.out.println(curHandle);System.out.println("========================");//获取所有句柄Set<String> windowHandles = driver.getWindowHandles();for (String handle:windowHandles){System.out.println(handle);}driver.quit();}

3.2.6.2 切换句柄

当前driver对象指向的是百度首页的句柄,我们要使用新闻页的元素,就要切换窗口,让driver指向新闻页

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

3.3 屏幕截图

有时为了观察我们测试结果,需要保存图片,于是selenium帮我们生成了截图

void getScreenShot(String str) throws IOException {//     ./src/test/image///                     /2024-07-17///                                /test01-174530.png//                                /test02-174530.png//                     /2024-07-18///                                /test01-174530.png//                                /test02-174530.pngSimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//./src/test/image/2024-07-17/test01-174530.pngString filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";System.out.println("filename:"+filename);File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcFile,new File(filename));}

SimpleDateFormat sim1:该行代码创建了一个日期格式化对象 sim1,用于将时间戳格式化为“年-月-日”的字符串形式


3.4 关闭窗口

//表示关闭当前标签页
driver.close();
//断开连接,关闭driver对象
driver.quit();

3.5 等待

3.5.1 强制等待

Thread.sleep();

优点:代码简单

缺点:影响运行效率,浪费大量时间

3.5.2 隐式等待

隐式等待是⼀种智能等待,他可以规定在查找元素时,在指定时间内不断查找元素。如果找到则代码继续执⾏,直到超时没找到元素才会报错。
 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
隐式等待 作⽤域 是整个脚本的所有元素。即只要driver对象没有被释放掉(driver.quit()),隐式等待就⼀直⽣效(全局生效).
但是隐式等待也有缺点,他只能查找元素是否存在,而不管元素对不对.而且只能查找元素
就像下方代码:
//等待机制的隐式等待//隐式等待只是查找元素,并不关注元素结果对不对,只要是有结果,就继续执行public void test13() throws InterruptedException {createDriver();driver.findElement(By.cssSelector("#kw")).sendKeys("邓紫棋");driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));//隐式等待,查找后发现有"#kw",所以不管.clear是否执行完成,就继续查找下一个元素是否存在driver.findElement(By.cssSelector("#kw")).clear();//隐式等待,查找后发现有"#kw",所以不管.sendKeys是否执行完成,就继续查找下一个元素是否存在driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");//隐式等待,查找后发现有"#su",所以不管.click是否执行完成,就继续查找下一个元素是否存在driver.findElement(By.cssSelector("#su")).click();Thread.sleep(3000);//如果我们不强制等待上述的三个指令执行完成的话,那么迪丽热巴这个词条可能还没完成输入(sendKeys("迪丽热巴");),点击查询按钮(.click();),隐式等待就已经查询完毕了//此时迪丽热巴词条还没有进行搜索,就结束,所以还是会返回邓紫棋//Thread.sleep(3000);就是为了等待 driver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");// driver.findElement(By.cssSelector("#su")).click();执行完毕,更新#\31  > div > div > div > div > div > div.header值为迪丽热巴WebElement ele=driver.findElement(By.cssSelector("#\\31  > div > div > div > div > div > div.header-wrapper_3m6nI > div.cos-row.row-text_1L24W.row_4WY55 > div > div > div.cos-flex.cos-items-center > div.title-wrapper_XLSiK > a > div > p > span > span"));System.out.println(ele.getText());driver.quit();

3.5.3 显式等待

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

elementToBeClickable:等待直到指定的元素在页面上可见并且可以被点击

 WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(3));wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#id")));

  等待某个元素的文本内容为 "预期文本"(就是看括号内文本在不在前端页面中)

wait.until(ExpectedConditions.textToBe());

presenceOfElementLocated(By locator) 是 ExpectedConditions 类中的一个方法,用于显式等待某个元素出现在页面的 DOM 中。这个方法并不保证元素是可见的或可交互的,只是确保元素已经存在于页面的 DOM 结构中
 wait.until(ExpectedConditions.presenceOfElementLocated())

检查当前⻚⾯的 URL 是⼀个特定的 URL
urlToBe(java.lang.String url)

3.6浏览器导航

//后退
driver.navigate().back();
//前进
driver.navigate().forward();
//刷新
driver.navigate().refresh();

打开网站:

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

3.7 弹窗

弹窗不属于web页面元素,所以就没办法定位元素,这里就要使用Alert类

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

3.8 文件上传

点击⽂件上传的场景下会弹窗系统窗⼝,进⾏⽂件的选择。
selenium⽆法识别⾮web的控件,上传⽂件窗⼝为系统⾃带,⽆法识别窗⼝元素
但是可以使⽤sendkeys来上传指定路径的⽂件,达到的效果是⼀样的
WebElement ele = driver.findElement(By.cssSelector("body > div > div > 
input[type=file]"));
//输入文件本地存储的路径即可
ele.sendKeys("D:\\selenium2html\\selenium2html\\upload.html");

3.9 浏览器参数设置

1)"无头模式",指的是执行自动化的时候不会打开网页

options.addArguments("-headless");
2)设置浏览器加载策略
options.setPageLoadStrategy(PageLoadStrategy. NONE );

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

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

相关文章

HarmonyOS Next应用架构设计与模块化开发详解

引言 在HarmonyOS Next开发中&#xff0c;合理的应用架构设计和模块化开发是构建高效、可维护应用的关键。本文将深入探讨HarmonyOS Next应用的架构设计思路&#xff0c;并通过实际代码示例展示如何实现模块化开发。 应用架构设计 HarmonyOS Next应用通常采用分层架构设计&…

伊利工业旅游4.0,近距离感受高品质的魅力

3月24日&#xff0c;在2025年第112届全国糖酒会&#xff08;简称春糖&#xff09;前夕&#xff0c;伊利集团“可感知高品质探寻荟”活动在成都召开&#xff0c;记者走进伊利在西南地区最大的乳制品生产基地—邛崃工厂&#xff0c;零距离见证液态奶、酸奶、冷饮等乳制品的诞生&a…

测试用例生成平台通过大模型升级查询功能,生成智能测试用例

在测试工作中&#xff0c;查询功能是各类系统的核心模块&#xff0c;传统的测试用例编写往往耗时且重复。如何让老旧平台焕发新活力&#xff1f;本文将结合大模型技术&#xff0c;通过用户输入的字段信息&#xff0c;自动化生成高效、精准的测试用例。同时&#xff0c;我们还将…

基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

背景前摇&原视频教程&#xff1a; 最近看到很多同学都在用Coze平台操作数据&#xff0c;我也想了解一下工作流的搭建和数据处理过程&#xff0c;但是一下子又看不懂太复杂的逻辑&#xff0c;于是上B站搜索相关的基础教程。 Coze官方教程&#xff1a; 之前有看过Coze平台…

【Axure高保真原型】纵向图片轮播

今天和大家分享纵向图片轮播的原型模版&#xff0c;载入后会自动循环轮播&#xff0c;鼠标移入图片后停止轮播&#xff0c;可以通过点击上下箭头&#xff0c;向上或向下滑动切换上一张或下一张图片&#xff0c;也可以点击右侧小圆点快速切换至对应图片……具体效果可以打开下方…

力扣32.最长有效括号(栈)

32. 最长有效括号 - 力扣&#xff08;LeetCode&#xff09; 代码区&#xff1a; #include<stack> #include<string> /*最长有效*/ class Solution { public:int longestValidParentheses(string s) {stack<int> st;int ans0;int ns.length();st.push(-1);fo…

如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?

大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载&#xff1f; 在 React 项目里&#xff0c;有时候组件功能多、体积大&#xff0c;要是一次性把所有组件都加载进来&#xff0c;网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…

ffmpeg-将多个视频切片成一个新的视频

使用 ffmpeg 工具可以轻松完成将多个视频切片合并为一个新的视频。以下是实现这一目标的具体步骤和命令。 步骤概览 1、将多个视频切片。 2、创建文本文件列出切片的视频片段。 3、使用 ffmpeg 合并这些切片为一个新的视频。 一&#xff1a;安装 ffmpeg 确保你的系统中已经安…

【第2月_day10】Pandas数据查看与选择

以下是专为小白设计的 Pandas数据查看与选择 学习内容&#xff0c;从基础到应用逐步讲解&#xff0c;附带清晰示例和注意事项&#xff1a; 一、数据查看&#xff1a;快速了解你的数据 1. head() 和 tail() 作用&#xff1a;查看数据的前几行或后几行&#xff0c;默认显示5行。…

Jetpack LiveData 使用与原理解析

一、引言 在 Android 开发中&#xff0c;数据的变化需要及时反映到界面上是一个常见的需求。然而&#xff0c;传统的方式可能会导致代码复杂、难以维护&#xff0c;并且容易出现内存泄漏等问题。Jetpack 组件中的 LiveData 为我们提供了一种优雅的解决方案&#xff0c;它是一种…

Unity2D 五子棋 + Photon联网双人对战

开发环境配置 Unity版本2022.3 创建Photon账号以及申请Photon中国区服务 官网申请账号&#xff1a;Multiplayer Game Development Made Easy Photon Engine 中国区服务&#xff1a; 光子引擎photonengine中文站 成都动联无限科技有限公司(vibrantlink.com) 导入PUN2插件以及…

(UI自动化测试web端)第二篇:元素定位的方法_css定位之属性选择器

看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写&#xff1f; 文章介绍了第四种写法属性选择器 &#xff0c;你要根据网页中的实际情况来判断自己到底要用哪一种方法来进行元素定位。每种方法都要多练习&#xff0c;全都熟了之后你在工作当中使用起来元素定…

预编译能否 100%防 sql 注入?

&#x1f31f; 什么是 SQL 注入&#xff1f; SQL 注入&#xff08;SQL Injection&#xff09;是指攻击者利用特殊输入&#xff0c;让数据库执行它本来不应该执行的代码&#xff0c;从而获取或篡改数据。 就像在考试的时候偷偷改题目&#xff0c;让老师改成你想要的内容&#…

第十五章 | Layer2、Rollup 与 ZK 技术实战解析

&#x1f4da; 第十五章 | Layer2、Rollup 与 ZK 技术实战解析 ——构建下一代高性能区块链应用&#xff0c;从 Solidity 到 zkSync&#xff01; ✅ 本章导读 Layer2 和零知识证明&#xff08;ZK&#xff09;正成为区块链发展的核心方向。 随着主网 Gas 居高不下、TPS 无法满…

2025-03-26 学习记录--C/C++-PTA 6-3 求链式表的表长

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 6-3 求链式表的表长 本题要求实现一个函数&#xff0c;求链式表的表长。 函数接口定义&#xff1a; &…

【Linux】Linux_Ubuntu与Windows之间的文件传输

一、Linux终端命令的复制粘贴 1.打开linux 终端&#xff0c;输入以下命令&#xff1a;&#xff08;注意&#xff0c;需要联网&#xff09; 2.命令行下载&#xff1a; sudo apt-get autoremove open-vm-tools 3.命令行安装&#xff1a; sudo apt-get install open-vm-tools-…

Python Sanic面试题及参考答案

目录 Sanic 的事件循环机制与 uvloop 的关系 Sanic 的 Request/Response 对象生命周期如何管理?如何访问请求上下文? 对比 Sanic 与 Flask/Django 的异步处理模型差异 Sanic 的 Blueprint 机制如何实现模块化路由?如何处理跨蓝图中间件? 如何在 Sanic 中实现 WebSocket…

算法每日一练 (18)

&#x1f4a2;欢迎来到张翊尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 算法每日一练 (18)删除并获得点数题目描述解题思路解题…

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示

VsCode启用右括号自动跳过(自动重写) - 自录制gif演示 前言 不知道大家在编程时候的按键习惯是怎样的。输入完左括号后编辑器一般会自动补全右括号&#xff0c;输入完左括号的内容后&#xff0c;是按→跳过右括号还是按)跳过右括号呢&#xff1f; for (int i 0; i < a.s…