I'm new comer of Selenium, and I can use selenium with Chromedriver to do basic auto-test now, the code works fine, but the problem is Chrome browser always update automatically at the backend, and code always fail to run after Chrome update. I know I need to download new chromedriver to solve this issue, but I wonder if there's any way to solve this issue without disabling chromebrowser update? tks.
I'm using Windows 10 / Chrome Version 67 / Python 3.6.4 / Selenium 3.12.0
答案 0 :(得分:2)
否,除了更新 ChromeDriver 二进制版本之外别无选择,而 Chrome浏览器会自动更新。
在对现有功能进行某些功能添加,修改和删除后,将发布每个 Chrome浏览器。要符合当前的浏览器功能, Chrome Team 会不时发布兼容的 ChromeDriver 二进制文件。这些 ChromeDriver 二进制文件能够与 Chrome浏览器进行交互。某些版本的 ChromeDriver 二进制文件支持特定范围的 Chrome浏览器版本(部分最新版本),如下所示:
ChromeDriver v 2.41 (2018-07-27)
Supports Chrome v67-69
ChromeDriver v 2.40 (2018-06-07)
Supports Chrome v66-68
ChromeDriver v 2.39 (2018-05-30)
Supports Chrome v66-68
ChromeDriver v 2.38 (2018-04-17)
Supports Chrome v65-67
ChromeDriver v 2.37 (2018-03-16)
Supports Chrome v64-66
ChromeDriver v 2.36 (2018-03-02)
Supports Chrome v63-65
ChromeDriver v 2.35 (2018-01-10)
Supports Chrome v62-64
ChromeDriver v 2.34 (2017-12-10)
Supports Chrome v61-63
ChromeDriver v 2.33 (2017-10-03)
Supports Chrome v60-62
ChromeDriver v 2.32 (2017-08-30)
Supports Chrome v59-61
ChromeDriver v 2.31 (2017-07-21)
Supports Chrome v58-60
ChromeDriver v 2.30 (2017-06-07)
Supports Chrome v58-60
ChromeDriver v 2.29 (2017-04-04)
Supports Chrome v56-58
要使您的脚本/程序与更新的 Chrome浏览器保持互动,您必须将 ChromeDriver 二进制文件的版本与 Chrome浏览器根据兼容性。
答案 1 :(得分:1)
这是我构建的(也使用了另一个stackoverflow线程的一些预编写代码),它可能对您有用。我每次都将脚本设置为从全局驱动程序脚本运行,以确保其使用正确的ChromeDriver.exe文件。
但是在遇到此问题之前,您首先需要确保安装新的驱动程序,这些脚本将自动下载最新版本/寻找最新版本的ChromeDriver并将其下载到新的文件夹位置。 Chrome版本更新后,它将仅使用新的文件夹位置。如果chrome的浏览器版本更新了,并且chromedriver.storage.googleapis.com上没有可用的版本,则脚本应正常运行。
我在os路径中设置了四个脚本,因此可以全局访问驱动程序。以下是我用来更新浏览器的脚本。
希望这是有道理的。
干杯! 马特
-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)
# \VarFileInfo\Translation 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%04X\parm_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:\Users\Administrator\Downloads\chromedriver_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()
答案 2 :(得分:1)
对于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
答案 3 :(得分:1)
我正在使用这个为我工作的图书馆。
https://pypi.org/project/chromedriver-autoinstaller/
项目说明
chromedriver-autoinstaller 自动下载并安装支持当前安装的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
答案 4 :(得分:0)
是的。
问题:“如何通过Python硒自动更新Chrome浏览器时如何使用特定版本的ChromeDriver”
就像您正确指出的那样,Chrome浏览器会自动更新。如果ChromeDriver是计算机上某个特定版本的Chrome浏览器的静态文件,则意味着每次浏览器更新时,您都必须下载新的ChromeDriver。
幸运的是,还有一种方法可以自动更新ChromeDriver!
您可以使用webdrive-manager自动使用正确的chromedriver。
安装webdrive-manager:
pip install webdriver-manager
然后按如下所示在python中使用驱动程序
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install())
答案 5 :(得分:0)
您可以使用下面的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驱动程序的兼容版本,并且它像没有任何问题的魅力一样工作。
希望它可以以一种或其他方式帮助他人。