如何使用特定版本的ChromeDriver,而Chrome浏览器通过Python selenium自动更新



我是Selenium的新人,我现在可以使用Selenium和Chromedriver进行基本的自动测试,代码工作正常,但问题是Chrome浏览器总是在后端自动更新,Chrome更新后代码总是无法运行。我知道我需要下载新的chromedriver来解决这个问题,但我想知道是否有任何方法可以在不禁用chromebrowser更新的情况下解决此问题?啧啧。

我正在使用Windows 10/Chrome Version 67/Python 3.6.4/Selenium 3.12.0

不,除了更新ChromeDriver二进制版本之外别无选择,而Chrome浏览器会不断自动更新。


原因

每个Chrome 浏览器都是在对现有功能进行某些添加、修改和移除后发布的。为了遵守当前的浏览器功能集,Chrome 团队会不时发布兼容的ChromeDriver二进制文件。这些ChromeDriver二进制文件能够与Chrome 浏览器进行交互。某些版本的ChromeDriver二进制文件支持特定范围的Chrome 浏览器版本(一些最新版本),如下所示:

  • ChromeDriver v84.0.4147.30(2020-05-28)

    Supports Chrome version 84
    
  • ChromeDriver v83.0.4103.39(2020-05-05)

    Supports Chrome version 83
    
  • ChromeDriver v82被有意跳过。

  • ChromeDriver v81.0.4044.138(2020-05-05)

    Supports Chrome version 81
    
  • ChromeDriver v80.0.3987.106 (2020-02-13)

    Supports Chrome version 80
    
  • ChromeDriver v79.0.3945.36(2019-11-18)

    Supports Chrome version 79
    
  • ChromeDriver v78.0.3904.70 (2019-10-21)

    Supports Chrome version 78
    
  • ChromeDriver v77.0.3865.40(2019-08-20)

    Supports Chrome version 77
    
  • ChromeDriver v76.0.3809.126(2019-08-20)

    Supports Chrome version 76
    
  • ChromeDriver v75.0.3770.8(2019-04-29)

    Supports Chrome version 75
    
  • ChromeDriver v74.0.3729.6(2019-03-14)

    Supports Chrome version 74
    
  • ChromeDriver v73.0.3683.68(2019-03-06)

    Supports Chrome version 73
    
  • ChromeDriver v2.46(2019-02-01)

    Supports Chrome v71-73
    
  • ChromeDriver v2.45(2018-12-10)

    Supports Chrome v70-72
    
  • ChromeDriver v2.44(2018-11-19)

    Supports Chrome v69-71
    
  • ChromeDriver v2.43(2018-10-16)

    Supports Chrome v69-71
    
  • ChromeDriver v2.42(2018-09-13)

    Supports Chrome v68-70
    
  • ChromeDriver v2.41(2018-07-27)

    Supports Chrome v67-69
    
  • ChromeDriver v2.40(2018-06-07)

    Supports Chrome v66-68
    
  • ChromeDriver v2.39(2018-05-30)

    Supports Chrome v66-68
    
  • ChromeDriver v2.38(2018-04-17)

    Supports Chrome v65-67
    
  • ChromeDriver v2.37(2018-03-16)

    Supports Chrome v64-66
    
  • ChromeDriver v2.36(2018-03-02)

    Supports Chrome v63-65
    
  • ChromeDriver v2.35(2018-01-10)

    Supports Chrome v62-64
    
  • ChromeDriver v2.34(2017-12-10)

    Supports Chrome v61-63
    
  • ChromeDriver v2.33(2017-10-03)

    Supports Chrome v60-62
    
  • ChromeDriver v2.32(2017-08-30)

    Supports Chrome v59-61
    
  • ChromeDriver v2.31(2017-07-21)

    Supports Chrome v58-60
    
  • ChromeDriver v2.30(2017-06-07)

    Supports Chrome v58-60
    
  • ChromeDriver v2.29(2017-04-04)

    Supports Chrome v56-58
    

结论

为了使您的脚本/程序与更新的Chrome浏览器保持交互,您必须根据兼容性使ChromeDriver二进制文件的版本与Chrome浏览器保持同步。

