Skip to content

Instantly share code, notes, and snippets.

@florentbr
Last active October 5, 2023 22:07
Show Gist options
  • Save florentbr/6be960752fc852ee99eece6b4acb8ba7 to your computer and use it in GitHub Desktop.
Save florentbr/6be960752fc852ee99eece6b4acb8ba7 to your computer and use it in GitHub Desktop.
Install SeleniumBasic without admin elevations
::
:: This script installs SeleniumBasic without administrator privileges.
:: It registers a COM API running on the .NET Framework.
::
:: The required files can be extracted with innoextract from the original setup :
:: Selenium.dll Selenium32.tlb Selenium64.tlb Selenium.pdb
::
:: The drivers are not provided. You'll have to download and place the desired driver :
:: * in a folder defined in the "PATH" environment variable
:: * or in this folder before running this script
:: * or in the installed folder after installation
:: Note that the group policy may block the drivers depending on the location or whitelist.
::
:: By default, the files are installed in "%APPDATA%\SeleniumBasic".
:: To change the install folder, edit "set _LOCATION=..." in this script.
::
:: By default, the library will associate with the latest installed .NET runtime.
:: To run a specific runtime version, edit "set _RUNTIME=v?.?.*" in this script.
:: It will fail in Office if a different runtime version is already loaded by an extension.
:: If it's the case, try a different version (ex: v1.0.3705 v2.0.50727 v4.0.30319).
::
:: To uninstall, open "Programs and features" and double-click on "SeleniumBasic"
:: or execute "%APPDATA%\SeleniumBasic\uninstall.cmd"
::
@echo off
setlocal EnableDelayedExpansion
set PATH=%SYSTEMROOT%\System32;%SYSTEMROOT%\System32\wbem
chcp 65001 >nul 2>nul
pushd "%~dp0" || goto :failed
set _NAME=SeleniumBasic
set _HOMEPAGE=https://github.com/florentbr/SeleniumBasic
set _LOCATION=%APPDATA%\SeleniumBasic
set _FILES=Selenium.dll Selenium32.tlb Selenium64.tlb Selenium.pdb
set _RUNTIME=v?.?.*
for %%f in (%_FILES%) do if not exist "%%~f" >&2 echo Error: file %%f not found & goto :failed
call :get_version _VERSION %_FILES% || goto :failed
call :get_runtime _RUNTIME || goto :failed
echo =============================================================================
echo %_NAME% %_VERSION%
echo Microsoft .NET Framework %_RUNTIME%
echo %_HOMEPAGE%
echo =============================================================================
if exist "%_LOCATION%\uninstall.cmd" (
echo Uninstall previous version ...
cmd /c "%_LOCATION%\uninstall.cmd" >nul
timeout /t 1 >nul
)
echo Install to %_LOCATION% ...
xcopy Selenium* "%_LOCATION%\" /y >nul || goto :failed
xcopy *driver.exe "%_LOCATION%\" /y >nul 2>nul || goto :failed
call :build_setup >"%_LOCATION%\setup.inf" || goto :failed
> "%_LOCATION%\uninstall.cmd" (
echo @set PATH=%%SYSTEMROOT%%\System32
echo @%%SYSTEMROOT%%\SysWOW64\rundll32 advpack.dll,LaunchINFSection "%%~dp0setup.inf",DefaultUninstall,3
echo @%%SYSTEMROOT%%\System32\rundll32 advpack.dll,LaunchINFSection "%%~dp0setup.inf",DefaultUninstall,3
echo @start "" /b cmd /c rmdir /s /q "%%~dp0"
)
echo Register application ...
%SYSTEMROOT%\SysWOW64\rundll32 advpack.dll,LaunchINFSection "%_LOCATION%\setup.inf",DefaultInstall,3 2>nul
%SYSTEMROOT%\System32\rundll32 advpack.dll,LaunchINFSection "%_LOCATION%\setup.inf",DefaultInstall,2 || goto :failed
echo Test CreateObject with VBS script ...
> "%_LOCATION%\test.vbs" echo CreateObject "Selenium.ChromeDriver"
(cscript //nologo "%_LOCATION%\test.vbs" >nul) 2>&1 | findstr /r "." && goto :failed
echo Done ^^!
popd & endlocal & pause >nul & exit \b 0
:failed
>&2 echo Failed ^^!
popd & endlocal & pause >nul & exit \b 1
:get_runtime
for /d %%f in ("%SYSTEMROOT%\Microsoft.NET\Framework\!%1!") do if exist "%%f\mscorlib.dll" set "%1=%%~nxf"
if exist "%SYSTEMROOT%\Microsoft.NET\Framework\!%1!\mscorlib.dll" exit /b 0
>&2 echo Error: .NET Framework !%1! not found.
exit /b 1
:get_version
set _file=%~f2
set _query=wmic datafile where "Name='%_file:\=\\%'" get Version
for /f "usebackq skip=1" %%a in (`%_query% 2^>nul`) do for %%l in (%%a) do set "%1=%%l" & exit /b 0
>&2 echo Error: failed to read version of %_file%
exit /b 1
:build_setup
pushd "%_LOCATION%" || exit /b 0
call :build_reg 4>1 5>2 6>3 >nul
cmd /d /u /c for %%f in (1 2 3) do @type %%f ^& del %%f
popd >nul
goto :eof
:build_reg
set _libname=Selenium Type Library
set _libguid={0277FC34-FD1B-4616-BB19-A9AABCAF2A70}
set _libsign=Selenium, Version=!_VERSION!, Culture=neutral
set _libvers=2.0
>&4 echo [Version]
>&4 echo Signature="$Windows NT$"
>&4 echo AdvancedINF=2.5
>&4 echo.
>&4 echo [DefaultInstall]
>&4 echo DelReg = DelReg
>&4 echo AddReg = AddReg
>&4 echo.
>&4 echo [DefaultUninstall]
>&4 echo DelReg = DelReg
>&5 echo.
>&5 echo [AddReg]
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,DisplayName,,"!_NAME!"
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,DisplayVersion,,"!_VERSION!"
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,InstallLocation,,"!CD!"
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,UninstallString,,"""!CD!\uninstall.cmd"""
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,URLInfoAbout,,"!_HOMEPAGE!"
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,NoModify,0x00010001,1
>&5 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic,NoRepair,0x00010001,1
>&5 echo HKCU,SOFTWARE\Classes\TypeLib\!_libguid!\!_libvers!,,,"!_libname!"
>&5 echo HKCU,SOFTWARE\Classes\TypeLib\!_libguid!\!_libvers!\FLAGS,,,"0"
>&5 echo HKCU,SOFTWARE\Classes\TypeLib\!_libguid!\!_libvers!\0\win32,,,"!CD!\Selenium32.tlb"
>&5 echo HKCU,SOFTWARE\Classes\TypeLib\!_libguid!\!_libvers!\0\win64,,,"!CD!\Selenium64.tlb"
>&6 echo.
>&6 echo [DelReg]
>&6 echo HKCU,SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SeleniumBasic
>&6 echo HKCU,SOFTWARE\Classes\TypeLib\!_libguid!
for %%l in (
0809389E78C4:PhantomJSDriver
14DB1E4916D4:FirefoxDriver
3C406728F1A2:EdgeDriver
44A424DB3F50:Timeouts
5D556733E8C9:ChromeDriver
5DB46A739EEA:List
6AAF7EDD33D6:Assert
7D30CBC3F6BB:Waiter
80B2B91F0D44:By
9E7F9EF1D002:OperaDriver
A34FCBA29598:Utils
B0C8C528C673:Verify
B719752452AA:Table
BE75D14E7B41:Keys
CDCD9EB97FD6:PdfFile
CEA7D8FD6954:Dictionary
E3CCFFAB4234:WebDriver
E9AAFA695FFB:Application
EED04A1E4CD1:IEDriver
) do for /f "tokens=1,2 delims=:" %%i in ("%%l") do (
set _name=Selenium.%%j
set _guid={0277FC34-FD1B-4616-BB19-%%i}
>&6 echo HKCU,SOFTWARE\Classes\!_name!
>&6 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!
>&5 echo HKCU,SOFTWARE\Classes\!_name!,,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\!_name!\CLSID,,,"!_guid!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!,,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,,,"!SYSTEMROOT!\System32\mscoree.dll"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,Class,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,Assembly,,"!_libsign!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,CodeBase,,"!CD!\Selenium.dll"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,RuntimeVersion,,"!_RUNTIME!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\InprocServer32,ThreadingModel,,"Both"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\ProgId,,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\VersionIndependentProgID,,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\CLSID\!_guid!\Implemented Categories\{62C8FE65-4EBB-45e7-B440-6E39B2CDBF29},,,""
)
for %%l in (
01D514FE0B1A:20:_Utils
0B61E370369D:24:_TableRow
0EA52ACB97D1:20:_Assert
11660D7615B7:20:_Manage
1456C48D8E5C:24:_Dictionary
2276E80F5CF7:20:_Cookie
384C7E50EFA8:20:_Waiter
495CC9DBFB96:20:_Verify
4CE442A16502:20:_SelectElement
54BA7C175990:20:_Image
61DAD6C51012:20:_Keyboard
637431245D48:24:_Keys
63F894CA99E9:20:_Mouse
6E0522EA435E:20:_Application
74F5D5680428:20:_Timeouts
7C9763568492:20:_WebElements
7E2EBB6C82E9:20:_Size
8B145197B76C:20:_WebElement
A398E67A519B:24:_DictionaryItem
A3DE5685A27E:20:_By
ACE280CD7780:20:_Point
B51CB7C5A694:20:_Alert
B825A6BF9610:24:_Table
BBE48A6D09DB:20:_Actions
BE15C121F199:20:_TableElement
C539CB44B63F:24:_List
C6F450B6EE52:20:_Storage
CC6284398AA5:20:_WebDriver
D0E30A5D0697:20:_Proxy
D5DE929CF018:20:_TouchActions
E6E7ED329824:20:_Cookies
F2A56C3A68D4:20:_PdfFile
FBDA3A91C82B:20:_Window
FFD6FAEF290A:20:_TouchScreen
) do for /f "tokens=1,2,3 delims=:" %%i in ("%%l") do (
set _name=%%k
set _guid={0277FC34-FD1B-4616-BB19-%%i}
set _stub={000204%%j-0000-0000-C000-000000000046}
>&6 echo HKCU,SOFTWARE\Classes\Interface\!_guid!
>&5 echo HKCU,SOFTWARE\Classes\Interface\!_guid!,,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\Interface\!_guid!\ProxyStubClsid32,,,"!_stub!"
>&5 echo HKCU,SOFTWARE\Classes\Interface\!_guid!\TypeLib,,,"!_libguid!"
>&5 echo HKCU,SOFTWARE\Classes\Interface\!_guid!\TypeLib,Version,,"!_libvers!"
)
for %%l in (
300DAA508541:Strategy
B342CE81CB2A:MouseButton
C724C5135B6E:CacheState
) do for /f "tokens=1,2 delims=:" %%i in ("%%l") do (
set _name=Selenium.%%j
set _guid={0277FC34-FD1B-4616-BB19-%%i}
>&6 echo HKCU,SOFTWARE\Classes\Record\!_guid!
>&5 echo HKCU,SOFTWARE\Classes\Record\!_guid!,Class,,"!_name!"
>&5 echo HKCU,SOFTWARE\Classes\Record\!_guid!,Assembly,,"!_libsign!"
>&5 echo HKCU,SOFTWARE\Classes\Record\!_guid!,RuntimeVersion,,"!_RUNTIME!"
>&5 echo HKCU,SOFTWARE\Classes\Record\!_guid!,CodeBase,,"!CD!\Selenium.dll"
)
goto :eof
@longvh211
Copy link

Thanks florentbr for updating the cmd script with the helpful comments! I just conducted a training to my developer team and we all agreed that the best solution for automating modern browsers with VBA/VB/AutoIt at the moment is SeleniumBasic. Thank you for pioneering this.

There is one question that we particularly discussed: the current install.cmd requires modifying the Window Registry and our company environment does not permit this. Is there any way to install the Selenium Type Library without touching the Registry?

@florentbr
Copy link
Author

@longvh211, to be used from VBS or VBA, the library has to be present in the registry. It's how COM objects work. There's no way around it.
It should be possible to write to the registry to some extent even with the GPO. Is the access denied on a registry key or is it blocking "regedit.exe" from windows ? Do you know which GPO rule is preventing the install ?

@longvh211
Copy link

@florentbr, my apologies for the delay in reverting and thank you for the help. After performing further inspection on our company environment, it turns out that it is blocking comprehensively the regedit.exe and the download of .dll, .tlb, .pdb files. I have therefore raised an official package acquisition process to greenlight the installation of SeleniumBasic instead. Hopefully this will go well.

@longvh211
Copy link

@florentbr: after a long battle with our company IT's team to have them acknowledge Selenium Basic, we are able to moving to the process of making it available to the team in our company. However, per our company's policy, we need to set up the webdriver path to a non restricted folder if we want to download and overwrite with the latest drivers from time to time. Could you kindly help give an example of how we may modify the driver PATH florentbr? Let's say if we would like to move it to our local desktop "C:\Users\UserName\Desktop", line 28 is to be modified to "set PATH=C:\Users\UserName\Desktop" right? Is there a way to modify the same with the non-manual installation setup file? Thanks floren!

@florentbr
Copy link
Author

@longvh211, the service doesn't search in the PATH environment variable.
It's is looking for chromedriver.exe in the folder where Selenium.dll is installed.
So if you wish to place the driver on the desktop, then change

--- set _LOCATION=%APPDATA%\SeleniumBasic
+++ set _LOCATION=%HOMEPATH%\Desktop\SeleniumBasic

Is there a way to modify the same with the non-manual installation setup file?

You'll have to edit the source code and rebuild the libraries.
https://github.com/florentbr/SeleniumBasic/blob/8a2cde358d2bc06e3014aca2c8d427bc61188a1b/Selenium/Core/DriverService.cs#L85-L90

@longvh211
Copy link

@florentbr Thank you so much for the very helpful guidance on the non-manual installation source code! Meanwhile for the manual installation, based on your suggestion of modifying the _LOCATION constant, I suppose that will change the entire installation folder. However, we are looking to direct the service to only look for the drivers in a different folder to the installation folder (due to our company's requirement). Eg. SB installation folder is "%APPDATA%\SeleniumBasic" but the driver folder is to be "%HOMEPATH%\Desktop\Webdrivers". Is this possible to modify the manual installation for this particular requirement?

@florentbr
Copy link
Author

However, we are looking to direct the service to only look for the drivers in a different folder to the installation folder

It's not possible with the current implementation, the service is looking for chromedriver.exe in the folder where Selenium.dll is located.

@longvh211
Copy link

longvh211 commented Jan 18, 2022

@florentbr thanks to your clear guidance left in the build-setup.py file, I am now able to rebuild a working setup file with the custom injection to change the driver library directory. It works perfectly fine except for the following issues thrown by Python during the execution of "build-setup.py" which I have to comment those sections out to let it flow. Do you happen to know what these are?

execute(APP_MSBUILD_PATH, '/p:Configuration=Release', '/nologo', '.\Selenium\Selenium.shfbproj')
c:\Progra~2\EWSoftware\Sandcastle Help File Builder\SandcastleHelpFileBuilder.targets(44,3): error MSB4062: The "SandcastleBuilder.MSBuild.BuildHelp" task could not be loaded from the assembly c:\Program Files (x86)\EWSoftware\Sandcastle Help File Builder\net472\SandcastleBuilder.MSBuild.dll. Could not load file or assembly 'Microsoft.Build.Utilities.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified. Confirm that the declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.

Things I have tried but could not fix the issue:

  • Installing latest version of SandcastleHelpFileBuilder.
  • Installing dotnet Framework 3.5.

execute(APP_PYTHON_PATH, dir + r'\rebuild_exel_files.py'))
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, 'Microsoft Excel', 'Programmatic access to Visual Basic Project is not trusted\n', 'xlmain11.chm', 0, -2146827284), None)

Things I have tried but could not fix the issue:

  • Checking "Trust access to the VBA project object model" in Excel & Word.

@alcapps
Copy link

alcapps commented May 2, 2023

I have an instance of SeleniumBasic installed on C:\programfiles\SeleniumBasic. I want to make the instance point to my C:\users\userid\appdata\seleniumbasic folder instead. How do I do that? Would it be possible to modify a registry setting or a path command to make this happen? Thanks for any help.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment