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

news2025/2/6 17:45:12

目录

一、浏览器及窗口操作

二、键盘与鼠标操作

三、勾选复选框

四、多层框架/窗口定位

五、操作下拉框

六、上传文件操作

 七、处理弹窗与 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下再定位到click
        webDriver.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!

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

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

相关文章

UE虚幻引擎No Google Play Store Key:No OBB found报错如何处理

UE虚幻引擎No Google Play Store Key&#xff1a;No OBB found报错如何处理&#xff1f; 问题描述&#xff1a; UE成功打包APK并安装过后&#xff0c;启动应用时提示&#xff1a; No Google Play Store KeyNo OBB found and no store key to try to download. Please setone …

吴恩达深度学习——卷积神经网络实例分析

内容来自https://www.bilibili.com/video/BV1FT4y1E74V&#xff0c;仅为本人学习所用。 文章目录 LeNet-5AlexNetVGG-16ResNets残差块 1*1卷积 LeNet-5 输入层&#xff1a;输入为一张尺寸是 32 32 1 32321 32321的图像&#xff0c;其中 32 32 3232 3232是图像的长和宽&…

LabVIEW的智能电源远程监控系统开发

在工业自动化与测试领域&#xff0c;电源设备的精准控制与远程管理是保障系统稳定运行的核心需求。传统电源管理依赖本地手动操作&#xff0c;存在响应滞后、参数调节效率低、无法实时监控等问题。通过集成工业物联网&#xff08;IIoT&#xff09;技术&#xff0c;实现电源设备…

【自动化办公】批量图片PDF自定义指定多个区域识别重命名,批量识别铁路货物运单区域内容改名,基于WPF和飞桨ocr深度学习模型的解决方案

项目背景介绍 铁路货运企业需要对物流单进行长期存档&#xff0c;以便后续查询和审计。不同的物流单可能包含不同的关键信息&#xff0c;通过自定义指定多个区域进行识别重命名&#xff0c;可以使存档的图片文件名具有统一的规范和明确的含义。比如&#xff0c;将包含货物运单…

neo4j-在Linux中安装neo4j

目录 切换jdk 安装neo4j 配置neo4j以便其他电脑可以访问 切换jdk 因为我安装的jdk是1.8版本的&#xff0c;而我安装的neo4j版本为5.15,Neo4j Community 5.15.0 不支持 Java 1.8&#xff0c;它要求 Java 17 或更高版本。 所以我需要升级Java到17 安装 OpenJDK 17 sudo yu…

专业学习|通过案例了解蒙特卡罗模拟实操步骤与含义

一、蒙特卡罗模拟介绍 蒙特卡罗模拟&#xff08;Monte Carlo Simulation&#xff09;是一种基于随机采样的数值计算方法&#xff0c;用于解决具有不确定性或复杂概率分布的问题。其核心思想是通过多次随机抽样来逼近系统的行为或目标函数的真实值&#xff0c;进而对系统进行评估…

数据结构【链栈】

基于 C 实现链表栈&#xff1a;原理、代码与应用 一、引言 栈就是一个容器&#xff0c;可以当场一个盒子&#xff0c;只能一个一个拿&#xff0c;一个一个放&#xff0c;而且是从上面放入。 有序顺序栈操作比较容易【会了链栈之后顺序栈自然明白】&#xff0c;所以我们这里只…

人工智能|本地部署|ollama+chatbox快速Windows10下部署(初级篇)

一、 前言&#xff1a; 其实早一个月我已经使用过deepseek&#xff0c;并且也在自己的机器上通过ollama部署过&#xff0c;但一直没有太多动力&#xff0c;现在感觉还是的记录一下&#xff0c;省的自己给忘掉了 本文只是简单记录一下ollamaopen-webuichatbox部署通过网盘分享…

Android Studio 下载安装教程(2024 更新版),附详细图文