我正在使用这个对我有用的库.

https://pypi.org/project/chromedriver-autoinstaller/

项目描述

Chrome 驱动程序自动安装程序 自动下载并安装支持当前安装的 chrome 版本的 chromedriver 。此安装程序支持 Linux、MacOS 和 Windows 操作系统。

安装

pip install chromedriver-autoinstaller

from selenium import webdriver
import chromedriver_autoinstaller

chromedriver_autoinstaller.install()  # Check if the current version of chromedriver exists
# and if it doesn't exist, download it automatically,
# then add chromedriver to path
driver = webdriver.Chrome()
driver.get("http://www.python.org")
assert "Python" in driver.title

我也使用像@ATJ评论的那样的选项,但用于定义 Chrome 的 binary_location() 而不是CHROMEDRIVER_PATH。 实际上,我喜欢此扩展中的一件事是不需要指定此路径,因为它已经处理了这个问题。在使用它之前,我曾经浪费时间放置路径,搜索它的位置,将驱动程序的副本放在项目文件夹或系统路径文件夹中。

我还用这个快速代码制作了一个模板来使用硒,我用它打开新文件,然后继续 就是这样:


import chromedriver_autoinstaller
from selenium import webdriver
chromedriver_autoinstaller.install()
options = webdriver.ChromeOptions()
options.binary_location = ('C:\Program Files\Google\Chrome\Application\chrome.exe')
driver = webdriver.Chrome(options=options)

以及这个快速脚本,可以在第一次在新PC上使用终端上运行


import os
os.system("pip install  selenium ")
os.system("pip install  chromedriver_autoinstaller ")

-我的模板的实际完整版本(留下评论更快,减少重复工作,取消评论使其更加依赖)


import chromedriver_autoinstaller
from selenium import webdriver
#from selenium.webdriver.common.keys import Keys
# import os
#    # to use when 1st time on the machine and then leave comented
# os.system("pip install  selenium ")
# os.system("pip install  chromedriver_autoinstaller ")
chromedriver_autoinstaller.install()
options = webdriver.ChromeOptions()
options.headless = False
options.binary_location = ('C:\Program Files\Google\Chrome\Application\chrome.exe')
driver = webdriver.Chrome(options=options)

编辑 2 - 带有二进制 loc 的 mine 模板的实际完整版本。井。我刚刚用binary_location测试了代码,它也可以工作。好吧,不知道它以前不起作用,这个位置是默认的,所以,除非人在安装 Chrome 时发生了变化,否则不应该改变。现在重新审视它很好,我只是从我将来的所有用途中保存了一行。


import chromedriver_autoinstaller
from selenium import webdriver
#from selenium.webdriver.common.keys import Keys
# import os
#    # to use when 1st time on the machine and then leave comented
# os.system("pip install  selenium ")
# os.system("pip install  chromedriver_autoinstaller ")
chromedriver_autoinstaller.install()
options = webdriver.ChromeOptions()
options.headless = False
driver = webdriver.Chrome(options=options)

对于 Ubuntu/Linux:

只需使用它即可更新到最新版本:https://stackoverflow.com/a/57306360/4240654

