Skip to content

Commit 0f0d750

Browse files
committed
Update "seleniumbase install [BROWSER]" to include IE and Opera
1 parent a635929 commit 0f0d750

File tree

3 files changed

+129
-20
lines changed

3 files changed

+129
-20
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,12 @@ nosetests.xml
3939
# Web Drivers
4040
chromedriver
4141
geckodriver
42+
operadriver
4243
MicrosoftWebDriver.exe
44+
IEDriverServer.exe
4345
chromedriver.exe
4446
geckodriver.exe
47+
operadriver.exe
4548

4649
# Logs
4750
logs

console_scripts/run.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,17 @@ def show_install_usage():
4747
print("")
4848
print(" Usage:")
4949
print(" seleniumbase install [DRIVER_NAME]")
50-
print(" (Drivers: chromedriver, geckodriver, edgedriver)")
50+
print(" (Drivers: chromedriver, geckodriver, edgedriver")
51+
print(" iedriver, operadriver)")
5152
print(" Example:")
5253
print(" seleniumbase install chromedriver")
5354
print(" Output:")
5455
print(" Installs the specified webdriver.")
5556
print(" (chromedriver is required for Chrome automation)")
5657
print(" (geckodriver is required for Firefox automation)")
57-
print(" (edgedriver is required for MS Edge automation)")
58+
print(" (edgedriver is required for Microsoft Edge automation)")
59+
print(" (iedriver is required for InternetExplorer automation)")
60+
print(" (operadriver is required for Opera Browser automation)")
5861
print("")
5962

6063

console_scripts/sb_install.py

