WebDriverManager自动管理浏览器Driver包

news2025/7/20 9:35:16
WebDriverManager是什么?

WebDriverManager是一个开源 Java 库,它以全自动方式管理(即下载、设置和维护) Selenium WebDriver所需的驱动程序(例如,chromedriver、geckodriver、msededriver 等)。此外,WebDriverManager 还提供了其他相关功能,例如发现本地系统中安装的浏览器、构建 WebDriver 对象(如ChromeDriver、FirefoxDriver、EdgeDriver等)以及在 Docker 容器中无缝运行浏览器的能力。
正如上面所说的WebDriverManager有很多功能,今天主要分享自动管理Selenium WebDriver所需的驱动程序的功能。由于我们公司会强制浏览器升级,所以不得不重新下载对应版本的 WebDriver。使用WebDriverManager后只要浏览器升级了,也会自动下载对应版本的Web Driver版本。

WebDriverManager源码地址:GitHub地址
如何使用WebDriverManager

如果你的项目是使用maven创建的,只需要在pom文件中加上下面的依赖包

        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.3.1</version>
            <scope>compile</scope>
        </dependency>

添加好依赖以后就可以在项目中使用了,以后就可以告别手动更新webDriver了。

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

import io.github.bonigarcia.wdm.WebDriverManager;

class ChromeCreateTest {

    WebDriver driver;

    @BeforeEach
    void setup() {
        driver = WebDriverManager.chromedriver().create();
        driver.get("https://www.baidu.com/");
        driver.findElement(By.id("su")).click();
    }

    @AfterEach
    void teardown() {
        driver.quit();
    }

    @Test
    void test() {
        // Your test logic here
    }

}

获取下载的webDriver路径和版本

WebDriverManager webDriverManager = WebDriverManager.chromedriver().setup();
webDriverManager.getDownloadedDriverPath();
webDriverManager.getDownloadedDriverVersion()

截取部分方法名称和描述,更多说明可以移步官方文档
在这里插入图片描述
最后分享一个web自动化屏幕录制功能。

//tag::snippet-in-doc[]
import static java.lang.invoke.MethodHandles.lookup;
import static org.slf4j.LoggerFactory.getLogger;
import static org.testng.Assert.fail;

import java.io.File;
import java.time.Duration;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.slf4j.Logger;

import io.github.bonigarcia.wdm.WebDriverManager;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class RecordChromeTest {

    static final Logger log = getLogger(lookup().lookupClass());

    static final int REC_TIMEOUT_SEC = 10;
    static final int POLL_TIME_MSEC = 100;
    static final String REC_FILENAME = "myRecordingChrome";
    static final String REC_EXT = ".webm";

    WebDriver driver;
    File targetFolder;
    WebDriverManager wdm = WebDriverManager.chromedriver().watch();

    @BeforeClass
    void setup() {
        driver = wdm.create();
        targetFolder = new File(System.getProperty("user.home"), "Downloads");
    }

    @AfterClass
    void teardown() {
        driver.quit();
    }

    @Test
    public void test() throws InterruptedException {
        driver.get(
                "https://bonigarcia.dev/selenium-webdriver-java/slow-calculator.html");

        wdm.startRecording(REC_FILENAME);

        // 1 + 3
        driver.findElement(By.xpath("//span[text()='1']")).click();
        driver.findElement(By.xpath("//span[text()='+']")).click();
        driver.findElement(By.xpath("//span[text()='3']")).click();
        driver.findElement(By.xpath("//span[text()='=']")).click();

        // ... should be 4, wait for it
        WebDriverWait wait = new WebDriverWait(driver,  Duration.ofSeconds(10));
        wait.until(ExpectedConditions.textToBe(By.className("screen"), "4"));

        wdm.stopRecording();

        long timeoutMs = System.currentTimeMillis()
                + TimeUnit.SECONDS.toMillis(REC_TIMEOUT_SEC);

        File recFile;
        do {
            recFile = new File(targetFolder, REC_FILENAME + REC_EXT);
            if (System.currentTimeMillis() > timeoutMs) {
                fail("Timeout of " + REC_TIMEOUT_SEC
                        + " seconds waiting for recording " + recFile);
                break;
            }
            Thread.sleep(POLL_TIME_MSEC);

        } while (!recFile.exists());

        log.debug("Recording available at {}", recFile);
    }

}
//tag::snippet-in-doc[]