version=$(curl -s https://chromedriver.storage.googleapis.com/LATEST_RELEASE)
wget -qP "/tmp/" "https://chromedriver.storage.googleapis.com/${version}/chromedriver_linux64.zip"
sudo unzip -o /tmp/chromedriver_linux64.zip -d /usr/bin

然后,如果您需要更新Chrome:https://superuser.com/questions/130260/how-to-update-google-chrome-in-ubuntu

sudo apt-get --only-upgrade install google-chrome-stable

您可以使用下面的shell脚本来确保下载正确版本的chrome驱动程序。你可以在python中做类似的事情来让它工作,但你会知道如何继续解决这个问题。

%sh
#downloading compatible chrome driver version
#getting the current chrome browser version
**chromeVersion=$(google-chrome --product-version)**
#getting the major version value from the full version
**chromeMajorVersion=${chromeVersion%%.*}**
# setting the base url for getting the release url for the chrome driver
**baseDriverLatestReleaseURL=https://chromedriver.storage.googleapis.com/LATEST_RELEASE_**
#creating the latest release driver url based on the major version of the chrome
**latestDriverReleaseURL=$baseDriverLatestReleaseURL$chromeMajorVersion**
**echo $latestDriverReleaseURL**
#file name of the file that gets downloaded which would contain the full version of the chrome driver to download
**latestDriverVersionFileName="LATEST_RELEASE_"$chromeMajorVersion**
#downloading the file that would contain the full release version compatible with the major release of the chrome browser version
**wget $latestDriverReleaseURL** 
#reading the file to get the version of the chrome driver that we should download
**latestFullDriverVersion=$(cat $latestDriverVersionFileName)**
**echo $latestFullDriverVersion**
#creating the final URL by passing the compatible version of the chrome driver that we should download
**finalURL="https://chromedriver.storage.googleapis.com/"$latestFullDriverVersion"/chromedriver_linux64.zip"**
**echo $finalURL**
**wget $finalURL**

在 databricks 环境中运行计划作业时,我能够使用上述方法获得兼容版本的 chrome 浏览器和 chrome 驱动程序,它就像一个魅力,没有任何问题。

希望它以一种或另一种方式帮助他人。

是的,你可以。

问题:"如何在Chrome浏览器通过Python selenium自动更新时使用特定版本的ChromeDriver">

就像您正确指出的那样,Chrome浏览器会自动更新。如果 ChromeDriver 是您计算机上某个特定版本的 Chrome 浏览器的静态文件,则意味着每次浏览器更新时,您都必须下载新的 ChromeDriver。

幸运的是,也有一种方法可以自动更新ChromeDriver!

您可以通过使用网络驱动器管理器自动使用正确的chromedriver。

安装网络驱动器管理器:

pip install webdriver-manager

然后在python中使用驱动程序,如下所示

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())

对我来说,这解决了问题:

pip install --upgrade --force-reinstall chromedriver-binary-auto

这是我构建的(也使用了来自另一个堆栈溢出线程的一些预先编写的代码),它可以为您工作。我每次都将脚本设置为从全局驱动程序脚本运行,以确保它使用正确的 ChromeDriver.exe 文件。

但是您需要首先确保在遇到此问题之前安装新驱动程序,这些脚本将自动下载最新版本/查找最新版本的ChromeDriver并将其下载到新的文件夹位置。只有在您的 Chrome 版本更新后,它才会使用新的文件夹位置。如果浏览器版本的 chrome 更新并且 chromedriver.storage.googleapis.com 上没有可用版本,则脚本应正常失败。

我在操作系统路径中设置了四个脚本,以便我可以全局访问我的驱动程序。以下是我用来更新浏览器的脚本。

希望这是有道理的。

干杯! 马 特

--getFileProperties.py --

