Открытый драйвер 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, который вы инициировали вручную.- В приведенном выше сценарии вам нужно создать и использовать другой профиль Chrome, и вы можете найти подробное обсуждение в разделе Как открыть профиль Chrome через Python.
- Если вы выполняете свои тесты в изолированной тестовой системе, вы можете установить
user-data-dir
как ..\User Data\Default для доступа к профилю Chrome по умолчанию.- В приведенном выше сценарии вам нужно создать и использовать другой профиль Chrome, и вы можете найти подробное обсуждение в разделе Как использовать профиль Chrome в Selenium Webdriver Python 3.
- Однако в соответствии с лучшими практиками вы всегда должны создавать новый профиль Chrome для выполнения тестов, поскольку профиль Chrome по умолчанию может содержать расширения, закладки, историю просмотров и т. Д. И может не загружаться должным образом.
- Вы можете найти подробное обсуждение в разделе Как открыть профиль Chrome с помощью аргумента --user-data-dir в Selenium.
Я также хотел запустить 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");