今天&#xff0c;为大家带来的是Android Studio 2024更新版的下载安装教程&#xff0c;包含详细图文步骤。 随着 Android Studio 的不断更新&#xff0c;自从引入 Koala 系列后&#xff0c;其版本号的命名规则也发生了变化。以本次更新为例&#xff0c;版本号为 2024.2.1&#…

6.【BUUCTF】[SUCTF 2019]CheckIn

打开题目页面如下 看样子是一道有关文件上传的题 上传一句话木马 显示&#xff1a;非法后缀&#xff01; 看来.php后缀被过滤了 上传一张带有木马的照片 在文件地址处输入cmd 输入以下代码执行 copy 1.jpg/b4.php/a 5.jpg 最后一行有一句话木马 上传带有木马的图片 但其实…

在线教程丨YOLO系列10年更新11个版本,最新模型在目标检测多项任务中达SOTA

YOLO (You Only Look Once) 是计算机视觉领域中最具影响力的实时目标检测算法之一&#xff0c;以其高精度与高效性深受业界青睐&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像等领域。 该模型最早于 2015 年由华盛顿大学研究生 Joseph Redmon 发布&#xff0c;开创了将目…

FreeRTOS学习 --- 中断管理

什么是中断&#xff1f; 让CPU打断正常运行的程序&#xff0c;转而去处理紧急的事件&#xff08;程序&#xff09;&#xff0c;就叫中断 中断执行机制&#xff0c;可简单概括为三步&#xff1a; 1&#xff0c;中断请求 外设产生中断请求&#xff08;GPIO外部中断、定时器中断…

Docker基础以及单体实战

Docker 一、Docker1.1 Docker组成1.2 Dcoker运行图1.3 名称空间Namepace 1.4 docker、Docker compose、kubermetes 二、Docker安装2.1 在线Docker安装2.2 使用官方通用安装脚本2.3 二进制安装Docker三、Docker基础命令3.1 启动类3.2 镜像类3.3 容器类3.4 网络类3.5 Docker comp…

FFmpeg rtmp推流直播

文章目录 rtmp协议RTMP协议组成RTMP的握手过程RTMP流的创建RTMP消息格式Chunking(Message 分块) rtmp服务器搭建Nginx服务器配置Nginx服务器 librtmp库编译推流 rtmp协议 RTMP&#xff08;Real Time Messaging Protocol&#xff09;是由Adobe公司基于Flash Player播放器对应的…

2025Java面试题超详细整理《微服务篇》

什么是微服务架构&#xff1f; 微服务框架是将某个应用程序开发划分为许多独立小型服务&#xff0c;实现敏捷开发和部署&#xff0c;这些服务一般围绕业务规则进行构建&#xff0c;可以用不同的语言开发&#xff0c;使用不同的数据存储&#xff0c;最终使得每个服务运行在自己…

IIC重难点-2

一、光环境传感器硬件原理图 二、i.MX6ull I2C控制器介绍 1. Inter IC (I2C)提供标准I2C从机和主机的功能。I2C被设计为兼容标准NXP I2C总线协议。 2. I2C是一种双线双向串行总线&#xff0c;它提供了一种简单有效的数据交换方法&#xff0c;最大限度地减少了…

优化数据库结构

MySQL学习大纲 一个好的数据库设计方案对于数据库的性能尝尝会起到事倍功半的效果&#xff0c;合理的数据库结构不仅使数据库占用更小的磁盘空间&#xff0c;而且使查询速度更快。数据库结构的设计需要考虑数据冗余、查询和更新速度、字段的数据类型是否合理等多方面的内容&…

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

51单片机07 串口通信

串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信。单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信。51单片机内部自带UART&#xff08;Universal Asynchronous Recei…

Java进阶——IO 流

文章目录 Java进阶——IO 流 1、File 类的使用 1.1、File 常用构造器1.2、路径分隔符1.3、File 的常用方法 2、IO流原理及流的分类 2.1、IO流原理2.2、流的分类 3、IO流的体系结构4、节点流 4.1、FileReader 读入数据的操作4.2、FileWriter 写出数据的操作4.3、FileReader 和 …