当前位置: 首页 > news >正文

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录

一、浏览器及窗口操作

二、键盘与鼠标操作

三、勾选复选框

四、多层框架/窗口定位

五、操作下拉框

六、上传文件操作

 七、处理弹窗与 alert

八、处理动态元素

九、使用 Selenium 进行网站监控


前言

Selenium 是一款非常强大的 Web 自动化测试工具,能够帮助开发者与测试人员进行浏览器的自动化操作。通过 Selenium,您不仅可以进行传统的自动化测试,还可以实现网站监控、动态元素处理、用户交互等高级功能。本文将详细介绍 Selenium 的一些常见操作,包括浏览器控制、元素交互、截图、文件上传、动态元素等待等,以及如何用 Selenium 实现网站监控。

一、浏览器及窗口操作

Selenium 提供了丰富的 API 进行浏览器的控制和操作,下面是一些常见的浏览器窗口操作:

1.1 打开网页与基本浏览器操作

WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com"); // 打开百度首页
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴"); // 搜索
webDriver.findElement(By.cssSelector("#su")).click(); // 点击搜索

1.2 前进、后退与刷新

webDriver.navigate().back(); // 浏览器后退
webDriver.navigate().refresh(); // 刷新
webDriver.navigate().forward(); // 浏览器前进

1.3 浏览器窗口操作

滚动条操作
((JavascriptExecutor) webDriver).executeScript("document.documentElement.scrollTop=10000"); // 向下滚动页面
最大化与全屏
webDriver.manage().window().maximize(); // 最大化浏览器
webDriver.manage().window().fullscreen(); // 全屏浏览器
设置窗口大小与位置
webDriver.manage().window().setSize(new Dimension(800, 600)); // 设置窗口大小
Dimension size = webDriver.manage().window().getSize(); // 获取窗口大小
webDriver.manage().window().setPosition(new Point(100, 100)); // 设置窗口位置
Point position = webDriver.manage().window().getPosition(); // 获取窗口位置

1.2 浏览器截图操作

需要导入依赖包,如Commons IO,进行截图操作

<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.8.0</version>
</dependency>
private static void takeScreenshot() throws IOException {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#kw")).sendKeys("软件测试");webDriver.findElement(By.cssSelector("#su")).click();sleep(3000);// 截图并保存File file = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(file, new File("d://测试.png"));
}

 

二、键盘与鼠标操作

Selenium 提供了 Actions 类来模拟鼠标操作和 Keys 类来模拟键盘操作。包括文本输入、按键和组合键序列,增强自动化脚本的用户交互能力

2.1键盘操作:

通过sendKeys()调用

单个使用:

  1. sendKeys(Keys.TAB) # TAB
  2. sendKeys(Keys.ENTER) # 回车
  3. sendKeys(Keys.SPACE) #空格键
  4. sendKeys(Keys.ESCAPE) #回退键(Esc)

组合使用:

  1. sendKeys(Keys.CONTROL,‘a’) #全选(Ctrl+A)
  2. sendKeys(Keys.CONTROL,‘c’) #复制(Ctrl+C)
  3. sendKeys(Keys.CONTROL,‘x’) #剪贴(Ctrl+X)
  4. sendKeys(Keys.CONTROL,‘v’) #粘贴(Ctrl+V)
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
webDriver.findElement(By.cssSelector("#kw")).sendKeys("迪丽热巴");// 组合键操作
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "A"); // 全选
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "X"); // 剪切
webDriver.findElement(By.cssSelector("#kw")).sendKeys(Keys.CONTROL, "V"); // 粘贴

2.2 鼠标操作

通过ActionChains 类实现鼠标执行的操作:

  1. contextClick()      右击
  2. doubleClick()       双击
  3. dragAndDrop()    拖动
  4. moveToElement() 移动
  5. selenium不能模拟鼠标滚轮操作
WebDriver webDriver = new ChromeDriver();
webDriver.get("https://www.baidu.com");
WebElement element = webDriver.findElement(By.cssSelector("#kw"));// 鼠标右击
Actions actions = new Actions(webDriver);
actions.moveToElement(element).contextClick().perform();  // 右键点击

三、勾选复选框

  • 选中一组type为checkbox的数据
