6

我正在尝试使用我的默认用户使用 selenium python 库打开一个网页,脚本使用默认用户很重要,但是如果我的 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

我已经尝试了这里给出的所有解决方案:

如果另一个 chrome 实例打开,Selenium chromedriver 将不会启动 URL

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 浏览器的情况下运行它,打开它很好,如果不是它崩溃

4

2 回答 2

1

此错误消息...

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因为它已经在使用中。


我能够在我的本地框中重现错误,如下所示:

  • 代码块:

    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. 因此创建缓存失败,随后创建着色器缓存失败。尽管这些问题引发了InvalidArgumentException但能够在现有的Chrome 浏览器会话中打开一个新窗口。

现有 Chrome 浏览器会话的快照:

现有会话

现有 Chrome 浏览器会话中的新窗口快照:

new_window_within_existing_session


结论

尽管仍然抛出错误,但新的 Chrome 窗口仍会启动,但仍与已打开的Chrome会话连接,但新窗口无法由WebDriver实例控制。


解决方案

你需要注意几件事:

  • 如果您使用默认 Chrome 配置文件在同一台测试机上访问其他工作的网页,则不应将其设置user-data-dir用户数据,因为它仍被您手动启动的其他 Chrome 进程锁定。
  • 如果您在隔离的测试系统中执行测试,您可以设置user-data-dir..\User Data\Default以访问默认 Chrome 配置文件
  • 然而,根据最佳实践,您必须始终创建一个新的Chrome 配置文件来执行您的测试,因为默认 Chrome 配置文件可能包含ExtensionsBookmarksBrowsing History等,并且可能无法正确加载。
于 2020-02-03T23:24:43.930 回答
0

我还想使用我的默认 Chrome 配置文件运行 Selenium,但我遇到了同样的问题。我通过将我的 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");
于 2020-01-31T13:56:58.900 回答