Skip to content

Commit d707826

Browse files
committed
Make performance optimizations for driver downloads
1 parent 146c374 commit d707826

File tree

3 files changed

+132
-60
lines changed

3 files changed

+132
-60
lines changed

seleniumbase/console_scripts/sb_install.py

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
iedriver|operadriver} [OPTIONS]
77
Options:
88
VERSION Specify the version.
9-
(Default chromedriver version = 2.44)
9+
(Default chromedriver = 72.0.3626.69)
1010
Use "latest" for the latest version.
1111
Use "latest-1" for one less than that.
1212
-p OR --path Also copy the driver to /usr/local/bin
@@ -44,7 +44,7 @@
4444
urllib3.disable_warnings()
4545
DRIVER_DIR = os.path.dirname(os.path.realpath(drivers.__file__))
4646
LOCAL_PATH = "/usr/local/bin/" # On Mac and Linux systems
47-
DEFAULT_CHROMEDRIVER_VERSION = "2.44" # (Specify "latest" to get the latest)
47+
DEFAULT_CHROMEDRIVER_VERSION = "72.0.3626.69" # (Specify "latest" for latest)
4848
DEFAULT_GECKODRIVER_VERSION = "v0.31.0"
4949
DEFAULT_EDGEDRIVER_VERSION = "101.0.1210.32" # (Looks for LATEST_STABLE first)
5050
DEFAULT_OPERADRIVER_VERSION = "v.96.0.4664.45"
@@ -61,7 +61,7 @@ def invalid_run_command():
6161
exp += " iedriver, operadriver)\n"
6262
exp += " Options:\n"
6363
exp += " VERSION Specify the version.\n"
64-
exp += " (Default chromedriver version = 2.44)\n"
64+
exp += " (Default chromedriver = 72.0.3626.69.\n"
6565
exp += ' Use "latest" for the latest version.\n'
6666
exp += " For chromedriver, you can also use\n"
6767
exp += " the major version integer\n"
@@ -108,14 +108,27 @@ def requests_get(url):
108108

109109

110110
def main(override=None):
111-
if override == "chromedriver":
112-
sys.argv = ["seleniumbase", "get", "chromedriver"]
113-
elif override == "edgedriver":
114-
sys.argv = ["seleniumbase", "get", "edgedriver"]
115-
elif override == "geckodriver":
116-
sys.argv = ["seleniumbase", "get", "geckodriver"]
117-
elif override == "iedriver":
118-
sys.argv = ["seleniumbase", "get", "iedriver"]
111+
if override:
112+
if override == "chromedriver":
113+
sys.argv = ["seleniumbase", "get", "chromedriver"]
114+
elif override.startswith("chromedriver "):
115+
extra = override.split("chromedriver ")[1]
116+
sys.argv = ["seleniumbase", "get", "chromedriver", extra]
117+
elif override == "edgedriver":
118+
sys.argv = ["seleniumbase", "get", "edgedriver"]
119+
elif override.startswith("edgedriver "):
120+
extra = override.split("edgedriver ")[1]
121+
sys.argv = ["seleniumbase", "get", "edgedriver", extra]
122+
elif override == "geckodriver":
123+
sys.argv = ["seleniumbase", "get", "geckodriver"]
124+
elif override.startswith("geckodriver "):
125+
extra = override.split("geckodriver ")[1]
126+
sys.argv = ["seleniumbase", "get", "geckodriver", extra]
127+
elif override == "iedriver":
128+
sys.argv = ["seleniumbase", "get", "iedriver"]
129+
elif override.startswith("iedriver "):
130+
extra = override.split("iedriver ")[1]
131+
sys.argv = ["seleniumbase", "get", "iedriver", extra]
119132

