# 1. Open PowerShell as an Administrator # 2. Change directory to where you want Selenium repo to be cloned to # 3. Execute: `Set-ExecutionPolicy Bypass -Scope Process -Force` # 4. Run this script in the PowerShell terminal Function Install-ChocoPackage { param ( [string]$PackageName, [string]$ExecutableName, [string]$AdditionalParams = "" ) Write-Host "Checking installation of $PackageName" if (-Not (Get-Command $ExecutableName -ErrorAction SilentlyContinue)) { Write-Host "Installing $PackageName..." choco install $PackageName -y $AdditionalParams refreshenv -Path ... } else { Write-Host "$PackageName is already installed." } } Function Install-JDK17 { $javacInstalled = Get-Command javac -ErrorAction SilentlyContinue $javaVersion = if ($javacInstalled) { & javac -version 2>&1 | Select-String -Pattern '"(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value } } if (-Not $javacInstalled -or [int]$javaVersion -ne 17) { Install-ChocoPackage -PackageName "openjdk17" -ExecutableName "javac" } else { Write-Host "JDK 17 is already installed." } } Function Set-JavaEnvironmentVariable { $javacPath = Get-ChildItem -Path 'C:\Program Files\' -Recurse -Filter 'javac.exe' | Select-Object -First 1 -ExpandProperty DirectoryName $javaHome = Split-Path -Path $javacPath Write-Host "Set JAVA_HOME environment variable to $javaHome" [System.Environment]::SetEnvironmentVariable('JAVA_HOME', $javaHome, [System.EnvironmentVariableTarget]::Machine) refreshenv -JAVA_HOME ... } Function Update-EnvironmentVariables { Param ([string]$VariableName, [string]$Value) $currentValue = [Environment]::GetEnvironmentVariable($VariableName, [EnvironmentVariableTarget]::User) if (-not $currentValue -or $currentValue -ne $Value) { Write-Host "Setting $VariableName to $Value" [Environment]::SetEnvironmentVariable($VariableName, $Value, [System.EnvironmentVariableTarget]::User) refreshenv -$VariableName ... } else { Write-Host "$VariableName is already set to $currentValue" } } Function Clone-Repository { param ( [string]$RepoUrl ) $cloneChoice = Read-Host "Do you want to clone the repository at $RepoUrl (Y/N)" if ($cloneChoice -eq 'Y' -or $cloneChoice -eq 'y') { Write-Host "Cloning the repository from $RepoUrl into the current directory" $cloneOptions = "" $depthChoice = Read-Host -Prompt "Do you want [C]omplete or [S]hallow clone?" if ($depthChoice -ne 'C' -and $depthChoice -ne 'c') { $cloneOptions = "--depth=1" } $gitPath = "C:\Program Files\Git\bin\git.exe" Write-Host "$gitPath clone $RepoUrl $cloneOptions" & $gitPath clone $RepoUrl $cloneOptions } } Function Install-IntelliJ { Install-ChocoPackage -PackageName "intellijidea-community" -ExecutableName "idea64" $ideaPath = Get-ChildItem -Path "C:\Program Files\JetBrains" -Filter idea64.exe -Recurse -ErrorAction SilentlyContinue -Force | Select-Object -First 1 -ExpandProperty FullName & $ideaPath installPlugins "com.google.idea.bazel.ijwb" & $ideaPath installPlugins "google-java-format" Write-Host "Setting up Java Format IntelliJ plugin" $ideaDirectory = Split-Path -Path $ideaPath -Parent $intelliJInstallationFolder = Split-Path -Path $ideaDirectory -Parent $fullVersion = (Split-Path -Path $intelliJInstallationFolder -Leaf) -replace "IntelliJ IDEA Community Edition ", "" $intelliJVersionName = "IdeaIC" + (($fullVersion -split '\.')[0,1] -join '.') $ideaDataPath = Join-Path -Path $env:APPDATA -ChildPath "JetBrains\$intelliJVersionName" if (-not (Test-Path -Path $ideaDataPath)) { New-Item -ItemType Directory -Path $ideaDataPath -Force | Out-Null } $vmOptionsFilePath = Join-Path -Path $ideaDataPath -ChildPath "idea64.exe.vmoptions" if (-not (Test-Path -Path $vmOptionsFilePath)) { New-Item -ItemType File -Path $vmOptionsFilePath | Out-Null } $linesToAdd = @( "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED", "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" ) Add-Content -Path $vmOptionsFilePath -Value $linesToAdd } Write-Host "Set Execution Policy for future processes; (Ignore Warning)" Set-ExecutionPolicy -ExecutionPolicy RemoteSigned Write-Host "Enable Developer Mode" reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1" Write-Host "Install Chocolatey if not already installed" if (-Not (Get-Command choco -ErrorAction SilentlyContinue)) { [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) } Install-JDK17 Set-JavaEnvironmentVariable Install-ChocoPackage -PackageName "git" -ExecutableName "git" Install-ChocoPackage -PackageName "bazelisk" -ExecutableName "bazel" Install-ChocoPackage -PackageName "msys2" -ExecutableName "C:\tools\msys64\usr\bin\bash.exe" -AdditionalParams "--params '/InstallDir=C:\tools\msys64'" Update-EnvironmentVariables -VariableName "PATH" -Value "C:\tools\msys64\usr\bin" Update-EnvironmentVariables -VariableName "BAZEL_SH" -Value "C:\tools\msys64\usr\bin\bash.exe" Install-ChocoPackage -PackageName "visualstudio2022community" -ExecutableName "devenv" Start-Process "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe" Read-Host -Prompt "Install C++ in Visual Studio then Press Enter to continue" $bazelVcPath = "C:\Program Files\Microsoft Visual Studio\2022\Community\VC" Update-EnvironmentVariables -VariableName "BAZEL_VC" -Value $bazelVcPath $vcToolsPath = Get-ChildItem -Path "$bazelVcPath\Tools\MSVC" | Sort-Object Name -Descending | Select-Object -First 1 $vcToolsVersion = $vcToolsPath.Name Update-EnvironmentVariables -VariableName "BAZEL_VC_FULL_VERSION" -Value $vcToolsVersion Clone-Repository -RepoUrl "https://github.com/SeleniumHQ/selenium.git" $longPathSupport = Read-Host "Do you want to change settings to better manage long file paths (recommended) (Y/N)" if ($longPathSupport -eq 'Y' -or $longPathSupport -eq 'y') { Write-Host "Enable UNC Path support" reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1" Write-Host "Enable Long Path support" reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1" Write-Host "Enable creating short name versions of long file paths" fsutil 8dot3name set 0 Write-Host "Set bazel output to C:/tmp instead of nested inside project directory" $currentDirectory = Get-Location $filePath = [System.IO.Path]::Combine($currentDirectory, "selenium/.bazelrc.windows.local") $text = "startup --output_user_root=C:/tmp" $encoding = New-Object System.Text.UTF8Encoding($false) [System.IO.File]::WriteAllText($filePath, $text, $encoding) } $intelliJChoice = Read-Host "Do you want to install and setup IntelliJ (Y/N)" if ($intelliJChoice -eq 'Y' -or $intelliJChoice -eq 'y') { Install-IntelliJ } $restartChoice = Read-Host "Do you want to restart the computer now? (Y/N)" if ($restartChoice -eq 'Y' -or $restartChoice -eq 'y') { Restart-Computer }