Skip to content

Commit f1bc9ce

Browse files
authored
Merge pull request #1531 from seleniumbase/support-for-beta-builds-of-chromium
Support for beta/dev builds of Chromium, and more
2 parents 0e9afde + 070b0f7 commit f1bc9ce

File tree

9 files changed

+203
-35
lines changed

9 files changed

+203
-35
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
<p align="center"><a href="https://github.com/seleniumbase/SeleniumBase/"><img src="https://seleniumbase.github.io/cdn/img/mac_sb_logo_bw.png" alt="SeleniumBase" title="SeleniumBase" width="408" /></a></p>
99

10-
<p align="center"><b>A framework for web automation and testing with <a href="https://www.python.org/about/" target="_blank">Python</a>.</b><br />SeleniumBase extends <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium WebDriver</a> as a <a href="https://docs.pytest.org/en/latest/how-to/usage.html" target="_blank">pytest</a> plugin.</p>
10+
<p align="center"><b>A framework for browser automation & testing with <a href="https://www.python.org/about/" target="_blank">Python</a>.</b><br />SeleniumBase extends <a href="https://www.selenium.dev/documentation/webdriver/" target="_blank">Selenium WebDriver</a> as a <a href="https://docs.pytest.org/en/latest/how-to/usage.html" target="_blank">pytest</a> plugin.</p>
1111

1212
<p align="center"><a href="https://pypi.python.org/pypi/seleniumbase" target="_blank"><img src="https://img.shields.io/pypi/v/seleniumbase.svg?color=3399EE" alt="PyPI version" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/releases" target="_blank"><img src="https://img.shields.io/github/v/release/seleniumbase/SeleniumBase.svg?color=22AAEE" alt="GitHub version" /></a> <a href="https://seleniumbase.io"><img src="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg" alt="SeleniumBase Docs" /></a> <a href="https://github.com/seleniumbase/SeleniumBase/actions" target="_blank"><img src="https://github.com/seleniumbase/SeleniumBase/workflows/CI%20build/badge.svg" alt="SeleniumBase GitHub Actions" /></a> <a href="https://gitter.im/seleniumbase/SeleniumBase" target="_blank"><img src="https://badges.gitter.im/seleniumbase/SeleniumBase.svg" alt="SeleniumBase" /></a></p>
1313

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ cairosvg==2.5.2
2828
cssselect2==0.7.0
2929
tinycss2==1.1.1
3030
defusedxml==0.7.1
31-
mkdocs==1.3.1
31+
mkdocs==1.4.0
3232
mkdocs-material==8.5.3
3333
mkdocs-exclude-search==0.6.4
3434
mkdocs-simple-hooks==0.1.5

requirements.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,13 @@ nose==1.3.7
4848
sniffio==1.3.0;python_version>="3.7"
4949
h11==0.14.0;python_version>="3.7"
5050
outcome==1.2.0;python_version>="3.7"
51-
trio==0.21.0;python_version>="3.7"
51+
trio==0.22.0;python_version>="3.7"
5252
trio-websocket==0.9.2;python_version>="3.7"
5353
websockets==10.3;python_version>="3.7"
5454
pyopenssl==22.1.0;python_version>="3.7"
5555
wsproto==1.2.0;python_version>="3.7"
5656
selenium==3.141.0;python_version<"3.7"
57-
selenium==4.4.3;python_version>="3.7"
57+
selenium==4.5.0;python_version>="3.7"
5858
msedge-selenium-tools==3.141.3;python_version<"3.7"
5959
more-itertools==5.0.0;python_version<"3.6"
6060
more-itertools==8.14.0;python_version>="3.6"
@@ -127,7 +127,7 @@ coverage==5.5;python_version<"3.6"
127127
coverage==6.2;python_version>="3.6" and python_version<"3.7"
128128
coverage==6.4.4;python_version>="3.7"
129129
pytest-cov==2.12.1;python_version<"3.6"
130-
pytest-cov==3.0.0;python_version>="3.6"
130+
pytest-cov==4.0.0;python_version>="3.6"
131131
flake8==3.7.9;python_version<"3.6"
132132
flake8==5.0.4;python_version>="3.6"
133133
mccabe==0.6.1;python_version<"3.6"

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.4.4"
2+
__version__ = "4.5.0"

