自动化测试selenium(Java版)

devtools/2025/3/31 10:26:37/

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 );
文章来源:https://blog.csdn.net/weixin_74744611/article/details/146512665
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/devtools/171639.html

相关文章

二分查找(二分答案)套路模板

二分查找&#xff08;二分答案&#xff09;套路模板 二分查找 二分答案 套路模板 | Darlingの妙妙屋 二分查找 红蓝染色法【基础算法精讲 04】_哔哩哔哩_bilibili 文章目录 二分查找&#xff08;二分答案&#xff09;套路模板提要步骤1.看单调性并找要二分什么2.找二分区间&a…

基于 ffmpeg 实现合并视频

ffmpeg是一个强大的多媒体处理工具&#xff0c;支持视频文件的合并。 列出目录下所有MP4文件 import os import glob# 当前目录 directory os.getcwd() directory "/directory/to/mp4/*"# 列出目录下所有MP4文件 files glob.glob(directory)# 排序 files.sort(…

【区块链 + 文化版权】基于区块链的艺术作品版权登记与交易平台 | FISCO BCOS 应用案例

北京奕江科技与信阳艺术职业学院合作&#xff0c; 实施产教融合&#xff0c; 利用区块链技术为艺术作品版权保护与交易打造新平台。平台通过区块链的分布式、透明性和不可篡改性&#xff0c; 为艺术作品的创作、注册、流通及交易等各个环节提供解决方案&#xff0c; 确保作品确…

数据库DBA认证,选哪个认证合适?

从 Oracle、MySQL 到 云数据库&#xff0c;结合市场认可度、考试难度及职业回报&#xff0c;为你精选高性价比认证。 一、企业级数据库认证&#xff08;传统场景&#xff09; 1. Oracle认证 认证等级考试代码核心内容费用适合人群OCA1Z0-082SQL基础、数据库安装与配置$245零基…

2025年2月-3月后端go开发找工作感悟

整体感悟 目标 找工作首先要有一个目标&#xff0c;这个目标尽可能的明确&#xff0c;比如我要字节、拼多多之类的公司&#xff0c;还是要去百度、滴滴这样的&#xff0c;或者目标是创业公司。但是这个目标是会动态调整的&#xff0c;有可能我们的心态发生了变化&#xff0c;一…

循环队列 bug

1. 题目描述 spfa判断负环 LC 设计循环队列 2. 普通单队列 int q[N]; int hh 0, tt -1; while(hh < tt) // empty {int t q[ hh ]; // push/* do something */q[ tt ] j; // pop }3. 错误的循环队列 int q[N]; int hh 0, tt -1; while(hh ! (tt 1) % N) // 非空 …

【Git 常用指令速查表】

Git 常用指令速查表 Git 常用指令速查表目录1. 初始化仓库2. 提交代码流程3. 分支管理4. 远程仓库操作5. 撤销操作6. 查看状态与日志7. 其他实用指令完整操作示例常用场景速查表 Git 常用指令速查表 目录 初始化仓库提交代码流程分支管理远程仓库操作撤销操作查看状态与日志其…

PyTorch 详细知识点总结

PyTorch 详细知识点总结 1. PyTorch 基础概念 1.1 张量&#xff08;Tensor&#xff09; 张量是PyTorch中的基本数据结构类似于多维数组&#xff0c;支持GPU加速主要操作&#xff1a;import torch# 创建张量 x torch.tensor([1, 2, 3]) y torch.zeros(2, 3) z torch.randn…