Best Rod code snippet using launcher.UserDataDir
launcher.go
Source:launcher.go  
...15	"github.com/moredure/xrod/lib/launcher/flags"16	"github.com/moredure/xrod/lib/utils"17	"github.com/ysmood/leakless"18)19// DefaultUserDataDirPrefix ...20var DefaultUserDataDirPrefix = filepath.Join(os.TempDir(), "rod", "user-data")21// Launcher is a helper to launch browser binary smartly22type Launcher struct {23	Flags map[flags.Flag][]string `json:"flags"`24	ctx       context.Context25	ctxCancel func()26	logger io.Writer27	browser *Browser28	parser  *URLParser29	pid     int30	exit    chan struct{}31	managed    bool32	serviceURL string33}34// New returns the default arguments to start browser.35// Headless will be enabled by default.36// Leakless will be enabled by default.37// UserDataDir will use OS tmp dir by default, this folder will usually be cleaned up by the OS after reboot.38func New() *Launcher {39	dir := defaults.Dir40	if dir == "" {41		dir = filepath.Join(DefaultUserDataDirPrefix, utils.RandString(8))42	}43	defaultFlags := map[flags.Flag][]string{44		flags.Bin:      {defaults.Bin},45		flags.Leakless: nil,46		flags.UserDataDir: {dir},47		// use random port by default48		flags.RemoteDebuggingPort: {defaults.Port},49		// enable headless by default50		flags.Headless: nil,51		// to disable the init blank window52		"no-first-run":      nil,53		"no-startup-window": nil,54		// TODO: about the "site-per-process" see https://github.com/puppeteer/puppeteer/issues/254855		"disable-features": {"site-per-process", "TranslateUI"},56		"disable-background-networking":                      nil,57		"disable-background-timer-throttling":                nil,58		"disable-backgrounding-occluded-windows":             nil,59		"disable-breakpad":                                   nil,60		"disable-client-side-phishing-detection":             nil,61		"disable-component-extensions-with-background-pages": nil,62		"disable-default-apps":                               nil,63		"disable-dev-shm-usage":                              nil,64		"disable-hang-monitor":                               nil,65		"disable-ipc-flooding-protection":                    nil,66		"disable-popup-blocking":                             nil,67		"disable-prompt-on-repost":                           nil,68		"disable-renderer-backgrounding":                     nil,69		"disable-sync":                                       nil,70		"enable-automation":                                  nil,71		"enable-features":                                    {"NetworkService", "NetworkServiceInProcess"},72		"force-color-profile":                                {"srgb"},73		"metrics-recording-only":                             nil,74		"use-mock-keychain":                                  nil,75	}76	if defaults.Show {77		delete(defaultFlags, flags.Headless)78	}79	if defaults.Devtools {80		defaultFlags["auto-open-devtools-for-tabs"] = nil81	}82	if inContainer {83		defaultFlags[flags.NoSandbox] = nil84	}85	if defaults.Proxy != "" {86		defaultFlags[flags.ProxyServer] = []string{defaults.Proxy}87	}88	ctx, cancel := context.WithCancel(context.Background())89	return &Launcher{90		ctx:       ctx,91		ctxCancel: cancel,92		Flags:     defaultFlags,93		exit:      make(chan struct{}),94		browser:   NewBrowser(),95		parser:    NewURLParser(),96		logger:    ioutil.Discard,97	}98}99// NewUserMode is a preset to enable reusing current user data. Useful for automation of personal browser.100// If you see any error, it may because you can't launch debug port for existing browser, the solution is to101// completely close the running browser. Unfortunately, there's no API for rod to tell it automatically yet.102func NewUserMode() *Launcher {103	ctx, cancel := context.WithCancel(context.Background())104	bin, _ := LookPath()105	return &Launcher{106		ctx:       ctx,107		ctxCancel: cancel,108		Flags: map[flags.Flag][]string{109			flags.RemoteDebuggingPort: {"37712"},110			"no-startup-window":       nil,111			flags.Bin:                 {bin},112		},113		browser: NewBrowser(),114		exit:    make(chan struct{}),115		parser:  NewURLParser(),116		logger:  ioutil.Discard,117	}118}119// NewAppMode is a preset to run the browser like a native application.120func NewAppMode(u string) *Launcher {121	l := New()122	l.Set(flags.App, u).123		Set(flags.Env, "GOOGLE_API_KEY=no").124		Headless(false).125		Delete("no-startup-window").126		Delete("enable-automation")127	return l128}129// Context sets the context130func (l *Launcher) Context(ctx context.Context) *Launcher {131	ctx, cancel := context.WithCancel(ctx)132	l.ctx = ctx133	l.parser.Context(ctx)134	l.ctxCancel = cancel135	return l136}137// Set a command line argument to launch the browser.138func (l *Launcher) Set(name flags.Flag, values ...string) *Launcher {139	if strings.Contains(string(name), "=") {140		panic("flag name should not contain '='")141	}142	l.Flags[l.normalizeFlag(name)] = values143	return l144}145// Get flag's first value146func (l *Launcher) Get(name flags.Flag) string {147	if list, has := l.GetFlags(name); has {148		return list[0]149	}150	return ""151}152// Has flag or not153func (l *Launcher) Has(name flags.Flag) bool {154	_, has := l.GetFlags(name)155	return has156}157// GetFlags from settings158func (l *Launcher) GetFlags(name flags.Flag) ([]string, bool) {159	flag, has := l.Flags[l.normalizeFlag(name)]160	return flag, has161}162// Append values to the flag163func (l *Launcher) Append(name flags.Flag, values ...string) *Launcher {164	flags, has := l.GetFlags(name)165	if !has {166		flags = []string{}167	}168	return l.Set(name, append(flags, values...)...)169}170// Delete a flag171func (l *Launcher) Delete(name flags.Flag) *Launcher {172	delete(l.Flags, l.normalizeFlag(name))173	return l174}175// Bin of the browser binary path to launch, if the path is not empty the auto download will be disabled176func (l *Launcher) Bin(path string) *Launcher {177	return l.Set(flags.Bin, path)178}179// Revision of the browser to auto download180func (l *Launcher) Revision(rev int) *Launcher {181	l.browser.Revision = rev182	return l183}184// Headless switch. Whether to run browser in headless mode. A mode without visible UI.185func (l *Launcher) Headless(enable bool) *Launcher {186	if enable {187		return l.Set(flags.Headless)188	}189	return l.Delete(flags.Headless)190}191// NoSandbox switch. Whether to run browser in no-sandbox mode.192// Linux users may face "running as root without --no-sandbox is not supported" in some Linux/Chrome combinations. This function helps switch mode easily.193// Be aware disabling sandbox is not trivial. Use at your own risk.194// Related doc: https://bugs.chromium.org/p/chromium/issues/detail?id=638180195func (l *Launcher) NoSandbox(enable bool) *Launcher {196	if enable {197		return l.Set(flags.NoSandbox)198	}199	return l.Delete(flags.NoSandbox)200}201// XVFB enables to run browser in by XVFB. Useful when you want to run headful mode on linux.202func (l *Launcher) XVFB(args ...string) *Launcher {203	return l.Set(flags.XVFB, args...)204}205// Leakless switch. If enabled, the browser will be force killed after the Go process exits.206// The doc of leakless: https://github.com/ysmood/leakless.207func (l *Launcher) Leakless(enable bool) *Launcher {208	if enable {209		return l.Set(flags.Leakless)210	}211	return l.Delete(flags.Leakless)212}213// Devtools switch to auto open devtools for each tab214func (l *Launcher) Devtools(autoOpenForTabs bool) *Launcher {215	if autoOpenForTabs {216		return l.Set("auto-open-devtools-for-tabs")217	}218	return l.Delete("auto-open-devtools-for-tabs")219}220// UserDataDir is where the browser will look for all of its state, such as cookie and cache.221// When set to empty, browser will use current OS home dir.222// Related doc: https://chromium.googlesource.com/chromium/src/+/master/docs/user_data_dir.md223func (l *Launcher) UserDataDir(dir string) *Launcher {224	if dir == "" {225		l.Delete(flags.UserDataDir)226	} else {227		l.Set(flags.UserDataDir, dir)228	}229	return l230}231// ProfileDir is the browser profile the browser will use.232// When set to empty, the profile 'Default' is used.233// Related article: https://superuser.com/a/377195234func (l *Launcher) ProfileDir(dir string) *Launcher {235	if dir == "" {236		l.Delete("profile-directory")237	} else {238		l.Set("profile-directory", dir)239	}240	return l241}242// RemoteDebuggingPort to launch the browser. Zero for a random port. Zero is the default value.243// If it's not zero and the Launcher.Leakless is disabled, the launcher will try to reconnect to it first,244// if the reconnection fails it will launch a new browser.245func (l *Launcher) RemoteDebuggingPort(port int) *Launcher {246	return l.Set(flags.RemoteDebuggingPort, fmt.Sprintf("%d", port))247}248// Proxy switch. When disabled leakless will be disabled.249func (l *Launcher) Proxy(host string) *Launcher {250	return l.Set(flags.ProxyServer, host)251}252// WorkingDir to launch the browser process.253func (l *Launcher) WorkingDir(path string) *Launcher {254	return l.Set(flags.WorkingDir, path)255}256// Env to launch the browser process. The default value is os.Environ().257// Usually you use it to set the timezone env. Such as:258//259//	Env(append(os.Environ(), "TZ=Asia/Tokyo")...)260func (l *Launcher) Env(env ...string) *Launcher {261	return l.Set(flags.Env, env...)262}263// StartURL to launch264func (l *Launcher) StartURL(u string) *Launcher {265	return l.Set("", u)266}267// FormatArgs returns the formated arg list for cli268func (l *Launcher) FormatArgs() []string {269	execArgs := []string{}270	for k, v := range l.Flags {271		if k == flags.Arguments {272			continue273		}274		if strings.HasPrefix(string(k), "rod-") {275			continue276		}277		// fix a bug of chrome, if path is not absolute chrome will hang278		if k == flags.UserDataDir {279			abs, err := filepath.Abs(v[0])280			utils.E(err)281			v[0] = abs282		}283		str := "--" + string(k)284		if v != nil {285			str += "=" + strings.Join(v, ",")286		}287		execArgs = append(execArgs, str)288	}289	execArgs = append(execArgs, l.Flags[flags.Arguments]...)290	sort.Strings(execArgs)291	return execArgs292}293// Logger to handle stdout and stderr from browser.294// For example, pipe all browser output to stdout: launcher.New().Logger(os.Stdout)295func (l *Launcher) Logger(w io.Writer) *Launcher {296	l.logger = w297	return l298}299// MustLaunch is similar to Launch300func (l *Launcher) MustLaunch() string {301	u, err := l.Launch()302	utils.E(err)303	return u304}305// Launch a standalone temp browser instance and returns the debug url.306// bin and profileDir are optional, set them to empty to use the default values.307// If you want to reuse sessions, such as cookies, set the UserDataDir to the same location.308func (l *Launcher) Launch() (string, error) {309	defer l.ctxCancel()310	bin, err := l.getBin()311	if err != nil {312		return "", err313	}314	var ll *leakless.Launcher315	var cmd *exec.Cmd316	if l.Has(flags.Leakless) && leakless.Support() {317		ll = leakless.New()318		cmd = ll.Command(bin, l.FormatArgs()...)319	} else {320		port := l.Get(flags.RemoteDebuggingPort)321		u, err := ResolveURL(port)322		if err == nil {323			return u, nil324		}325		cmd = exec.Command(bin, l.FormatArgs()...)326	}327	l.setupCmd(cmd)328	err = cmd.Start()329	if err != nil {330		return "", err331	}332	if ll == nil {333		l.pid = cmd.Process.Pid334	} else {335		l.pid = <-ll.Pid()336		if ll.Err() != "" {337			return "", errors.New(ll.Err())338		}339	}340	go func() {341		_ = cmd.Wait()342		close(l.exit)343	}()344	u, err := l.getURL()345	if err != nil {346		l.Kill()347		return "", err348	}349	return ResolveURL(u)350}351func (l *Launcher) setupCmd(cmd *exec.Cmd) {352	l.osSetupCmd(cmd)353	dir := l.Get(flags.WorkingDir)354	env, _ := l.GetFlags(flags.Env)355	cmd.Dir = dir356	cmd.Env = env357	cmd.Stdout = io.MultiWriter(l.logger, l.parser)358	cmd.Stderr = io.MultiWriter(l.logger, l.parser)359}360func (l *Launcher) getBin() (string, error) {361	bin := l.Get(flags.Bin)362	if bin == "" {363		l.browser.Context = l.ctx364		return l.browser.Get()365	}366	return bin, nil367}368func (l *Launcher) getURL() (u string, err error) {369	select {370	case <-l.ctx.Done():371		err = l.ctx.Err()372	case u = <-l.parser.URL:373	case <-l.exit:374		err = l.parser.Err()375	}376	return377}378// PID returns the browser process pid379func (l *Launcher) PID() int {380	return l.pid381}382// Kill the browser process383func (l *Launcher) Kill() {384	// TODO: If kill too fast, the browser's children processes may not be ready.385	// Browser don't have an API to tell if the children processes are ready.386	utils.Sleep(1)387	if l.PID() == 0 { // avoid killing the current process388		return389	}390	killGroup(l.PID())391	p, err := os.FindProcess(l.PID())392	if err == nil {393		_ = p.Kill()394	}395}396// Cleanup wait until the Browser exits and remove UserDataDir397func (l *Launcher) Cleanup() {398	<-l.exit399	dir := l.Get(flags.UserDataDir)400	_ = os.RemoveAll(dir)401}402func (l *Launcher) normalizeFlag(name flags.Flag) flags.Flag {403	return flags.Flag(strings.TrimLeft(string(name), "-"))404}...launcher_test.go
Source:launcher_test.go  
...109	g.False(has)110	l.Append("test-append", "a")111	f := l.Get("test-append")112	g.Eq("a", f)113	dir := l.Get(flags.UserDataDir)114	port := 58472115	l = l.Context(g.Context()).Delete("test").Bin("").116		Revision(launcher.RevisionDefault).117		Logger(ioutil.Discard).118		Leakless(false).Leakless(true).119		Headless(false).Headless(true).RemoteDebuggingPort(port).120		NoSandbox(true).NoSandbox(false).121		Devtools(true).Devtools(false).122		StartURL("about:blank").123		Proxy("test.com").124		UserDataDir("test").UserDataDir(dir).125		WorkingDir("").126		Env(append(os.Environ(), "TZ=Asia/Tokyo")...)127	g.Eq(l.FormatArgs(), []string /* len=6 cap=8 */ {128		"--headless",129		`--no-startup-window`,           /* len=19 */130		`--proxy-server=test.com`,       /* len=23 */131		`--remote-debugging-port=58472`, /* len=29 */132		"--test-append=a",133		"about:blank",134	})135	url := l.MustLaunch()136	g.Eq(url, launcher.NewUserMode().RemoteDebuggingPort(port).MustLaunch())137}138func TestUserModeErr(t *testing.T) {139	g := setup(t)140	_, err := launcher.NewUserMode().RemoteDebuggingPort(48277).Bin("not-exists").Launch()141	g.Err(err)142	_, err = launcher.NewUserMode().RemoteDebuggingPort(58217).Bin("echo").Launch()143	g.Err(err)144}145func TestAppMode(t *testing.T) {146	g := setup(t)147	l := launcher.NewAppMode("http://example.com")148	g.Eq(l.Get(flags.App), "http://example.com")149}150func TestGetWebSocketDebuggerURLErr(t *testing.T) {151	g := setup(t)152	_, err := launcher.ResolveURL("1://")153	g.Err(err)154}155func TestLaunchErr(t *testing.T) {156	g := setup(t)157	g.Panic(func() {158		launcher.New().Bin("not-exists").MustLaunch()159	})160	g.Panic(func() {161		launcher.New().Headless(false).Bin("not-exists").MustLaunch()162	})163	g.Panic(func() {164		launcher.New().ClientHeader()165	})166	{167		l := launcher.New().XVFB()168		_, _ = l.Launch()169		l.Kill()170	}171}172func newBrowser() (*launcher.Browser, func()) {173	ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)174	b := launcher.NewBrowser()175	if !testing.Verbose() {176		b.Logger = utils.LoggerQuiet177	}178	b.Context = ctx179	return b, cancel180}181var testProfileDir = flag.Bool("test-profile-dir", false, "set it to test profile dir")182func TestProfileDir(t *testing.T) {183	g := setup(t)184	url := launcher.New().Headless(false).185		ProfileDir("").ProfileDir("test-profile-dir")186	if !*testProfileDir {187		g.Skip("It's not CI friendly, so we skip it!")188	}189	url.MustLaunch()190	userDataDir := url.Get(flags.UserDataDir)191	file, err := os.Stat(filepath.Join(userDataDir, "test-profile-dir"))192	g.E(err)193	g.True(file.IsDir())194}195func TestBrowserExists(t *testing.T) {196	g := setup(t)197	b := launcher.NewBrowser()198	b.Revision = 0199	g.False(b.Exists())200	// fake a broken executable201	g.E(utils.Mkdir(b.Destination()))202	g.Cleanup(func() { _ = os.RemoveAll(b.Destination()) })203	g.False(b.Exists())204}...UserDataDir
Using AI Code Generation
1import (2func main() {3    widgets.NewQApplication(len(os.Args), os.Args)4    var app = widgets.NewQApplication(len(os.Args), os.Args)5    var window = widgets.NewQMainWindow(nil, 0)6    var launcher = NewLauncher(nil)7    var userDataDir = launcher.UserDataDir()8    fmt.Println("userDataDir", userDataDir)9    var view = webengine.NewQWebEngineView(window)10    view.Show()11    window.SetCentralWidget(view)12    window.Show()13    app.Exec()14}15import (16func main() {17    widgets.NewQApplication(len(os.Args), os.Args)18    var app = widgets.NewQApplication(len(os.Args), os.Args)19    var window = widgets.NewQMainWindow(nil, 0)20    var launcher = NewLauncher(nil)21    var userDataDir = launcher.UserDataDir()22    fmt.Println("userDataDir", userDataDir)23    var view = webengine.NewQWebEngineView(window)24    view.Load(coreUserDataDir
Using AI Code Generation
1import (2func main() {3	widgets.NewQApplication(len(os.Args), os.Args)4	launcher := core.NewQProcess(nil)5	launcher.SetProgram("launcher")6	launcher.SetArguments([]string{"--user-data-dir"})7	launcher.Start()8	launcher.WaitForFinished(-1)9	output := launcher.ReadAllStandardOutput()10	fmt.Println(output)11	widgets.QApplication_Exec()12}13int main(int argc, char *argv[])14{15    QCoreApplication app(argc, argv);16    QCoreApplication::setApplicationName("launcher");17    QCoreApplication::setApplicationVersion("1.0");18    QCommandLineParser parser;19    parser.setApplicationDescription("launcher");20    parser.addHelpOption();21    parser.addVersionOption();22    parser.addPositionalArgument("user-data-dir", "Path to user data dir");23    parser.process(app);24    const QStringList args = parser.positionalArguments();25    const QString path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);26    if (!args.isEmpty())27        std::cout << path.toStdString() << std::endl;28    return 0;29}30win32 {UserDataDir
Using AI Code Generation
1import (2func main() {3	widgets.NewQApplication(len(os.Args), os.Args)4	if runtime.GOOS == "windows" {5		exePath, err := os.Executable()6		if err != nil {7			panic(err)8		}9		appDataPath := filepath.Join(os.Getenv("APPDATA"), "Qt", "QtWebEngine", "Default")10		cmd := exec.Command(exePath, "--type=renderer", "--no-sandbox", fmt.Sprintf("--app-data-dir=%v", appDataPath))11		cmd.Start()12		cmd.Wait()13	}14	widgets.QApplication_Exec()15}16import (17func main() {18	widgets.NewQApplication(len(os.Args), os.Args)19	if runtime.GOOS == "windows" {20		exePath, err := os.Executable()21		if err != nil {22			panic(err)23		}24		cmd := exec.Command(exePath, "--type=renderer", "--no-sandbox", fmt.Sprintf("--app-name=%v", "MyApp"))25		cmd.Start()26		cmd.Wait()27	}28	widgets.QApplication_Exec()29}30import (31func main() {32	widgets.NewQApplication(len(os.Args), os.Args)UserDataDir
Using AI Code Generation
1import (2func main() {3	app := widgets.NewQApplication(len(os.Args), os.Args)4	launcher := widgets.NewQDesktopServices()5	fmt.Println(launcher.UserDataDir())6}7import (8func main() {9	app := widgets.NewQApplication(len(os.Args), os.Args)10	launcher := widgets.NewQDesktopServices()11}12import (13func main() {14	app := widgets.NewQApplication(len(os.Args), os.Args)15	launcher := widgets.NewQDesktopServices()16}17import (18func main() {19	app := widgets.NewQApplication(len(os.Args), os.Args)20	launcher := widgets.NewQDesktopServices()21	fmt.Println(launcher.StorageLocation(0))22}23import (24func main() {25	app := widgets.NewQApplication(len(os.Args), os.Args)26	launcher := widgets.NewQDesktopServices()27	launcher.SetUrlHandler("http", nil, nil)28}29import (30func main() {31	app := widgets.NewQApplication(len(os.Args), os.Args)32	launcher := widgets.NewQDesktopServices()33	launcher.UnsetUrlHandler("http")34}35import (36func main() {37	app := widgets.NewQApplication(len(os.Args), os.Args)UserDataDir
Using AI Code Generation
1import (2func main() {3	app := widgets.NewQApplication(len(os.Args), os.Args)4	window := widgets.NewQMainWindow(nil, 0)5	window.SetWindowTitle("Hello World Example")6	window.SetMinimumSize2(200, 200)7	label := widgets.NewQLabel2("Hello World!", nil, 0)8	window.SetCentralWidget(label)9	window.Show()10	app.Exec()11}12import (13func main() {14	app := widgets.NewQApplication(len(os.Args), os.Args)15	window := widgets.NewQMainWindow(nil, 0)16	window.SetWindowTitle("Hello World Example")17	window.SetMinimumSize2(200, 200)18	label := widgets.NewQLabel2("Hello World!", nil, 0)19	window.SetCentralWidget(label)20	window.Show()21	app.Exec()22}23import (24func main() {25	app := widgets.NewQApplication(len(os.Args), os.Args)26	window := widgets.NewQMainWindow(nil, 0)27	window.SetWindowTitle("Hello World Example")28	window.SetMinimumSize2(200, 200)29	label := widgets.NewQLabel2("Hello World!", nil, 0)30	window.SetCentralWidget(label)31	window.Show()32	app.Exec()33}34import (UserDataDir
Using AI Code Generation
1import (2func main() {3	widgets.NewQApplication(len(os.Args), os.Args)4	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")5	fmt.Println(path)6}7import (8func main() {9	widgets.NewQApplication(len(os.Args), os.Args)10	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")11	fmt.Println(path)12}13import (14func main() {15	widgets.NewQApplication(len(os.Args), os.Args)16	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")17	fmt.Println(path)18}19import (20func main() {21	widgets.NewQApplication(len(os.Args), os.Args)22	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")23	fmt.Println(path)24}25import (26func main() {27	widgets.NewQApplication(len(os.Args), os.Args)28	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")29	fmt.Println(path)30}31import (32func main() {33	widgets.NewQApplication(len(os.Args), os.Args)34	path := filepath.Join(widgets.QApplication_ApplicationDirPath(), "test.txt")35	fmt.Println(path)36}37import (UserDataDir
Using AI Code Generation
1import(2func main() {3	launcher := widgets.NewQApplication(len(os.Args), os.Args)4	fmt.Println(launcher.UserDataDir())5}6import(7func main() {8	launcher := widgets.NewQApplication(len(os.Args), os.Args)9	fmt.Println(launcher.ApplicationName())10}11import(12func main() {13	launcher := widgets.NewQApplication(len(os.Args), os.Args)14	fmt.Println(launcher.ApplicationVersion())15}16import(17func main() {18	launcher := widgets.NewQApplication(len(os.Args), os.Args)UserDataDir
Using AI Code Generation
1import java.io.File;2public class Launcher {3    public static void main(String[] args) {4        File file = UserDataDir.getUserDataDir();5        System.out.println(file);6    }7}8import "C"9import "fmt"10func main() {11    fmt.Println(C.UserDataDir())12}13import "C"14import "fmt"15func main() {16    fmt.Println(C.UserDataDir())17}18import "fmt"19func main() {20    fmt.Println(UserDataDir())21}22import "fmt"23func main() {24    fmt.Println(UserDataDir())25}26import "fmt"27func main() {28    fmt.Println(UserDataDir())29}30import "fmt"31func main() {32    fmt.Println(UserDataDir())33}34import "fmt"35func main() {36    fmt.Println(UserDataDir())37}38import "fmt"39func main() {40    fmt.Println(UserDataDir())41}42import "fmt"43func main() {44    fmt.Println(UserDataDir())45}46import "fmt"47func main() {48    fmt.Println(UserDataDir())49}50import "fmt"51func main() {52    fmt.Println(UserDataDir())53}54import "fmt"55func main() {56    fmt.Println(UserDataDir())57}58import "fmt"59func main() {60    fmt.Println(UserDataDir())61}62import "fmt"63func main() {64    fmt.Println(UserUserDataDir
Using AI Code Generation
1import (2func main() {3	ex, err := os.Executable()4	if err != nil {5		panic(err)6	}7	exPath := filepath.Dir(ex)Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