private static void selectCheckboxes() {WebDriver webDriver = new ChromeDriver();webDriver.get("http://localhost:63342/Test/src/main/page/teste01.html");List<WebElement> elements = webDriver.findElements(By.cssSelector("input"));for (WebElement element : elements) {if ("checkbox".equals(element.getAttribute("type"))) {element.click();  // 勾选复选框}}
}

四、多层框架/窗口定位

     对于一个web 应用,经常会出现框架(iframe) 或窗口(window)的应用,对于这种应用我们在定位元素时就不能直接右击copy他的xpath或者是cssselector来定位;而是要通过switchTo()方法定位到frame下或者window下,然后再通过元素css选择器或者xpath定位。

例如:

 private static void page02() {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 打开网页webDriver.get("http://localhost:63342/Test/src/main/page/test02.html?_ijt=ukda3p0a62ntrthar4gi039p32&_ij_reload=RELOAD_ON_SAVE");// 若是iframe应用,需要先定位到frame下再定位到clickwebDriver.switchTo().frame("f1");webDriver.findElement(By.cssSelector("body > div > div > a")).click();// 若目标元素不在iframe,可以直接获取
//        String h3_text = webDriver.findElement(By.cssSelector("body > div > div > h3")).getText();
//        System.out.println(h3_text);}

4.1 iframe

private static void switchToIframe() {WebDriver webDriver = new ChromeDriver();webDriver.get("http://localhost:63342/Test/src/main/page/test02.html");webDriver.switchTo().frame("f1");webDriver.findElement(By.cssSelector("body > div > div > a")).click();
}

4.2 窗口

private static void switchWindow() {WebDriver webDriver = new ChromeDriver();webDriver.get("https://www.baidu.com/");webDriver.findElement(By.cssSelector("#s-top-left > a:nth-child(1)")).click();// 获取所有窗口句柄并切换Set<String> handles = webDriver.getWindowHandles();String targetHandle = handles.iterator().next();webDriver.switchTo().window(targetHandle);webDriver.findElement(By.cssSelector("#ww")).sendKeys("新闻联播");webDriver.findElement(By.cssSelector("#s_btn_wr")).click();
}

五、操作下拉框

下拉框里的内容需要进行两次定位:

  1. 定位到下拉框本身,进行操作;
  2. 定位到下拉框内的选项。
private static void page03() {// 创建浏览器驱动WebDriver webDriver = new ChromeDriver();// 打开网页webDriver.get("http://url地址");// 操作下拉框Select select = new Select(webDriver.findElement(By.cssSelector("#ShippingMethod")));// select.selectByValue("12.51"); // 可按值选择select.selectByIndex(2); // 按索引选择
}

六、上传文件操作

在 Selenium WebDriver 中,只需定位上传按钮,通过 sendKeys 方法添加本地文件路径即可。
可以使用绝对路径或相对路径,前提是上传的文件存在。

private static void page05() {WebDriver webDriver = new ChromeDriver();webDriver.get("http://url地址");// 找到上传按钮(input元素),并输入本地文件路径webDriver.findElement(By.cssSelector("input")).sendKeys("C:\\Users\\34085\\Desktop\\hello.txt");
}

 七、处理弹窗与 alert

使用 Alert 类处理浏览器弹窗。

private static void handleAlert() {WebDriver webDriver = new ChromeDriver();webDriver.get("http://url地址");webDriver.findElement(By.cssSelector("button")).click();// 处理 alert 弹窗webDriver.switchTo().alert().accept(); // 点击确认webDriver.switchTo().alert().dismiss(); // 点击取消webDriver.switchTo().alert().sendKeys("你好"); // 输入文本webDriver.switchTo().alert().accept(); // 确认
}

八、处理动态元素

动态元素通常在页面加载后通过 JavaScript 动态生成。可以通过显式等待和隐式等待来处理动态元素。

1. 使用 WebDriverWait 和 ExpectedConditions

动态元素可以使用 WebDriverWaitExpectedConditions 来等待元素在页面上可见或可点击。

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("dynamicElement")));
2. 根据部分属性值定位

如果元素的 ID 或 class 是动态生成的,可以使用 XPath 中的 contains()starts-with()ends-with() 函数来定位。

// 匹配包含 "auto-id" 的 ID 元素
driver.findElement(By.xpath("//div[contains(@id, 'auto-id')]"));
3. 根据相对关系定位

如果动态元素与其父节点、子节点或兄弟节点有固定的相对关系,可以通过这些关系来定位动态元素。

4. 根据 DOM 顺序索引定位

可以通过元素在 DOM 中的顺序索引来定位该元素。但这种方法可能不够稳定,建议尽量使用其他方法。

5. 使用 CSS 选择器

CSS 选择器提供了一种灵活的方式来定位元素,特别是当元素的 ID 或 class 是动态生成时。例如,可以通过 CSS 属性选择器定位元素。

driver.findElement(By.cssSelector("input[type='text']"));
6. 结合使用多种定位方法

在某些情况下,结合使用多种定位方法可以提高准确性和成功率。例如,可以先通过 CSS 选择器定位父元素,再通过相对路径定位子元素。

7. 优化等待时间

动态元素的加载可能需要一些时间,因此合理设置等待时间对于提高脚本稳定性至关重要。避免使用硬编码的等待时间(如 Thread.sleep),而应使用 WebDriverWait 来动态等待元素加载完成。

 

九、使用 Selenium 进行网站监控

9.1 监听网页内容变化

public class PriceWatcher {public static void main(String[] args) throws InterruptedException {System.setProperty("webdriver.chrome.driver", "chromedriver的地址");WebDriver driver = new ChromeDriver();driver.get("http://url地址");String previousPrice = "";while (true) {WebElement priceElement = driver.findElement(By.id("price"));String currentPrice = priceElement.getText();if (!currentPrice.equals(previousPrice)) {System.out.println("价格变动: " + currentPrice);previousPrice = currentPrice;}Thread.sleep(5000); // 每5秒检查一次}}
}

9.2 监控网络请求

public class MonitorHttpRequests {public static void main(String[] args) {BrowserMobProxy proxy = new BrowserMobProxyServer();proxy.start(0);Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);ChromeOptions options = new ChromeOptions();options.setProxy(seleniumProxy);WebDriver driver = new ChromeDriver(options);proxy.newHar("myHar");driver.get("http://url地址");List<HarEntry> entries = proxy.getHar().getLog().getEntries();for (HarEntry entry : entries) {System.out.println("请求网址: " + entry.getRequest().getUrl());System.out.println("响应状态: " + entry.getResponse().getStatus());}driver.quit();proxy.stop();}
}

总结

        Selenium 是一个非常强大的自动化测试工具,除了传统的自动化测试应用,它还可以用于浏览器操作、动态元素处理、表单交互等多个场景。结合合理的等待机制、弹窗处理和网站监控等功能,Selenium 不仅可以帮助开发人员进行高效的测试,还能在实际应用中解决更多问题。

希望本文的分享能帮助您更好地理解和应用 Selenium!

相关文章:

Selenium 浏览器操作与使用技巧——详细解析(Java版)

目录 一、浏览器及窗口操作 二、键盘与鼠标操作 三、勾选复选框 四、多层框架/窗口定位 五、操作下拉框 六、上传文件操作 七、处理弹窗与 alert 八、处理动态元素 九、使用 Selenium 进行网站监控 前言 Selenium 是一款非常强大的 Web 自动化测试工具&#xff0c;能够…...

ioDraw桌面版 v3.4.0发布!AI文生图,AI图生图,手绘风格一键转换!

流程图功能升级 AI 文生图&#xff1a; 用户现在能输入文字描述&#xff0c;让软件自动生成对应的流程图画面&#xff0c;减少了手动绘图的工作量&#xff0c;提高创作效率&#xff0c;比如输入 “项目开发流程”&#xff0c;软件可能就会生成包含需求分析、设计、开发、测试…...

深入理解Node.js_架构与最佳实践

1. 引言 1.1 什么是Node.js Node.js简介:Node.js是一个基于Chrome V8引擎的JavaScript运行时,用于构建快速、可扩展的网络应用。Node.js的历史背景和发展:Node.js最初由Ryan Dahl在2009年发布,旨在解决I/O密集型应用的性能问题。随着时间的推移,Node.js社区不断壮大,提供…...

安装和卸载RabbitMQ

我的飞书:https://rvg7rs2jk1g.feishu.cn/docx/SUWXdDb0UoCV86xP6b3c7qtMn6b 使用Ubuntu环境进行安装 一、安装Erlang 在安装RabbitMQ之前,我们需要先安装Erlang,RabbitMQ需要Erlang的语言支持 #安装Erlang sudo apt-get install erlang 在安装的过程中,会弹出一段信息,此…...

第27节课:安全审计与防御—构建坚固的网络安全防线

目录 安全审计工具与流程安全审计工具NessusNmapBurp Suite 安全审计流程规划与准备信息收集漏洞扫描分析与评估报告与建议 安全防御策略网络层防御应用层防御数据层防御安全管理 结语 在当今数字化时代&#xff0c;网络安全已成为企业和个人不可忽视的重要议题。随着网络攻击手…...

【蓝桥杯】日志统计

日志统计&#xff08;编程题&#xff09;https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53https://dashoj.com/d/lqbproblem/p/53 题目 日志统计(编程题) 讲解 这个讲解感觉比较通俗易懂。 蓝桥杯2018年省赛B组08&#xff08;c/c&#xff09;日…...

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…...

基于单片机的智能安全插座(论文+源码)

1 系统整体方案设计 本课题基于单片机的智能安全插座设计&#xff0c;以STM32嵌入式单片机为主体&#xff0c;将计算机技术和检测技术有机结合&#xff0c;设计一款电量参数采集装置&#xff0c;实现电压、电流信号的数据采集任务&#xff0c;电压、电流和功率在上位机的显示任…...

2025年人工智能技术:Prompt与Agent的发展趋势与机遇

文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…...

vue2-v-if和v-for的优先级

vue2-v-if和v-for的优先级 1.v-if和v-for的作用 v-if是条件渲染&#xff0c;只有条件表达式true的情况下&#xff0c;才会渲染v-for是基于一个数组来渲染一个列表&#xff0c;在v-for的时候&#xff0c;保证给每个元素添加独一无二的key值&#xff0c;便于diff算法进行优化 …...

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数&#xff08;C11起&#xff09;默认移动赋值运算符&#xff08;C11起&#xff09;取地址及const取地址操作符重载取地址操作符重…...

基于springboot校园点歌系统

基于Spring Boot的校园点歌系统是一种专为校园场景设计的音乐点播平台&#xff0c;它能够丰富学生的校园生活&#xff0c;提升学生的娱乐体验。以下是对该系统的详细介绍&#xff1a; 一、系统背景与意义 在校园环境中&#xff0c;学生们对于音乐有着浓厚的兴趣&#xff0c;传…...

pycharm 中的 Mark Directory As 的作用是什么?

文章目录 Mark Directory As 的作用PYTHONPATH 是什么PYTHONPATH 作用注意事项 Mark Directory As 的作用 可以查看官网&#xff1a;https://www.jetbrains.com/help/pycharm/project-structure-dialog.html#-9p9rve_3 我们这里以 Mark Directory As Sources 为例进行介绍。 这…...

【Elasticsearch】文本分类聚合Categorize Text Aggregation

响应参数讲解: key &#xff08;字符串&#xff09;由 categorization_analyzer 提取的标记组成&#xff0c;这些标记是类别中所有输入字段值的共同部分。 doc_count &#xff08;整数&#xff09;与类别匹配的文档数量。 max_matching_length &#xff08;整数&#xff09;从…...

算法随笔_40: 爬楼梯

上一篇:算法随笔_39: 最多能完成排序的块_方法2-CSDN博客 题目描述如下: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a;n 2 输出&#xff1a;2 解释&am…...

【Linux探索学习】第二十七弹——信号(一):Linux 信号基础详解

Linux学习笔记&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我们已经将进程通信部分讲完了&#xff0c;现在我们来讲一个进程部分也非常重要的知识点——信号&#xff0c;信号也是进程间通信的一…...

【数学】矩阵、向量(内含矩阵乘法C++)

目录 一、前置知识&#xff1a;向量&#xff08;一列或一行的矩阵&#xff09;、矩阵1. 行向量2. 列向量3. 向量其余基本概念4. 矩阵基本概念5. 关于它们的细节 二、运算1. 转置&#xff08;1&#xff09;定义&#xff08;2&#xff09;性质 2. 矩阵&#xff08;向量&#xff0…...

设置git区分大小写

设置git区分大小写 1.全局设置 (影响全部仓库): git config --global core.ignorecase false2.仓库级别设置 (影响当前仓库): git config core.ignorecase false3.已经提交了大小写不一致的文件处理: git mv -f OldName newName # 强制重命名 git commit -m "Fix cas…...

排序算法与查找算法

1.十大经典排序算法 我们希望数据以一种有序的形式组织起来&#xff0c;无序的数据我们要尽量将其变得有序 一般说来有10种比较经典的排序算法 简单记忆为Miss D----D小姐 时间复杂度 &#xff1a;红色<绿色<蓝色 空间复杂度&#xff1a;圆越大越占空间 稳定性&…...

Github 2025-01-31Java开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-31统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10C项目1Kotlin项目1Bazel:快速、可扩展的多语言构建系统 创建周期:3564 天开发语言:Java协议类型:Apache License 2.0Star数量:2…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Vue记事本应用实现教程

文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展&#xff1a;显示创建时间8. 功能扩展&#xff1a;记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...

根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:

根据万维钢精英日课6的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

淘宝扭蛋机小程序系统开发:打造互动性强的购物平台

淘宝扭蛋机小程序系统的开发&#xff0c;旨在打造一个互动性强的购物平台&#xff0c;让用户在购物的同时&#xff0c;能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机&#xff0c;实现旋转、抽拉等动作&#xff0c;增…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...