底层代码实现,不依赖WebDriverManager使用selenium也可以实现

((JavascriptExecutor)this.driver).executeScript("window.postMessage({ type: \"startRecording\", name: \"" + recordingName + "\" });", new Object[0]);

WebDriverManager还有很多好玩的功能没有去研究,看了一下有个和docker有关的功能似乎还不错。可以在docker上面跑自动化用例,似乎还能显示docker中的画面。有时间再去研究一下怎么玩的。

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

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

相关文章

【ASM】字节码操作 工具类与常用类 Printer、ASMifier、Textifier 介绍

文章目录 1.概述2. Printer2.1 class info2.2 fields2.3 constructors2.4 methods3. ASMifier与Textifier3.1 如何使用3.2 从命令行使用3.3 visit方法3.4 从代码中使用1.概述 在上一篇文章中:【ASM】字节码操作 工具类与常用类 TraceClassVisitor 介绍 我们知道了如何使用Tra…

nodejs+vue+elementui个人图书分享共享网站

本面向图书共享系统主要包括两大功能模块&#xff0c;即用户功能模块和管理员功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;首页、个人中心、图书分类管理、图书信息管理、用户管理、用户分享管理、联系我们、社区交流、系统管理。 &#xff08;2&#xff09;用…

多功能电子密码锁的设计与制作

目 录 第一章 绪论 1 1.1 课题背景和意义 1 1.2 多功能电子密码锁发展趋势 2 第二章 总体设计方案的确定 3 2.1 多功能电子密码锁设计的具体要求 3 2.2 总体设计方案选定 3 第三章 系统硬件设计 5 3.1 设计原理 5 3.2 单片机STC89C51简介 5 3.3 AT24C02存储芯片 9 3.4 LCD显示模…

《Deep learning Based Text Classification:A comprehensive Review》文本综述

介绍 深度学习综述年年有&#xff0c;今年特别多。随着深度学习在机器学习领域的快速发展&#xff0c;对每个任务进行算法的总结对于之后的发展是有益的。综述可以梳理发展脉络&#xff0c;对比算法好坏&#xff0c;并为以后的研究方向进行启发。本文是在NLP领域中重要的任务-…

KT148A语音芯片常见问题集锦|硬件|软件以及注意事项-长期更新

目录 1.1KT148A是什么&#xff1f; 具备哪些功能&#xff1f; 有什么特色&#xff1f; 1.2KT148A工作电压多少&#xff1f;电流是多少&#xff1f;控制方式是多少&#xff1f;支持多大的喇叭&#xff1f; 1.3KT148A我焊接到PCB板上面之后&#xff0c;为什么没有任何反应呢&a…

基于动态时间规整算法(DTW)的语音识别技术研究-含Matlab代码

⭕⭕ 目 录 ⭕⭕⏩ 一、引言⏩ 二、动态时间规整算法基本原理⏩ 三、语音识别实例分析⏩ 四、参考文献⏩ 五、Matlab代码获取⏩ 一、引言 在语音识别技术的发展过程中&#xff0c;动态时间规整算法&#xff08;Dynamic Time Warping&#xff0c;DTW&#xff09;一直处于重要地…

Mysql

1.约束 2.数据库设计 3.多表查询 4.事物 5.新增/删除/修改语句 6.单表条件查询 7.函数 8.创建数据库/数据表 执行顺序 第一步&#xff1a;from 指定要操作的表 第二步&#xff1a;join 连接表生成一个笛卡尔积 第三步&#xff1a;on 对笛卡尔积进行筛选 第四步&#xff1a…

Pytorch深度学习实战(1)—— 使用LSTM 自动编码器进行时间序列异常检测

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

并发编程面试题

并发 为什么要使用并发编程&#xff08;并发编程的优点&#xff09; 并发编程可以提升 CPU 的计算能力的利用率&#xff0c;通过并发编程的形式可以将多核CPU 的计算能力发挥到极致提升程序的性能&#xff0c;如&#xff1a;响应时间、吞吐量、计算机资源使用率等。并发程序可…