seleniumbase/behave/behave_sb.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ def behave_dashboard_prepare():
10281028
_create_dashboard_assets_()
10291029
# Output Dashboard info to the console
10301030
sb_config.item_count_untested = sb_config.item_count
1031-
dash_path = os.getcwd() + "/dashboard.html"
1031+
dash_path = os.path.join(os.getcwd(), "dashboard.html")
10321032
star_len = len("Dashboard: ") + len(dash_path)
10331033
try:
10341034
terminal_size = os.get_terminal_size().columns

seleniumbase/core/browser_launcher.py

Lines changed: 136 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,28 @@ def make_driver_executable_if_not(driver_path):
9090
make_executable(driver_path)
9191

9292

93+
def requests_get(url):
94+
import requests
95+
96+
response = None
97+
try:
98+
response = requests.get(url)
99+
except Exception:
100+
# Prevent SSLCertVerificationError / CERTIFICATE_VERIFY_FAILED
101+
url = url.replace("https://", "http://")
102+
response = requests.get(url)
103+
return response
104+
105+
106+
def get_latest_chromedriver_version():
107+
last = "https://chromedriver.storage.googleapis.com/LATEST_RELEASE"
108+
url_request = requests_get(last)
109+
if url_request.ok:
110+
return url_request.text
111+
else:
112+
return None
113+
114+
93115
def chromedriver_on_path():
94116
paths = os.environ["PATH"].split(os.pathsep)
95117
for path in paths:
@@ -2101,15 +2123,23 @@ def get_local_driver(
21012123
constants.MultiBrowser.DRIVER_FIXING_LOCK
21022124
)
21032125
with edgedriver_fixing_lock:
2126+
try:
2127+
if not _was_driver_repaired():
2128+
_repair_edgedriver(edge_version)
2129+
_mark_driver_repaired()
2130+
except Exception:
2131+
pass
2132+
else:
2133+
try:
21042134
if not _was_driver_repaired():
21052135
_repair_edgedriver(edge_version)
2106-
_mark_driver_repaired()
2107-
else:
2108-
if not _was_driver_repaired():
2109-
_repair_edgedriver(edge_version)
2110-
_mark_driver_repaired()
2136+
_mark_driver_repaired()
2137+
except Exception:
2138+
pass
21112139
service = EdgeService(
2112-
executable_path=LOCAL_EDGEDRIVER, log_path=os.devnull
2140+
executable_path=LOCAL_EDGEDRIVER,
2141+
log_path=os.devnull,
2142+
service_args=["--disable-build-check"],
21132143
)
21142144
driver = Edge(service=service, options=edge_options)
21152145
return driver
@@ -2169,6 +2199,7 @@ def get_local_driver(
21692199
driver = Edge(
21702200
executable_path=LOCAL_EDGEDRIVER,
21712201
service_log_path=os.devnull,
2202+
service_args=["--disable-build-check"],
21722203
capabilities=capabilities,
21732204
)
21742205
return driver
@@ -2346,6 +2377,7 @@ def get_local_driver(
23462377
driver_version = output
23472378
except Exception:
23482379
pass
2380+
disable_build_check = False
23492381
if (
23502382
LOCAL_CHROMEDRIVER
23512383
and os.path.exists(LOCAL_CHROMEDRIVER)
@@ -2385,7 +2417,32 @@ def get_local_driver(
23852417
msg = "chromedriver not found. Getting it now:"
23862418

23872419
print("\nWarning: %s" % msg)
2388-
sb_install.main(override="chromedriver %s" % use_version)
2420+
try:
2421+
sb_install.main(
2422+
override="chromedriver %s" % use_version
2423+
)
2424+
except Exception:
2425+
d_latest = get_latest_chromedriver_version()
2426+
if (
2427+
d_latest
2428+
and use_version != "latest"
2429+
and int(use_version) > int(d_latest.split(".")[0])
2430+
):
2431+
disable_build_check = True
2432+
d_latest_major = d_latest.split(".")[0]
2433+
if (
2434+
not path_chromedriver
2435+
or (
2436+
driver_version
2437+
and (
2438+
int(driver_version)
2439+
< int(d_latest_major)
2440+
)
2441+
)
2442+
):
2443+
sb_install.main(
2444+
override="chromedriver latest"
2445+
)
23892446
sys.argv = sys_args # Put back the original sys args
23902447
else:
23912448
chromedriver_fixing_lock = fasteners.InterProcessLock(
@@ -2396,10 +2453,39 @@ def get_local_driver(
23962453
sys_args = sys.argv # Save a copy of sys args
23972454
msg = "chromedriver not found. Getting it now:"
23982455
print("\nWarning: %s" % msg)
2399-
sb_install.main(
2400-
override="chromedriver %s" % use_version
2401-
)
2456+
try:
2457+
sb_install.main(
2458+
override="chromedriver %s" % use_version
2459+
)
2460+
except Exception:
2461+
d_latest = get_latest_chromedriver_version()
2462+
if (
2463+
d_latest
2464+
and use_version != "latest"
2465+
and (
2466+
int(use_version)
2467+
> int(d_latest.split(".")[0])
2468+
)
2469+
):
2470+
disable_build_check = True
2471+
d_latest_major = d_latest.split(".")[0]
2472+
if (
2473+
not path_chromedriver
2474+
or (
2475+
driver_version
2476+
and (
2477+
int(driver_version)
2478+
< int(d_latest_major)
2479+
)
2480+
)
2481+
):
2482+
sb_install.main(
2483+
override="chromedriver latest"
2484+
)
24022485
sys.argv = sys_args # Put back original sys args
2486+
service_args = []
2487+
if disable_build_check:
2488+
service_args = ["--disable-build-check"]
24032489
if is_using_uc(undetectable, browser_name):
24042490
uc_lock = fasteners.InterProcessLock(
24052491
constants.MultiBrowser.DRIVER_FIXING_LOCK
@@ -2474,7 +2560,7 @@ def get_local_driver(
24742560
uc_lock = fasteners.InterProcessLock(
24752561
constants.MultiBrowser.DRIVER_FIXING_LOCK
24762562
)
2477-
with uc_lock: # No UC multithreaded tests
2563+
with uc_lock:
24782564
try:
24792565
uc_path = None
24802566
if os.path.exists(LOCAL_UC_DRIVER):
@@ -2510,6 +2596,7 @@ def get_local_driver(
25102596
service = ChromeService(
25112597
executable_path=LOCAL_CHROMEDRIVER,
25122598
log_path=os.devnull,
2599+
service_args=service_args,
25132600
)
25142601
driver = webdriver.Chrome(
25152602
service=service,
@@ -2519,18 +2606,24 @@ def get_local_driver(
25192606
driver = webdriver.Chrome(
25202607
executable_path=LOCAL_CHROMEDRIVER,
25212608
service_log_path=os.devnull,
2609+
service_args=service_args,
25222610
options=chrome_options,
25232611
)
25242612
else:
25252613
if selenium4_or_newer:
2526-
service = ChromeService(log_path=os.devnull)
2614+
service = ChromeService(
2615+
log_path=os.devnull,
2616+
service_args=service_args,
2617+
)
25272618
driver = webdriver.Chrome(
2528-
service=service, options=chrome_options
2619+
service=service,
2620+
options=chrome_options,
25292621
)
25302622
else:
25312623
driver = webdriver.Chrome(
2532-
options=chrome_options,
25332624
service_log_path=os.devnull,
2625+
service_args=service_args,
2626+
options=chrome_options,
25342627
)
25352628
except Exception as e:
25362629
if not hasattr(e, "msg"):
@@ -2629,7 +2722,8 @@ def get_local_driver(
26292722
if os.path.exists(LOCAL_CHROMEDRIVER):
26302723
if selenium4_or_newer:
26312724
service = ChromeService(
2632-
executable_path=LOCAL_CHROMEDRIVER
2725+
executable_path=LOCAL_CHROMEDRIVER,
2726+
service_args=["--disable-build-check"],
26332727
)
26342728
driver = webdriver.Chrome(
26352729
service=service,
@@ -2638,10 +2732,23 @@ def get_local_driver(
26382732
else:
26392733
driver = webdriver.Chrome(
26402734
executable_path=LOCAL_CHROMEDRIVER,
2735+
service_args=["--disable-build-check"],
26412736
options=chrome_options,
26422737
)
26432738
else:
2644-
driver = webdriver.Chrome(options=chrome_options)
2739+
if selenium4_or_newer:
2740+
service = ChromeService(
2741+
service_args=["--disable-build-check"],
2742+
)
2743+
driver = webdriver.Chrome(
2744+
service=service,
2745+
options=chrome_options,
2746+
)
2747+
else:
2748+
driver = webdriver.Chrome(
2749+
service_args=["--disable-build-check"],
2750+
options=chrome_options,
2751+
)
26452752
return driver
26462753
else: # Running headless on Linux (and not using --uc)
26472754
try:
@@ -2702,7 +2809,19 @@ def get_local_driver(
27022809
pass
27032810
_mark_driver_repaired()
27042811
try:
2705-
return webdriver.Chrome(options=chrome_options)
2812+
if selenium4_or_newer:
2813+
service = ChromeService(
2814+
service_args=["--disable-build-check"],
2815+
)
2816+
return webdriver.Chrome(
2817+
service=service,
2818+
options=chrome_options,
2819+
)
2820+
else:
2821+
return webdriver.Chrome(
2822+
service_args=["--disable-build-check"],
2823+
options=chrome_options,
2824+
)
27062825
except Exception:
27072826
pass
27082827
# Use the virtual display on Linux during headless errors

seleniumbase/fixtures/base_case.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5338,6 +5338,11 @@ def jquery_click_all(self, selector, by="css selector"):
53385338
def hide_element(self, selector, by="css selector"):
53395339
"""Hide the first element on the page that matches the selector."""
53405340
self.__check_scope()
5341+
try:
5342+
self.wait_for_element_visible("body", timeout=1.5)
5343+
self.wait_for_element_present(selector, by=by, timeout=0.5)
5344+
except Exception:
5345+
pass
53415346
selector, by = self.__recalculate_selector(selector, by)
53425347
css_selector = self.convert_to_css_selector(selector, by=by)
53435348
if ":contains(" in css_selector:
@@ -5356,6 +5361,10 @@ def hide_element(self, selector, by="css selector"):
53565361
def hide_elements(self, selector, by="css selector"):
53575362
"""Hide all elements on the page that match the selector."""
53585363
self.__check_scope()
5364+
try:
5365+
self.wait_for_element_visible("body", timeout=1.5)
5366+
except Exception:
5367+
pass
53595368
selector, by = self.__recalculate_selector(selector, by)
53605369
css_selector = self.convert_to_css_selector(selector, by=by)
53615370
if ":contains(" in css_selector:
@@ -5377,6 +5386,11 @@ def hide_elements(self, selector, by="css selector"):
53775386
def show_element(self, selector, by="css selector"):
53785387
"""Show the first element on the page that matches the selector."""
53795388
self.__check_scope()
5389+
try:
5390+
self.wait_for_element_visible("body", timeout=1.5)
5391+
self.wait_for_element_present(selector, by=by, timeout=1)
5392+
except Exception:
5393+
pass
53805394
selector, by = self.__recalculate_selector(selector, by)
53815395
css_selector = self.convert_to_css_selector(selector, by=by)
53825396
if ":contains(" in css_selector:
@@ -5396,6 +5410,10 @@ def show_element(self, selector, by="css selector"):
53965410
def show_elements(self, selector, by="css selector"):
53975411
"""Show all elements on the page that match the selector."""
53985412
self.__check_scope()
5413+
try:
5414+
self.wait_for_element_visible("body", timeout=1.5)
5415+
except Exception:
5416+
pass
53995417
selector, by = self.__recalculate_selector(selector, by)
54005418
css_selector = self.convert_to_css_selector(selector, by=by)
54015419
if ":contains(" in css_selector:
@@ -5417,6 +5435,11 @@ def show_elements(self, selector, by="css selector"):
54175435
def remove_element(self, selector, by="css selector"):
54185436
"""Remove the first element on the page that matches the selector."""
54195437
self.__check_scope()
5438+
try:
5439+
self.wait_for_element_visible("body", timeout=1.5)
5440+
self.wait_for_element_present(selector, by=by, timeout=0.5)
5441+
except Exception:
5442+
pass
54205443
selector, by = self.__recalculate_selector(selector, by)
54215444
css_selector = self.convert_to_css_selector(selector, by=by)
54225445
if ":contains(" in css_selector:
@@ -5436,6 +5459,10 @@ def remove_element(self, selector, by="css selector"):
54365459
def remove_elements(self, selector, by="css selector"):
54375460
"""Remove all elements on the page that match the selector."""
54385461
self.__check_scope()
5462+
try:
5463+
self.wait_for_element_visible("body", timeout=1.5)
5464+
except Exception:
5465+
pass
54395466
selector, by = self.__recalculate_selector(selector, by)
54405467
css_selector = self.convert_to_css_selector(selector, by=by)
54415468
if ":contains(" in css_selector:

0 commit comments

Comments
 (0)