草庐IT

selenium自动化“ChromeDriver”和浏览器版本不同解决办法

IT_lw 2023-04-11 原文

“selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 97
Current browser version is 96.0.4664.45 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe”

python使用selenium自动化操作浏览器时,报以上错误,即为“ChromeDriver”和浏览器版本不对应问题,解决办法有如下两种,
1.手动下载ChromeDriver并引用(chrome更新后需要重新下载对应版本的ChromeDriver)。
2.导入对应包,让程序自动去下载对应的ChromeDriver,此方法可以解决chrome自动更新后,需要手动下载ChromeDriver的步骤

一、手动下载对应版本的ChromeDriver,并进行引用

1.查看本机chrome浏览器版本

打开chrome浏览器,右上角三个点点里面找到设置

查看版本:96.0.4664.45
2.去下载对应版本的ChromeDriver

链接地址:http://chromedriver.storage.googleapis.com/index.html
找到对应自己chrome浏览器版本的文件
点击进入,下载对应自己操作系统的文件压缩包64位下载win32就可以
3.解压下载好的安装包之后有两种方式可以让程序找到ChromeDriver驱动并使用它:分为3.1和3.2
3.1将文件夹中的.exe文件放在python文件夹下,该方法需要移动驱动程序文件位置,稍微麻烦一些,且后期更新ChromeDriver后还需要重复该步骤,不如3.2方便

压缩包

解压后文件夹内只有一个.exe文件

将该.exe文件放在包含python.exe的python文件夹下

3.2 在代码中设置ChromeDriver的路径,就可以将ChromeDriver文件放在任意位置了
旧版selenium可以使用以下语句直接指定chromedriver.exe文件的位置

from selenium import webdriver

driver = webdriver.Chrome(executable_path='D:\\python3.7.7\\chromedriver_win32\\chromedriver.exe')
driver.get('https://www.baidu.com')

新版selenium废除了上述方式(可以使用但会报),可以使用以下方式,需要引入Service包

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service(executable_path='D:\\python3.7.7\\chromedriver_win32\\chromedriver.exe')
driver = webdriver.Chrome(service=service)
driver.get('https://www.baidu.com')

经过3.1或3.2的设置后就可以正常运行代码了,不会再报版本不对应的错误

二、通过导入‘ChromeDriverManager’包,自动加载对应版本的"ChromeDriver"

第一种方式在chrome更新后需要重新手动下载对应版本的ChromeDriver,较为麻烦。如果使用导入ChromeDriverManager的方式可以让程序在运行前自动检查是否存在和chrome版本对应的ChromeDriver,不存在或版本不对应的情况下,程序会自动下载

接下来就是该方式的流程:
首先安装‘webdriver-manager’包

pip install webdriver-manager


然后就是导包了:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.baidu.com')

运行上述代码后,如果你的电脑ChromeDriver版本不正确,会先下载对应版本,然后再打开浏览器

这里有文件的保存地址,会默认保存在‘[C:\Users\admin\.wdm\drivers\chromedriver\win32\100.0.4896.60]’,我没找到是否可以更换保存地址,~~~~~如果你知道的话,可以评论下,谢谢
以上设置之后就可以使用selenium自动化访问了
eg:

from selenium import webdriver
chrome = webdriver.Chrome()
注释:若放在python文件夹内可以直接使用chrome = webdriver.Chrome(),若放在其他路径只需要将chromedriver.exe的路径放在括号里面chrome = webdriver.Chrome(‘D:\software\chromedriver.exe’)同样可以运行
chrome=webdriver.Chrome()
url = “http://www.baidu.com”
chrome.get(url)
chrome.find_element_by_id(“kw”).send_keys(“python”)
chrome.find_element_by_id(“su”).click()
该代码可以打开百度,输入python,并点击"百度一下"进行搜索

有关selenium自动化“ChromeDriver”和浏览器版本不同解决办法的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 在 Ruby 中用键盘诅咒数组浏览 - 2

    我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  6. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  9. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  10. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

随机推荐