120133
num_args = len(sys.argv)
121134
if (

seleniumbase/core/browser_launcher.py

Lines changed: 106 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,18 @@ def is_headless_iedriver_on_path():
116116
return os.path.exists(LOCAL_HEADLESS_IEDRIVER)
117117

118118

119-
def _repair_chromedriver(chrome_options, headless_options):
119+
def _repair_chromedriver(chrome_options, headless_options, mcv=None):
120120
import subprocess
121121

122+
if mcv:
123+
subprocess.check_call(
124+
"sbase install chromedriver %s" % mcv, shell=True
125+
)
126+
return
122127
driver = None
123-
subprocess.check_call("sbase install chromedriver 2.44", shell=True)
128+
subprocess.check_call(
129+
"sbase install chromedriver 72.0.3626.69", shell=True
130+
)
124131
try:
125132
if selenium4:
126133
service = ChromeService(executable_path=LOCAL_CHROMEDRIVER)
@@ -149,7 +156,10 @@ def _repair_chromedriver(chrome_options, headless_options):
149156
chromedriver_ver = chrome_dict["chromedriverVersion"]
150157
chromedriver_ver = chromedriver_ver.split(" ")[0]
151158
major_chromedriver_ver = chromedriver_ver.split(".")[0]
152-
if major_chromedriver_ver != major_chrome_ver:
159+
if (
160+
major_chromedriver_ver != major_chrome_ver
161+
and int(major_chrome_ver) >= 73
162+
):
153163
subprocess.check_call(
154164
"sbase install chromedriver %s" % major_chrome_ver, shell=True
155165
)
@@ -169,12 +179,12 @@ def _repair_edgedriver(edge_version):
169179
return
170180

171181

172-
def _mark_chromedriver_repaired():
182+
def _mark_driver_repaired():
173183
import codecs
174184

175185
abs_path = os.path.abspath(".")
176-
chromedriver_repaired_lock = constants.MultiBrowser.CHROMEDRIVER_REPAIRED
177-
file_path = os.path.join(abs_path, chromedriver_repaired_lock)
186+
driver_repaired_lock = constants.MultiBrowser.DRIVER_REPAIRED
187+
file_path = os.path.join(abs_path, driver_repaired_lock)
178188
downloads_folder = download_helper.get_downloads_folder()
179189
if not os.path.exists(downloads_folder):
180190
os.makedirs(downloads_folder)
@@ -183,10 +193,10 @@ def _mark_chromedriver_repaired():
183193
out_file.close()
184194

185195

186-
def _was_chromedriver_repaired():
196+
def _was_driver_repaired():
187197
abs_path = os.path.abspath(".")
188-
chromedriver_repaired_lock = constants.MultiBrowser.CHROMEDRIVER_REPAIRED
189-
file_path = os.path.join(abs_path, chromedriver_repaired_lock)
198+
driver_repaired_lock = constants.MultiBrowser.DRIVER_REPAIRED
199+
file_path = os.path.join(abs_path, driver_repaired_lock)
190200
return os.path.exists(file_path)
191201

192202

@@ -1400,18 +1410,33 @@ def get_local_driver(
14001410
" executable: %s" % e
14011411
)
14021412
elif not is_geckodriver_on_path():
1413+
from seleniumbase.console_scripts import sb_install
1414+
14031415
args = " ".join(sys.argv)
14041416
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
14051417
# (Not multithreaded)
1406-
from seleniumbase.console_scripts import sb_install
1407-
14081418
sys_args = sys.argv # Save a copy of current sys args
14091419
print("\nWarning: geckodriver not found. Getting it now:")
14101420
try:
14111421
sb_install.main(override="geckodriver")
14121422
except Exception as e:
14131423
print("\nWarning: Could not install geckodriver: %s" % e)
14141424
sys.argv = sys_args # Put back the original sys args
1425+
else:
1426+
import fasteners
1427+
1428+
geckodriver_fixing_lock = fasteners.InterProcessLock(
1429+
constants.MultiBrowser.DRIVER_FIXING_LOCK
1430+
)
1431+
with geckodriver_fixing_lock:
1432+
if not is_geckodriver_on_path():
1433+
sys_args = sys.argv # Save a copy of sys args
1434+
print(
1435+
"\nWarning: geckodriver not found. "
1436+
"Getting it now:"
1437+
)
1438+
sb_install.main(override="geckodriver")
1439+
sys.argv = sys_args # Put back original sys args
14151440
warnings.simplefilter("ignore", category=DeprecationWarning)
14161441
if "linux" in PLATFORM:
14171442
from selenium.webdriver.common.desired_capabilities import (
@@ -1489,11 +1514,11 @@ def get_local_driver(
14891514
"\nWarning: Could not make IEDriver executable: %s" % e
14901515
)
14911516
elif not is_iedriver_on_path():
1517+
from seleniumbase.console_scripts import sb_install
1518+
14921519
args = " ".join(sys.argv)
14931520
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
14941521
# (Not multithreaded)
1495-
from seleniumbase.console_scripts import sb_install
1496-
14971522
sys_args = sys.argv # Save a copy of current sys args
14981523
print("\nWarning: IEDriver not found. Getting it now:")
14991524
sb_install.main(override="iedriver")
@@ -1507,11 +1532,11 @@ def get_local_driver(
15071532
% e
15081533
)
15091534
elif not is_headless_iedriver_on_path():
1535+
from seleniumbase.console_scripts import sb_install
1536+
15101537
args = " ".join(sys.argv)
15111538
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
15121539
# (Not multithreaded)
1513-
from seleniumbase.console_scripts import sb_install
1514-
15151540
sys_args = sys.argv # Save a copy of current sys args
15161541
print("\nWarning: HeadlessIEDriver not found. Getting it now:")
15171542
sb_install.main(override="iedriver")
@@ -1553,15 +1578,30 @@ def get_local_driver(
15531578
" executable: %s" % e
15541579
)
15551580
elif not is_edgedriver_on_path():
1581+
from seleniumbase.console_scripts import sb_install
1582+
15561583
args = " ".join(sys.argv)
15571584
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
15581585
# (Not multithreaded)
1559-
from seleniumbase.console_scripts import sb_install
1560-
15611586
sys_args = sys.argv # Save a copy of current sys args
15621587
print("\nWarning: msedgedriver not found. Getting it now:")
15631588
sb_install.main(override="edgedriver")
15641589
sys.argv = sys_args # Put back the original sys args
1590+
else:
1591+
import fasteners
1592+
1593+
edgedriver_fixing_lock = fasteners.InterProcessLock(
1594+
constants.MultiBrowser.DRIVER_FIXING_LOCK
1595+
)
1596+
with edgedriver_fixing_lock:
1597+
if not is_edgedriver_on_path():
1598+
sys_args = sys.argv # Save a copy of sys args
1599+
print(
1600+
"\nWarning: msedgedriver not found. "
1601+
"Getting it now:"
1602+
)
1603+
sb_install.main(override="edgedriver")
1604+
sys.argv = sys_args # Put back original sys args
15651605

15661606
# For Microsoft Edge (Chromium) version 80 or higher
15671607
if selenium4:
@@ -1732,16 +1772,16 @@ def get_local_driver(
17321772
import fasteners
17331773

17341774
edgedriver_fixing_lock = fasteners.InterProcessLock(
1735-
constants.MultiBrowser.CHROMEDRIVER_FIXING_LOCK
1775+
constants.MultiBrowser.DRIVER_FIXING_LOCK
17361776
)
17371777
with edgedriver_fixing_lock:
1738-
if not _was_chromedriver_repaired(): # Works for Edge
1778+
if not _was_driver_repaired():
17391779
_repair_edgedriver(edge_version)
1740-
_mark_chromedriver_repaired() # Works for Edge
1780+
_mark_driver_repaired()
17411781
else:
1742-
if not _was_chromedriver_repaired(): # Works for Edge
1782+
if not _was_driver_repaired():
17431783
_repair_edgedriver(edge_version)
1744-
_mark_chromedriver_repaired() # Works for Edge
1784+
_mark_driver_repaired()
17451785
service = EdgeService(
17461786
executable_path=LOCAL_EDGEDRIVER, log_path=os.path.devnull
17471787
)
@@ -1779,16 +1819,16 @@ def get_local_driver(
17791819
import fasteners
17801820

17811821
edgedriver_fixing_lock = fasteners.InterProcessLock(
1782-
constants.MultiBrowser.CHROMEDRIVER_FIXING_LOCK
1822+
constants.MultiBrowser.DRIVER_FIXING_LOCK
17831823
)
17841824
with edgedriver_fixing_lock:
1785-
if not _was_chromedriver_repaired(): # Works for Edge
1825+
if not _was_driver_repaired():
17861826
_repair_edgedriver(edge_version)
1787-
_mark_chromedriver_repaired() # Works for Edge
1827+
_mark_driver_repaired()
17881828
else:
1789-
if not _was_chromedriver_repaired(): # Works for Edge
1829+
if not _was_driver_repaired():
17901830
_repair_edgedriver(edge_version)
1791-
_mark_chromedriver_repaired() # Works for Edge
1831+
_mark_driver_repaired()
17921832
driver = Edge(
17931833
executable_path=LOCAL_EDGEDRIVER,
17941834
service_log_path=os.path.devnull,
@@ -1912,21 +1952,20 @@ def get_local_driver(
19121952
" executable: %s" % e
19131953
)
19141954
elif not is_chromedriver_on_path():
1955+
from seleniumbase.console_scripts import sb_install
1956+
19151957
args = " ".join(sys.argv)
19161958
if not ("-n" in sys.argv or " -n=" in args or args == "-c"):
19171959
# (Not multithreaded)
1918-
from seleniumbase.console_scripts import sb_install
1919-
19201960
sys_args = sys.argv # Save a copy of current sys args
19211961
print("\nWarning: chromedriver not found. Getting it now:")
1922-
sb_install.main(override="chromedriver")
1962+
sb_install.main(override="chromedriver latest")
19231963
sys.argv = sys_args # Put back the original sys args
19241964
else:
19251965
import fasteners
1926-
from seleniumbase.console_scripts import sb_install
19271966

19281967
chromedriver_fixing_lock = fasteners.InterProcessLock(
1929-
constants.MultiBrowser.CHROMEDRIVER_FIXING_LOCK
1968+
constants.MultiBrowser.DRIVER_FIXING_LOCK
19301969
)
19311970
with chromedriver_fixing_lock:
19321971
if not is_chromedriver_on_path():
@@ -1935,7 +1974,7 @@ def get_local_driver(
19351974
"\nWarning: chromedriver not found. "
19361975
"Getting it now:"
19371976
)
1938-
sb_install.main(override="chromedriver")
1977+
sb_install.main(override="chromedriver latest")
19391978
sys.argv = sys_args # Put back original sys args
19401979
if not headless or "linux" not in PLATFORM:
19411980
try:
@@ -1976,6 +2015,16 @@ def get_local_driver(
19762015
raise Exception(e.msg) # Not an obvious fix. Raise.
19772016
else:
19782017
pass # Try upgrading ChromeDriver to match Chrome.
2018+
mcv = None # Major Chrome Version
2019+
if "Current browser version is " in e.msg:
2020+
line = e.msg.split("Current browser version is ")[1]
2021+
browser_version = line.split(" ")[0]
2022+
major_chrome_version = browser_version.split(".")[0]
2023+
if (
2024+
major_chrome_version.isnumeric()
2025+
and int(major_chrome_version) >= 86
2026+
):
2027+
mcv = major_chrome_version
19792028
headless = True
19802029
headless_options = _set_chrome_options(
19812030
browser_name,
@@ -2018,20 +2067,20 @@ def get_local_driver(
20182067
import fasteners
20192068

20202069
chromedriver_fixing_lock = fasteners.InterProcessLock(
2021-
constants.MultiBrowser.CHROMEDRIVER_FIXING_LOCK
2070+
constants.MultiBrowser.DRIVER_FIXING_LOCK
20222071
)
20232072
with chromedriver_fixing_lock:
2024-
if not _was_chromedriver_repaired():
2073+
if not _was_driver_repaired():
20252074
_repair_chromedriver(
2026-
chrome_options, headless_options
2075+
chrome_options, headless_options, mcv
20272076
)
2028-
_mark_chromedriver_repaired()
2077+
_mark_driver_repaired()
20292078
else:
2030-
if not _was_chromedriver_repaired():
2079+
if not _was_driver_repaired():
20312080
_repair_chromedriver(
2032-
chrome_options, headless_options
2081+
chrome_options, headless_options, mcv
20332082
)
2034-
_mark_chromedriver_repaired()
2083+
_mark_driver_repaired()
20352084
if os.path.exists(LOCAL_CHROMEDRIVER):
20362085
if selenium4:
20372086
service = ChromeService(
@@ -2058,32 +2107,42 @@ def get_local_driver(
20582107
auto_upgrade_chromedriver = True
20592108
elif "Chrome version must be between" in e.msg:
20602109
auto_upgrade_chromedriver = True
2110+
mcv = None # Major Chrome Version
2111+
if "Current browser version is " in e.msg:
2112+
line = e.msg.split("Current browser version is ")[1]
2113+
browser_version = line.split(" ")[0]
2114+
major_chrome_version = browser_version.split(".")[0]
2115+
if (
2116+
major_chrome_version.isnumeric()
2117+
and int(major_chrome_version) >= 86
2118+
):
2119+
mcv = major_chrome_version
20612120
if auto_upgrade_chromedriver:
20622121
args = " ".join(sys.argv)
20632122
if "-n" in sys.argv or " -n=" in args or args == "-c":
20642123
import fasteners
20652124

20662125
chromedr_fixing_lock = fasteners.InterProcessLock(
2067-
constants.MultiBrowser.CHROMEDRIVER_FIXING_LOCK
2126+
constants.MultiBrowser.DRIVER_FIXING_LOCK
20682127
)
20692128
with chromedr_fixing_lock:
2070-
if not _was_chromedriver_repaired():
2129+
if not _was_driver_repaired():
20712130
try:
20722131
_repair_chromedriver(
2073-
chrome_options, chrome_options
2132+
chrome_options, chrome_options, mcv
20742133
)
2075-
_mark_chromedriver_repaired()
2134+
_mark_driver_repaired()
20762135
except Exception:
20772136
pass
20782137
else:
2079-
if not _was_chromedriver_repaired():
2138+
if not _was_driver_repaired():
20802139
try:
20812140
_repair_chromedriver(
2082-
chrome_options, chrome_options
2141+
chrome_options, chrome_options, mcv
20832142
)
20842143
except Exception:
20852144
pass
2086-
_mark_chromedriver_repaired()
2145+
_mark_driver_repaired()
20872146
try:
20882147
return webdriver.Chrome(options=chrome_options)
20892148
except Exception:

0 commit comments

Comments
 (0)