Открытый драйвер Python Selen, когда сеанс Chrome уже запущен

Я пытаюсь открыть веб-страницу с использованием библиотеки python selenium с моим пользователем по умолчанию, очень важно, чтобы скрипт использовал пользователя по умолчанию, но если мой браузер chrome уже открыт, скрипт вылетает и выдает мне эту ошибку:

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir

Я перепробовал все решения, приведенные здесь:

Selenium chromedriver не будет запускать URL, если открыт другой экземпляр Chrome

Selenium не будет открывать новый URL в новой вкладке (Python & Chrome)

и прочитал, что в старых версиях chromedriver была ошибка, но она была исправлена ​​в chrome 74 (который я использую): https://github.com/SeleniumHQ/docker-selenium/issues/741

from selenium import webdriver
import time
from getpass import getuser

def run():
    # Chrome driver path
    chromedriver = r'C:\Users\user1\Downloads\chromedriver_win32\chromedriver_new.exe'

    # Get chrome webdriver options and set open the browser as headless
    chrome_options = webdriver.ChromeOptions()
    #chrome_options.add_argument("--headless")

    # Fix for selenium Issue 2907
    #chrome_options.add_argument('--log-level=3')
    #chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])

    # Load current user default profile
    current_user = getuser()
    chrome_options.add_argument(
        r"--user-data-dir=C:\Users\{}\AppData\Local\Google\Chrome\User Data".format(current_user))

    # didable "Chrome is being controled by an automated test software"
    chrome_options.add_argument('disable-infobars')

    # get Chrome to stay open
    chrome_options.add_experimental_option("detach", True)

    # open browser with options and driver
    driver = webdriver.Chrome(options=chrome_options, executable_path=chromedriver)
    driver.get(r'https://www.youtube.com/watch?v=dQw4w9WgXcQ')



if __name__ == '__main__':
    run()

если я запускаю его без браузера Chrome, откройте его нормально, если не он вылетает

0 ответов

Это сообщение об ошибке...

selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir

... означает, что ChromeDriver не смог инициировать / создать новый контекст просмотра, то есть сеанс браузера Chrome с использованием указанногоuser data directory поскольку он уже использовался.


Мне удалось воспроизвести ошибку в моем локальном окне Windows-10 следующим образом:

  • Блок кода:

    from selenium import webdriver
    import getpass
    
    options = webdriver.ChromeOptions() 
    options.add_argument("start-maximized")
    options.add_argument(r"--user-data-dir=C:\Users\{}\AppData\Local\Google\Chrome\User Data".format(getpass.getuser()))
    driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
    driver.get("https://www.google.com/")
    
  • Завершите соответствующую трассировку:

    [18516:23156:0204/032227.883:ERROR:cache_util_win.cc(21)] Unable to move the cache: Access is denied. (0x5)
    [18516:23156:0204/032227.898:ERROR:cache_util.cc(141)] Unable to move cache folder C:\Users\Soma Bhattacharjee\AppData\Local\Google\Chrome\User Data\ShaderCache\GPUCache to C:\Users\Soma Bhattacharjee\AppData\Local\Google\Chrome\User Data\ShaderCache\old_GPUCache_000
    [18516:23156:0204/032227.898:ERROR:disk_cache.cc(178)] Unable to create cache
    [18516:23156:0204/032227.898:ERROR:shader_disk_cache.cc(605)] Shader Cache Creation failed: -2
    Opening in existing browser session.
    Traceback (most recent call last):
    .
    selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: user data directory is already in use, please specify a unique value for --user-data-dir argument, or don't use --user-data-dir
    

Анализ

Трассировка стека ошибок явно жалуется на то, что доступ запрещен, поскольку программе не удалось переместить папку кеша..\ShaderCache\GPUCache к ..\ShaderCache\old_GPUCache_000. следовательно, создание кеша не удалось, и впоследствии не удалось создать Shader Cache Creation. Хотя эти проблемы вызываютInvalidArgumentExceptionно принудительно может открыть новое окно в существующем сеансе браузера Chrome.

Снимок существующего сеанса браузера Chrome:

Снимок нового окна в существующем сеансе браузера Chrome:


Вывод

Хотя возникает ошибка, новое окно Chrome запускается, но остается прикрепленным к уже открытому сеансу Chrome, но новое окно не может управляться экземпляром WebDriver.


Решение

Вам нужно позаботиться о нескольких вещах:

  • Если вы используете профиль Chrome по умолчанию для доступа к веб-страницам других работ на той же тестовой машине, вам не следует устанавливатьuser-data-dir в качестве пользовательских данных, поскольку они остаются заблокированными другим процессом Chrome, который вы инициировали вручную.
  • Если вы выполняете свои тесты в изолированной тестовой системе, вы можете установитьuser-data-dir как ..\User Data\Default для доступа к профилю Chrome по умолчанию.
  • Однако в соответствии с лучшими практиками вы всегда должны создавать новый профиль Chrome для выполнения тестов, поскольку профиль Chrome по умолчанию может содержать расширения, закладки, историю просмотров и т. Д. И может не загружаться должным образом.

Я также хотел запустить Selenium, используя свой профиль Chrome по умолчанию, но столкнулся с той же проблемой. Я решил это, скопировав папку UserData в другое место, а затем использовал новое место. Вот мой полный код:

from selenium import webdriver
options = webdriver.ChromeOptions() 
options.add_argument("user-data-dir=C:\\Users\\myusername\\Desktop\\User Data")
options.add_argument("--profile-directory=Profile 1");
browser = webdriver.Chrome(options=options) 
browser.get('https://www.google.com')

Удалите следующую строку из кода, если вы хотите использовать профиль Chrome по умолчанию, а не конкретный профиль, созданный для Selenium.

options.add_argument("--profile-directory=Profile 1");
Другие вопросы по тегам