How to initiate a new Chrome session when the defa

2020-03-03 08:18发布

问题:

I am trying to open a web page using the selenium python library with my default user, it is critical that the script uses the default user but if my chrome browser is already open the script crashes and gives me this error:

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

I have tried all the solutions given here :

Selenium chromedriver won't launch URL if another chrome instance is open

Selenium won't open a new URL in a new tab (Python & Chrome)

and read that there was a bug in older chromedriver versions but it was fixed in chrome 74 (which im using ) : 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()

if i run it without a chrome browser open its fine if not it crashes

回答1:

I also wanted to run Selenium using my default Chrome profile but I came across the same issue. I solved it by copying my UserData folder to another location then I used the new location. Here is my complete code:

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

Remove the following line from the code if you would like to use your default Chrome profile not a specific profile you created for Selenium.

options.add_argument("--profile-directory=Profile 1");


回答2:

This error message...

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

...implies that the ChromeDriver was unable to initiate/spawn a new Browsing Context i.e. Chrome Browser session using the specified user data directory as it was already in use.


I was able to reproduce the error in my local windows-10box as follows:

  • Code Block:

    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/")
    
  • Complete relevant traceback:

    [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
    

Analysis

The error stack trace clearly complains of Access is denied as the program was unable to move the cache folder ..\ShaderCache\GPUCache to ..\ShaderCache\old_GPUCache_000. hence the creation of cache failed and subsequently creation of Shader Cache Creation failed. Though these issues raises the InvalidArgumentException but forcefully able to open a new window within the existing Chrome Browser Session.

Snapshot of existing Chrome Browser Session:

Snapshot of new window within the existing Chrome Browser Session:


Conclusion

Though the error is thrown still the new Chrome window gets initiated but remains attached with the already opened Chrome session but the new window can't be controlled by the WebDriver instance.


Solution

You need to take care of a couple of things:

  • If you are using the Default Chrome Profile to access webpages for your other work on the same Test Machine, you shouldn't set user-data-dir as the User Data as it remains locked by the other Chrome process you have initiated manually.
    • In the above scenario you need to create and use another Chrome Profile and you can find a detailed discussion in How to open a Chrome Profile through Python
  • If you are executing your tests in a isolated test system, you can set user-data-dir as ..\User Data\Default to access the Default Chrome Profile.
    • In the above scenario you need to create and use another Chrome Profile and you can find a detailed discussion in How to use Chrome Profile in Selenium Webdriver Python 3
  • However as per best practices you must always create a new Chrome Profile to execute your tests as the Default Chrome Profile may contain Extensions, Bookmarks, Browsing History, etc, and may not load properly.
    • You can find a detailed discussion in How to open a Chrome Profile through --user-data-dir argument of Selenium