Selenium 自动化 —— 使用WebDriverManager自动下载驱动

上一篇文章 入门和 Hello World 实例 中,我们提供了一个最简单的 Selenium 上手的例子。

但是某一天,突然发现相同的代码居然运行报错了。这是怎么回事呢?

日志排查

日志中其实提示的很明显了:Chrome浏览器和Chrome WebDriver的版本不匹配。当前WebDriver只支持Chrome浏览器版本114.
在这里插入图片描述
先检查一下我们的Chrome WebDriver版本是114:

System.setProperty("webdriver.chrome.driver", "C:\\chromedriver-114\\chromedriver.exe");

再检查Chrome浏览器的版本号,发现是122
在这里插入图片描述
原来是Chrome浏览器默认的自动升级,升级到了最新的版本。

遇到的问题

除了浏览器会自动升级导致出现问题,其实手动下载版本还有很多问题,比如相同的代码,换个环境就又要再次下载相应环境浏览器的版本对应的WebDriver了。

所以,能不能不要手动配置webdriver.exe,要是有一种机制能够自动下载指定的版本就好了。

就像我们电脑安装的360驱动大师一样,不用我们手动去下载驱动,能不能有这样的驱动大师?
在这里插入图片描述

幸运的是,还真有这样的机制,这就是WebDriverManager.

WebDriverManager驱动管理器

没有驱动管理器时,我们需要很多繁琐的工作:

  1. 查看浏览器版本
  2. 手动下载对应版本的WebDriver驱动
  3. 放到本地目录,代码中配置路径
  4. 某天浏览器自动升级了
  5. 重复 步骤1、步骤2、步骤3

想想都觉得麻烦。

但是有了WebDriverManager,它会自动得检测我们安装的Chrome浏览器(或者其它浏览器)的版本,然后自动下载对应版本的WebDriver。这个过程完全是自动的,把之前那些繁琐的工作都省去了。

WebDriverManager的使用

使用起来很简单,把我们第一篇博客中的代码做一点修改就可以了。

  1. 在pom.xml 引入webdrivermanager的依赖
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.7.0</version>
</dependency>
  1. 删掉手动配置WebDriver的代码
// System.setProperty("webdriver.chrome.driver", "C:\\chromedriver-114\\chromedriver.exe");
  1. 添加配置驱动管理器的代码
WebDriverManager.chromedriver().setup();

只需要这一行代码,其它代码和第一篇博客一样,不用做任何更改!

启动应用,程序运行正常!
观察控制台打印的日志,可以看到WebDriverManager会自动下载驱动!!
WebDriverManager检测到我们的Chrome版本是122,于是它会去自动下载122版本的驱动,然后配置。

Error reading commands.properties, using local instead
Using chromedriver 122.0.6261.128 (resolved driver for Chrome 122)
Downloading https://storage.googleapis.com/chrome-for-testing-public/122.0.6261.128/win64/chromedriver-win64.zip
Extracting driver from compressed file chromedriver-win64.zip
Exporting webdriver.chrome.driver as C:\Users\test\.cache\selenium\chromedriver\win64\122.0.6261.128\chromedriver.exe

到这里,我们就介绍完了使用WebDriverManager自动下载和配置WebDriver。

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

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

相关文章

国产Copilot--通义灵码安装教程

文章目录 在 Visual Studio Code 中安装通义灵码步骤1步骤2步骤3步骤4 参考 在 Visual Studio Code 中安装通义灵码 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解…

Unity开发一个FPS游戏之二

在之前的文章中,我介绍了如何开发一个FPS游戏,添加一个第一人称的主角,并设置武器。现在我将继续完善这个游戏,打算添加敌人,实现其智能寻找玩家并进行对抗。完成的效果如下: fps_enemy_demo 下载资源 首先是设计敌人,我们可以在网上找到一些好的免费素材,例如在Unity…

NCV7356D1R2G接口集成芯片中文资料PDF数据手册参数引脚图规格书价格图片

产品概述&#xff1a; NCV7356 是一款用于单线数据链路的物理层器件&#xff0c;能够使用多种具碰撞分解的载波感测多重存取 (CSMA/CR) 协议运行&#xff0c;如博世控制器区域网络 (CAN) 2.0 版。此串行数据链路网络适用于不需要高速数据的应用&#xff0c;低速数据可在物理介…

nginx gzip性能优化 —— 筑梦之路

对比使用和不使用gzip static处理 1. 不使用 gzip static 时的 gzip 处理 如果你不使用 gzip_static 而只是 "gzip on"&#xff0c;它每次都会被压缩并发送。 虽然它实际上可能缓存在内存中&#xff0c;但传统观点是 "每次都会执行压缩处理&#xff0c;因此 CP…

Hello,Spider!入门第一个爬虫程序

在各大编程语言中&#xff0c;初学者要学会编写的第一个简单程序一般就是“Hello, World!”&#xff0c;即通过程序来在屏幕上输出一行“Hello, World!”这样的文字&#xff0c;在Python中&#xff0c;只需一行代码就可以做到。我们把这第一个爬虫就称之为“HelloSpider”&…

Kotlin:runBlocking导致App应用出现ANR问题实例

runBlocking简介 runBlocking 是常规函数&#xff1b; runBlocking 方法会阻塞当前线程来等待&#xff1b; runBlocking 的主线程会一直 阻塞 直到 runBlocking 内部的协程执行完毕。 runBlocking导致App应用出现ANR问题实例的效果 点击页面上的 刷新按钮 调用 refreshByrunBlo…