# as per https://stackoverflow.com/questions/580924/python-windows-file-version-attribute
import win32api
#==============================================================================
def getFileProperties(fname):
#==============================================================================
"""
Read all properties of the given file return them as a dictionary.
"""
propNames = ('Comments', 'InternalName', 'ProductName',
'CompanyName', 'LegalCopyright', 'ProductVersion',
'FileDescription', 'LegalTrademarks', 'PrivateBuild',
'FileVersion', 'OriginalFilename', 'SpecialBuild')
props = {'FixedFileInfo': None, 'StringFileInfo': None, 'FileVersion': None}
try:
# backslash as parm returns dictionary of numeric info corresponding to VS_FIXEDFILEINFO struc
fixedInfo = win32api.GetFileVersionInfo(fname, '\')
props['FixedFileInfo'] = fixedInfo
props['FileVersion'] = "%d.%d.%d.%d" % (fixedInfo['FileVersionMS'] / 65536,
fixedInfo['FileVersionMS'] % 65536, fixedInfo['FileVersionLS'] / 65536,
fixedInfo['FileVersionLS'] % 65536)
# VarFileInfoTranslation returns list of available (language, codepage)
# pairs that can be used to retreive string info. We are using only the first pair.
lang, codepage = win32api.GetFileVersionInfo(fname, '\VarFileInfo\Translation')[0]
# any other must be of the form StringfileInfo%04X%04Xparm_name, middle
# two are language/codepage pair returned from above
strInfo = {}
for propName in propNames:
strInfoPath = u'\StringFileInfo\%04X%04X\%s' % (lang, codepage, propName)
## print str_info
strInfo[propName] = win32api.GetFileVersionInfo(fname, strInfoPath)
props['StringFileInfo'] = strInfo
except:
pass
return props

--ChromeVersion.py --

from getFileProperties import *
chrome_browser = #'C:\Program Files (x86)\Google\Chrome\Application\chrome.exe' -- ENTER YOUR Chrome.exe filepath

cb_dictionary = getFileProperties(chrome_browser) # returns whole string of version (ie. 76.0.111)
chrome_browser_version = cb_dictionary['FileVersion'][:2] # substring version to capabable version (ie. 77 / 76)

nextVersion = str(int(chrome_browser_version) +1) # grabs the next version of the chrome browser
lastVersion = str(int(chrome_browser_version) -1) # grabs the last version of the chrome browser

--ChromeDriverAutomation.py --

from ChromeVersion import chrome_browser_version, nextVersion, lastVersion

driverName = "\chromedriver.exe"
# defining base file directory of chrome drivers
driver_loc = #"C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\ChromeDriver\" -- ENTER the file path of your exe
# -- I created a separate folder to house the versions of chromedriver, previous versions will be deleted after downloading the newest version.
# ie. version 75 will be deleted after 77 has been downloaded.
# defining the file path of your exe file automatically updating based on your browsers current version of chrome.
currentPath = driver_loc + chrome_browser_version + driverName 
# check file directories to see if chrome drivers exist in nextVersion

import os.path
# check if new version of drive exists --> only continue if it doesn't
Newpath = driver_loc + nextVersion
# check if we have already downloaded the newest version of the browser, ie if we have version 76, and have already downloaded a version of 77, we don't need to run any more of the script.
newfileloc = Newpath + driverName
exists = os.path.exists(newfileloc)

if (exists == False):
#open chrome driver and attempt to download new chrome driver exe file.
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time
chrome_options = Options()
executable_path = currentPath
driver = webdriver.Chrome(executable_path=executable_path, options=chrome_options)
# opening up url of chromedriver to get new version of chromedriver.
chromeDriverURL = 'https://chromedriver.storage.googleapis.com/index.html?path=' + nextVersion 
driver.get(chromeDriverURL)
time.sleep(5)
# find records of table rows
table = driver.find_elements_by_css_selector('tr')

# check the length of the table
Table_len = len(table)
# ensure that table length is greater than 4, else fail. -- table length of 4 is default when there are no availble updates
if (Table_len > 4 ):
# define string value of link
rowText = table[(len(table)-2)].text[:6]
time.sleep(1)
# select the value of the row
driver.find_element_by_xpath('//*[contains(text(),' + '"' + str(rowText) + '"'+')]').click()
time.sleep(1)
#select chromedriver zip for windows 
driver.find_element_by_xpath('//*[contains(text(),' + '"' + "win32" + '"'+')]').click()
time.sleep(3)
driver.quit()
from zipfile import ZipFile
import shutil

fileName = #r"C:UsersAdministratorDownloadschromedriver_win32.zip" --> enter your download path here.


# Create a ZipFile Object and load sample.zip in it
with ZipFile(fileName, 'r') as zipObj:
# Extract all the contents of zip file in different directory
zipObj.extractall(Newpath)

# delete downloaded file
os.remove(fileName)

# defining old chrome driver location
oldPath = driver_loc + lastVersion
oldpathexists = os.path.exists(oldPath)
# this deletes the old folder with the older version of chromedriver in it (version 75, once 77 has been downloaded)
if(oldpathexists == True):
shutil.rmtree(oldPath, ignore_errors=True)

exit()

https://github.com/MattWaller/ChromeDriverAutoUpdate

也许这会对你有所帮助。 我设法在JUPYTER中使用ChromeDriver版本96.0.4664.45进行编辑,我之前使用Pycharm,但它没有响应。

相关内容

  • 没有找到相关文章

最新更新