Lines changed: 121 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@
88
(chromedriver is required for Chrome automation)
99
(geckodriver is required for Firefox automation)
1010
(edgedriver is required for MS Edge automation)
11+
(iedriver is required for Internet Explorer automation)
12+
(operadriver is required for Opera Browser automation)
1113
"""
1214

1315
import os
1416
import platform
1517
import requests
18+
import shutil
1619
import sys
1720
import tarfile
1821
import zipfile
@@ -28,14 +31,17 @@ def invalid_run_command():
2831
exp = (" ** install **\n\n")
2932
exp += " Usage:\n"
3033
exp += " seleniumbase install [DRIVER_NAME]\n"
31-
exp += " (Drivers: chromedriver, geckodriver, edgedriver)\n"
34+
exp += " (Drivers: chromedriver, geckodriver, edgedriver,\n"
35+
exp += " iedriver, operadriver)\n"
3236
exp += " Example:\n"
3337
exp += " seleniumbase install chromedriver\n"
3438
exp += " Output:\n"
3539
exp += " Installs the specified webdriver.\n"
3640
exp += " (chromedriver is required for Chrome automation)\n"
3741
exp += " (geckodriver is required for Firefox automation)\n"
38-
exp += " (edgedriver is required for MS Edge automation)\n"
42+
exp += " (edgedriver is required for Microsoft Edge automation)\n"
43+
exp += " (iedriver is required for InternetExplorer automation)\n"
44+
exp += " (operadriver is required for Opera Browser automation)\n"
3945
print("")
4046
raise Exception('INVALID RUN COMMAND!\n\n%s' % exp)
4147

@@ -60,16 +66,20 @@ def main():
6066
file_name = None
6167
download_url = None
6268
downloads_folder = DRIVER_DIR
69+
sys_plat = sys.platform
70+
expected_contents = None
71+
platform_code = None
72+
inner_folder = None
6373

6474
if name == "chromedriver":
65-
if "darwin" in sys.platform:
75+
if "darwin" in sys_plat:
6676
file_name = "chromedriver_mac64.zip"
67-
elif "linux" in sys.platform:
77+
elif "linux" in sys_plat:
6878
file_name = "chromedriver_linux64.zip"
69-
elif "win32" in sys.platform or "win64" in sys.platform:
70-
file_name = "chromedriver_win32.zip" # Works for win32 and win64
79+
elif "win32" in sys_plat or "win64" in sys_plat or "x64" in sys_plat:
80+
file_name = "chromedriver_win32.zip" # Works for win32 / win_x64
7181
else:
72-
raise Exception("Cannon determine which version of Chromedriver "
82+
raise Exception("Cannot determine which version of Chromedriver "
7383
"to download!")
7484

7585
latest_version = requests.get(
@@ -85,34 +95,85 @@ def main():
8595
print("Found %s" % download_url)
8696
elif name == "geckodriver" or name == "firefoxdriver":
8797
latest_version = "v0.21.0"
88-
if "darwin" in sys.platform:
98+
if "darwin" in sys_plat:
8999
file_name = "geckodriver-%s-macos.tar.gz" % latest_version
90-
elif "linux" in sys.platform:
100+
elif "linux" in sys_plat:
91101
arch = platform.architecture()[0]
92102
if "64" in arch:
93103
file_name = "geckodriver-%s-linux64.tar.gz" % latest_version
94104
else:
95105
file_name = "geckodriver-%s-linux32.tar.gz" % latest_version
96-
elif "win32" in sys.platform:
106+
elif "win32" in sys_plat:
97107
file_name = "geckodriver-%s-win32.zip" % latest_version
98-
elif "win64" in sys.platform:
108+
elif "win64" in sys_plat or "x64" in sys_plat:
99109
file_name = "geckodriver-%s-win64.zip" % latest_version
100110
else:
101-
raise Exception("Cannon determine which version of Geckodriver "
111+
raise Exception("Cannot determine which version of Geckodriver "
102112
"(Firefox Driver) to download!")
103113

104-
download_url = ("http://github.com/mozilla/geckodriver/"
114+
download_url = ("https://github.com/mozilla/geckodriver/"
105115
"releases/download/"
106116
"%s/%s" % (latest_version, file_name))
107117
elif name == "edgedriver" or name == "microsoftwebdriver":
108-
if "win32" in sys.platform or "win64" in sys.platform:
109-
version_code = "F/8/A/F8AF50AB-3C3A-4BC4-8773-DC27B32988DD"
118+
name = "edgedriver"
119+
version_code = "F/8/A/F8AF50AB-3C3A-4BC4-8773-DC27B32988DD"
120+
if "win32" in sys_plat or "win64" in sys_plat or "x64" in sys_plat:
110121
file_name = "MicrosoftWebDriver.exe"
111-
download_url = ("https://download.microsoft.com/download/"
112-
"%s/%s" % (version_code, file_name))
113122
else:
114123
raise Exception("Sorry! Microsoft WebDriver / EdgeDriver is "
115124
"only for Windows-based operating systems!")
125+
download_url = ("https://download.microsoft.com/download/"
126+
"%s/%s" % (version_code, file_name))
127+
elif name == "iedriver":
128+
major_version = "3.11"
129+
full_version = "3.11.1"
130+
if "win32" in sys_plat:
131+
file_name = "IEDriverServer_Win32_%s.zip" % full_version
132+
elif "win64" in sys_plat or "x64" in sys_plat:
133+
file_name = "IEDriverServer_x64_%s.zip" % full_version
134+
else:
135+
raise Exception("Sorry! IEDriver is only for "
136+
"Windows-based operating systems!")
137+
download_url = ("http://selenium-release.storage.googleapis.com/"
138+
"%s/%s" % (major_version, file_name))
139+
elif name == "operadriver" or name == "operachromiumdriver":
140+
name = "operadriver"
141+
latest_version = "v.2.37"
142+
if "darwin" in sys_plat:
143+
file_name = "operadriver_mac64.zip"
144+
platform_code = "mac64"
145+
inner_folder = "operadriver_%s/" % platform_code
146+
expected_contents = (['operadriver_mac64/',
147+
'operadriver_mac64/operadriver',
148+
'operadriver_mac64/sha512_sum'])
149+
elif "linux" in sys_plat:
150+
file_name = "operadriver_linux64.zip"
151+
platform_code = "linux64"
152+
inner_folder = "operadriver_%s/" % platform_code
153+
expected_contents = (['operadriver_linux64/',
154+
'operadriver_linux64/operadriver',
155+
'operadriver_linux64/sha512_sum'])
156+
elif "win32" in sys_plat:
157+
file_name = "operadriver_win32.zip"
158+
platform_code = "win32"
159+
inner_folder = "operadriver_%s/" % platform_code
160+
expected_contents = (['operadriver_win32/',
161+
'operadriver_win32/operadriver.exe',
162+
'operadriver_win32/sha512_sum'])
163+
elif "win64" in sys_plat or "x64" in sys_plat:
164+
file_name = "operadriver_win64.zip"
165+
platform_code = "win64"
166+
inner_folder = "operadriver_%s/" % platform_code
167+
expected_contents = (['operadriver_win64/',
168+
'operadriver_win64/operadriver.exe',
169+
'operadriver_win64/sha512_sum'])
170+
else:
171+
raise Exception("Cannot determine which version of Operadriver "
172+
"to download!")
173+
174+
download_url = ("https://github.com/operasoftware/operachromiumdriver/"
175+
"releases/download/"
176+
"%s/%s" % (latest_version, file_name))
116177
else:
117178
invalid_run_command()
118179

@@ -135,6 +196,8 @@ def main():
135196
zip_ref = zipfile.ZipFile(zip_file_path, 'r')
136197
contents = zip_ref.namelist()
137198
if len(contents) == 1:
199+
if name == "operadriver":
200+
raise Exception("Zip file for OperaDriver is missing content!")
138201
for f_name in contents:
139202
# remove existing version if exists
140203
new_file = downloads_folder + '/' + str(f_name)
@@ -153,6 +216,46 @@ def main():
153216
make_executable(new_file)
154217
print("%s is now ready for use!" % new_file)
155218
print("")
219+
elif name == "operadriver":
220+
if len(contents) != 3:
221+
raise Exception("Unexpected content in OperaDriver Zip file!")
222+
elif sorted(contents) != sorted(expected_contents):
223+
raise Exception("Unexpected content in OperaDriver Zip file!")
224+
# Zip file is valid. Proceed.
225+
driver_path = None
226+
driver_file = None
227+
for f_name in contents:
228+
# remove existing version if exists
229+
str_name = str(f_name).split(inner_folder)[1]
230+
new_file = downloads_folder + '/' + str_name
231+
if str_name == "operadriver" or str_name == "operadriver.exe":
232+
driver_file = str_name
233+
driver_path = new_file
234+
if os.path.exists(new_file):
235+
os.remove(new_file)
236+
if not driver_file or not driver_path:
237+
raise Exception("Operadriver missing from Zip file!")
238+
print('Extracting %s from %s ...' % (contents, file_name))
239+
zip_ref.extractall(downloads_folder)
240+
zip_ref.close()
241+
os.remove(zip_file_path)
242+
print('Unzip Complete!\n')
243+
inner_driver = downloads_folder + '/' + inner_folder + driver_file
244+
inner_sha = downloads_folder + '/' + inner_folder + "sha512_sum"
245+
shutil.copyfile(inner_driver, driver_path)
246+
print("%s saved!\n" % driver_path)
247+
print("Making %s executable ..." % driver_path)
248+
make_executable(driver_path)
249+
print("%s is now ready for use!" % driver_path)
250+
# clean up extra files
251+
if os.path.exists(inner_driver):
252+
os.remove(inner_driver)
253+
if os.path.exists(inner_sha):
254+
os.remove(inner_sha)
255+
if os.path.exists(downloads_folder + '/' + inner_folder):
256+
# only works if the directory is empty
257+
os.rmdir(downloads_folder + '/' + inner_folder)
258+
print("")
156259
elif len(contents) == 0:
157260
raise Exception("Zip file %s is empty!" % zip_file_path)
158261
else:
@@ -172,7 +275,7 @@ def main():
172275
tar.extractall(downloads_folder)
173276
tar.close()
174277
os.remove(tar_file_path)
175-
print('Untar Complete!\n')
278+
print('Unzip Complete!\n')
176279
for f_name in contents:
177280
new_file = downloads_folder + '/' + str(f_name)
178281
print("%s saved!\n" % new_file)

0 commit comments

Comments
 (0)