How to open a Chrome Profile through --user-data-dir argument of Selenium
Asked Answered
P

3

31

I am attempting to load a chrome browser with selenium using my existing account and settings from my profile.

I can get this working using ChromeOptions to set the userdatadir and profile directory. This loads the browser with my profile like i want, but the browser then hangs for 60 seconds and times out without advancing through any more of the automation.

If I don't use the user data dir and profile settings, it works fine but doesn't use my profile.

The reading I've done points to not being able to have more than one browser open at a time with the same profile so I made sure nothing was open while I ran the program. It still hangs for 60 seconds even without another browser open.

m_Options = new ChromeOptions();
m_Options.AddArgument("--user-data-dir=C:/Users/Me/AppData/Local/Google/Chrome/User Data");
m_Options.AddArgument("--profile-directory=Default");
m_Options.AddArgument("--disable-extensions");
m_Driver = new ChromeDriver(@"pathtoexe", m_Options);
m_Driver.Navigate().GoToUrl("somesite");

It always hangs on the GoToUrl. I'm not sure what else to try.

Profess answered 1/6, 2018 at 1:58 Comment(0)
J
20

As per your code trials you were trying to load the Default Chrome Profile which will be against all the best practices as the Default Chrome Profile may contain either of the following:

  • Extensions
  • Bookmarks
  • Browsing History
  • etc

So the Default Chrome Profile may not be in compliance with you Test Specification and may raise exception while loading. Hence you should always use a customized Chrome Profile as below.

To create and open a new Chrome Profile you need to follow the following steps :

  • Open Chrome browser, click on the Side Menu and click on Settings on which the url chrome://settings/ opens up.
  • In People section, click on Manage other people on which a popup comes up.
  • Click on ADD PERSON, provide the person name, select an icon, keep the item Create a desktop shortcut for this user checked and click on ADD button.
  • Your new profile gets created.
  • Snapshot of a new profile SeLeNiUm

SeLeNiUm

  • Now a desktop icon will be created as SeLeNiUm - Chrome
  • From the properties of the desktop icon SeLeNiUm - Chrome get the name of the profile directory. e.g. --profile-directory="Profile 2"

profile-directory

  • Get the absolute path of the profile-directory in your system as follows :

    C:\\Users\\Thranor\\AppData\\Local\\Google\\Chrome\\User Data\\Profile 2
    
  • Now pass the value of profile-directory through an instance of ChromeOptions with AddArgument method along with key user-data-dir as follows :

    m_Options = new ChromeOptions();
    m_Options.AddArgument("--user-data-dir=C:/Users/Me/AppData/Local/Google/Chrome/User Data/Profile 2");
    m_Options.AddArgument("--disable-extensions");
    m_Driver = new ChromeDriver(@"pathtoexe", m_Options);
    m_Driver.Navigate().GoToUrl("somesite");
    
  • Execute your Test

  • Observe Chrome gets initialized with the Chrome Profile as SeLeNiUm

SeLeNiUm

Jolynjolynn answered 1/6, 2018 at 6:22 Comment(9)
adding the default to the end of user data dir as suggested causes it to CREATE a default folder inside the existing default folder and does not use my profile. It DID however run once. When attempting to rerun it without changing any code resulted in it hanging for 60 seconds which makes me think something isnt getting cleared properly after a test run but I cant figure out what.Profess
@Profess Checkout my updated answer and let me know the statusJolynjolynn
That was exactly what I was doing. Im not sure why it was acting all wonky with the directory structure and creating a new profile as a subdirectory. The browser WAS launching with my settings, it just wouldn't navigate. It would just hang on my home page and timeout after 60 seconds. The solution I came up with that has worked every time so far (15 tests currently) was to clone the profile to a location inside the project every time the program runs and then point selenium to that clone. I have no idea why this works but pointing to the actual profile doesn't work.Profess
@Profess Check out my answer update and let me know the statusJolynjolynn
Same problem here. Reproduced all the steps suggested, but only cloning works.Fatigued
Cloning didn't work for me in a Windows 10 environment. I had to clone and then type options.add_argument('no-sandbox') to get it to work. It is worth noting that using options.add_argument('user-data-dir=selenium') didn't work for me, I needed to use a full path. And experiments with pickle as an alternative way to handle cookies failed for me as well. Learn about the no-sandbox problem at github.com/theintern/intern/issues/878Obscure
@DebanjanB When I follow these steps and open Chrome using Selenium I got the option to choose between "Default" and "Selenium". Is it possible to set this somehow in the arguments?Enjambement
@Enjambement Let's discuss in details within Selenium Chat RoomJolynjolynn
I do not understand, if the shortcut what Chrome created is using the --profile-directory switch, then why we are using the --user-data-dit switch?Coeternity
S
2

If you want to run Chrome using your default profile (cause you need a extension), you need to run your script using another browser, like Microsoft Edge or Microsoft IE and your code will launch a Chrome instance.

My Code in PHP:

namespace Facebook\WebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Chrome\ChromeOptions;

require_once('vendor/autoload.php');

$host = 'http://localhost:4444/';

$options = new ChromeOptions();
$options->addArguments(array(
    '--user-data-dir=C:\Users\paulo\AppData\Local\Google\Chrome\User Data',
    '--profile-directory=Default',
    '--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
));
   
$caps = DesiredCapabilities::chrome();
$caps->setCapability(ChromeOptions::CAPABILITY, $options);
$caps->setPlatform("Windows");

$driver = RemoteWebDriver::create($host, $caps);

$driver ->manage()->window()->maximize();

$driver->get('https://www.google.com/');

// your code goes here.

$driver->quit();
Snitch answered 23/1, 2021 at 23:35 Comment(0)
A
-1

i guys, in my enviroment with chrome 63 and selenum for control, i have find same problem (60 second on wait for open webpage).

To fix i have find a way by setting a default webpage in chrome ./[user-data-dir]/[Profile]/Preferences file, this is a json data need to insert in "Preferences" file for obtain result

...
"session":{
  "restore_on_startup":4,
  "startup_urls":[
     "http://localhost/test1"
  ]
}
...

For set "Preferences" from selenium i have use this sample code

ChromeOptions chromeOptions = new ChromeOptions();

//set my user data dir
chromeOptions.addArguments("--user-data-dir=/usr/chromeDataDir/");  

//start create data structure to for insert json in "Preferences" file
Map<String, Object> prefs = new HashMap<String, Object>();
prefs.put("session.restore_on_startup", 4);
List<String> urlList = new ArrayList<String>();
urlList.add("http://localhost/test1");
prefs.put("session.startup_urls", urlList);

//set in chromeOptions data structure 
chromeOptions.setExperimentalOption("prefs", prefs);

//start chrome
ChromeDriver chromeDriver = new ChromeDriver(chromeOptions);
//this get command for open web page, response instant
chromeDriver.get("http://localhost/test2")

i have find information here https://chromedriver.chromium.org/capabilities

Append answered 9/6, 2022 at 16:47 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.