【云原生-kubernetes系列】--kubernetes日志收集

1、ELK架构 1.1、部署ES集群 https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/ 1、下载软件包 rootes-server1:~# wget https://mirrors.tuna.tsinghua.edu.cn/elasticstack/apt/7.x/pool/main/e/elasticsearch/elasticsearch-7.12.0-…

媒体播放器及媒体服务器软件Plex

什么是 Plex &#xff1f; Plex 是一套媒体播放器及媒体服务器软件&#xff0c;让用户整理在设备上的有声书、音乐、播客、图片和视频文件&#xff0c;并通过流式传输至移动设备、智能电视和电子媒体播放器上。Plex 可用于 Windows、Android、Linux、OS X和 FreeBSD。 在接触 N…

基于SpringBoot和Echarts的全国地震可视化分析实战

目录 前言 一、后台数据服务设计 1、数据库查询 2、模型层对象设计 3、业务层和控制层设计 二、Echarts前端配置 1、地图的展示 2、次数排名统计 三、最终结果展示 1、地图展示 2、图表展示 总结 前言 在之前的博客中基于SpringBoot和PotsGIS的各省地震震发可视化分…

Redis系列学习文章分享---第三篇(Redis快速入门之Java客户端--短信登录+session+验证码+拦截器+登录刷新)

目录 Redis的短信登录实战解析1. 短信登录-基于session实现短信登录的流程2. 短信登录-实现发送短信验证码功能3. 短信登录-实现短信验证码登录和注册功能4. 短信登录-实现登录校验拦截器5. 短信登录-隐藏用户敏感信息6. 短信登录-session共享的问题分析7. 短信登录-Redis代替s…

代码+视频,R语言使用BOOT重抽样获取cox回归方程C-index(C指数)可信区间

bootstrap自采样目前广泛应用与统计学中&#xff0c;其原理很简单就是通过自身原始数据抽取一定量的样本&#xff08;也就是取子集&#xff09;&#xff0c;通过对抽取的样本进行统计学分析&#xff0c;然后继续重新抽取样本进行分析&#xff0c;不断的重复这一过程N&#xff0…

使用MQTT.fx和自定义Client(Ubuntu上实现)测试MQTT服务器(EMQX )

目录 概述 1 配置EMQX做MQTT服务器 1.1 登录EMQX 1.2 配置EMQX 1.2.1 配置客户端认证 1.2.2 创建用户 2 测试MQTT服务器 2.1 配置MQTT.fx工具 2.2 连接MQTT服务器 3 使用MQTT.fx发布和订阅信息 3.1 在MQTT.fx上发布信息 3. 2 在MQTT.fx上订阅信息 4 Ubuntu上实现MQ…

(done 剩个什么 3/4 unigram frequency 的玩意儿没懂) word2vec 算法,计算 嵌入矩阵(CBOW, Skip-gram)随机梯度下降法 SGD 负采样方案

参考视频1&#xff1a;https://www.bilibili.com/video/BV1vS4y1N7mo/?vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;讲的太浅了&#xff09; 参考视频2&#xff1a;https://www.bilibili.com/video/BV1s64y1P7Qm?p4&vd_source7a1a0bc74158c6993c7355c5490fc…

微信小程序-webview分享

项目背景 最近有个讨论区项目需要补充分享功能&#xff0c;希望可以支持在微信小程序进行分享&#xff0c;讨论区是基于react的h5项目&#xff0c;在小程序中是使用we-view进行承载的 可行性 目标是在打开web-view的页面进行分享&#xff0c;那就需要涉及h5和小程序的通讯问…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

【Leetcode每日一题】 递归 - 反转链表(难度⭐)(35)

1. 题目解析 题目链接&#xff1a;206. 反转链表 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、递归函数的核心任务 递归函数的主要职责是接受一个链表的头指针&#xff0c;并返回该链表逆序后的新头结点。递归…

复习C语言基础中的基础:C语言发展、C89 C99有何区别、C语言特点

参考《C程序设计&#xff08;第五版&#xff09;》&#xff08;谭浩强&#xff09;一书&#xff1a; 1. 发展、C89 C99 2. 特点 记得时不时回顾一下背景特点&#xff0c;加深对C语言的理解。

【学习记录】调试千寻服务+DTU+导远RTK过程的记录

最近调试车载定位的时候&#xff0c;遇到了一些问题&#xff0c;千寻服务已经正确配置到RTK里面了&#xff0c;但是导远的定位设备一直显示RTK浮动解&#xff0c;通过千寻服务后台查看状态&#xff0c;长时间显示不合法的GGA值。 首先&#xff0c;通过四处查资料&#xff0c;千…

深入理解JMM

一、什么是JMM JMM&#xff08;java memory model&#xff09;Java内存模型&#xff1a;是java虚拟机规范中定义的一组规范&#xff0c;用于屏蔽掉各种硬件和操作系统的内存访问差异&#xff0c;以实现让JAVA程序在各平台都能达到一致的并发结果。其主要规定了线程和内存之间的…

【优选算法】专题1 -- 双指针 -- 移动零

前言: &#x1f4da;为了提高算法思维&#xff0c;我会时常更新这个优选算法的系列&#xff0c;这个专题是关于双指针的练习 &#x1f3af;个人主页&#xff1a;Dream_Chaser&#xff5e;-CSDN博客 一.移动零&#xff08;easy&#xff09; 描述&#xff1a; 「数组分两块」是⾮…