-
-
Save florentbr/6be960752fc852ee99eece6b4acb8ba7 to your computer and use it in GitHub Desktop.
:: | |
:: 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, 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 ?
@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.
@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!
@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
@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?
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.
@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.
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.
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?