Golang 数组基础

数组内部实现和基础功能 了解Go的数据结构&#xff0c;一般会从数组开始&#xff0c;因为数组是切片和映射的基础数据结构。 内部实现 在Go语言中&#xff0c;数组是一个长度固定的数据类型&#xff0c;用于存储一段具有相同的类型的元素连续块。数组的类型是固定统一的&…

Vue框架插槽(第八课)

案例 组件信息的通信 自己思考一下 答案在本文章的后面插槽 v-slot 这个时候我们就可以来定义插槽slot&#xff1a; 插槽的使用过程其实是抽取共性、预留不同&#xff1b;我们会将共同的元素、内容依然在组件内进行封装&#xff1b;同时会将不同的元素使用slot作为占位&#xf…

CTC 技术介绍概述——啃论文系列

CTC 技术介绍概述——啃论文系列 文章目录CTC 技术介绍概述——啃论文系列自我介绍摘要前言知识导图1. 定义2. 诞生背景2.1 频谱紧张例子&#xff0c;wifi的5GHz2.2 通信干扰——CTI2.3 管理困难2.4 异构通信传统实现——网关桥接2.5 CTC——异构直接通信3. 包级CTC3.1 基于RSS…

个人设计web前端大作业 基于html5制作美食菜谱网页设计作业代码

&#x1f380; 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

基于PHP+MySQL长途客用汽车票订票系统的设计与实现

随着时代的变迁汽车已经成为了人们日常生活中不可或缺的一部分,虽然很多人已经拥有了私家车,但是很多时候因为离家较远等原因,很多时候人们还是会通过客用汽车来进行一些出行,但是通常情况下客用车票都需要到客用站进行购买,这极其的不便利。 为了能够让用户足不出户就可以进行…

拿稳这24道JVM面试题,要价30k都有底气

1.什么是JVM? JVM 的全称是 「Java Virtual Machine」&#xff0c;也就是我们耳熟能详的 Java 虚拟机。它能识别 .class后缀的文件&#xff0c;并且能够解析它的指令&#xff0c;最终调用操作系统上的函数&#xff0c;完成我们想要的操作。 C开发出来的程序&#xff0c;编译…

SpringBoot SpringBoot 开发实用篇 4 数据层解决方案 4.10 MongoDB 基础操作

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇4 数据层解决方案4.10 MongoDB 基础操作4.10.1 MongoDB 基础操作4.10…

(3)paddle---近视眼睛分类的例子

1主要参考 &#xff08;0&#xff09;本教程和以下教程不够详细&#xff0c;还是推荐下面这个大佬的blog看一下 计算机视觉——眼疾图片识别&#xff08;数据集iChallenge-PM&#xff09;_「已注销」的博客-CSDN博客 &#xff08;1&#xff09;blibli视频 252-06_预测病理性…

Vite2 + Vue3 + TypeScript + Pinia 搭建一套企业级的开发脚手架

Vue2 与 Vue3 的区别 Vue3由于完全由TS进行重写&#xff0c;在应用中对类型判断的定义和使用有很强的表现。同一对象的多个键返回值必须通过定义对应的接口&#xff08;interface&#xff09;来进行类型定义。要不然在 ESLint 时都会报错。Vue2 与 Vue3 最大的区别: Vue2 使用…

jquery把页面<table>里的内容导出为后缀名为.xlsx的excel

1、问题描述 之前是用Blob把页面的<table>导出成.xls的Excel文件&#xff1a;Blob把html导出为excel文件_金斗潼关的博客-CSDN博客 不过由于微软的Excel对.xls扩展名的文件支持不是很好&#xff0c;打开会报一个警告 所以用户反馈说是不想弹出这个警告&#xff0c;要求…

【深度学习入门 2022 最新版】第一课 深度学习简介

【深度学习入门 2022 最新版】第一课 深度学习简介概述深度学习 vs 机器学习机器学习是什么深度学习是什么机器学习和深度学习的区别神经网络机器学习实现二分类神经网络实现二分类TensorFlowPyTorch神经网络的原理张量张量最小值 (补充)张量最大值 (补充)前向传播损失计算反向…