Как работать с определенной версией ChromeDriver, когда браузер Chrome обновляется автоматически через Python selenium - PullRequest
0 голосов
/ 05 июня 2018

Я новичок в Selenium, и теперь я могу использовать селен с Chromedriver для базового автоматического тестирования, код работает нормально, но проблема в том, что браузер Chrome всегда автоматически обновляется на бэкэнде, а код всегда не запускаетсяпосле обновления Chrome.Я знаю, что мне нужно скачать новый chromedriver, чтобы решить эту проблему, но мне интересно, есть ли способ решить эту проблему, не отключая обновление chromebrowser?tks.

Я использую Windows 10 / Chrome версии 67 / Python 3.6.4 / Selenium 3.12.0

Ответы [ 2 ]

0 голосов
/ 22 августа 2019

Это то, что я построил (также использовал некоторый предзаписанный код из другого потока stackoverflow), оно может работать для вас.Я каждый раз настраиваю свои скрипты для запуска из глобального скрипта драйвера, чтобы убедиться, что он использует правильный файл ChromeDriver.exe.

Но перед тем, как столкнуться с этой проблемой, необходимо сначала убедиться, что вы устанавливаете новый драйвер, эти сценарии автоматически загрузят самую новую версию / найдут самую новую версию ChromeDriver и загрузят ее в новую папку с файлами.место нахождения.Он будет использовать новое расположение папок только после обновления вашей версии Chrome.Сценарий должен завершиться неудачно, если браузер обновляет версию chrome, а на chromedriver.storage.googleapis.com нет доступной версии.

Я установил четыре сценария в моем пути os, чтобы я мог получить доступ к своему драйверу глобально.Ниже приведены сценарии, которые я использую для обновления своего браузера.

Надеюсь, это имеет смысл.

Ура!Matt

- getFileProperties.py -

# as per /563698/atribut-versiya-faila-windows-python

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()

https://github.com/MattWaller/ChromeDriverAutoUpdate

0 голосов
/ 05 июня 2018

Нет , нет другой альтернативы, кроме обновления двоичных версий 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
    
  • ChromeDriverv 2.29 (2017-04-04)

    Supports Chrome v56-58
    

Заключение

Для обеспечения интерактивности вашего сценария / программы с обновленными Браузер Chrome Вы должны поддерживать версию двоичного файла ChromeDriver в синхронизации с Браузер Chrome в соответствии с совместимостью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...