Skip to content

Commit d4fc311

Browse files
authored
Merge pull request #4063 from seleniumbase/cdp-mode-patch-68
CDP Mode: Patch 68
2 parents 7cfa79a + b71e59b commit d4fc311

File tree

14 files changed

+66
-28
lines changed

14 files changed

+66
-28
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,8 @@ sb.cdp.get_text(selector)
445445
sb.cdp.get_title()
446446
sb.cdp.get_current_url()
447447
sb.cdp.get_origin()
448-
sb.cdp.get_page_source()
448+
sb.cdp.get_html(include_shadow_dom=True)
449+
sb.cdp.get_page_source(include_shadow_dom=True)
449450
sb.cdp.get_user_agent()
450451
sb.cdp.get_cookie_string()
451452
sb.cdp.get_locale_code()
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""An example of displaying Shadow DOM inside HTML"""
2+
from seleniumbase import sb_cdp
3+
4+
url = "https://seleniumbase.io/apps/turnstile"
5+
sb = sb_cdp.Chrome(url)
6+
element = sb.find_element("div.cf-turnstile div")
7+
html_with_shadow_dom = element.get_html()
8+
print(html_with_shadow_dom)
9+
text_to_find = "Widget containing a Cloudflare security challenge"
10+
sb.assert_true(text_to_find in html_with_shadow_dom)
11+
sb.solve_captcha()
12+
sb.assert_element("img#captcha-success", timeout=3)
13+
sb.set_messenger_theme(location="top_left")
14+
sb.post_message("SeleniumBase wasn't detected", duration=3)

examples/cdp_mode/raw_handle_alerts.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
"""To handle alerts in CDP Mode, reconnect and use WebDriver."""
1+
"""An example of handling alerts in CDP Mode."""
22
from seleniumbase import SB
33

44
with SB(uc=True, test=True) as sb:
55
url = "https://the-internet.herokuapp.com/javascript_alerts"
66
sb.activate_cdp_mode(url)
7-
sb.reconnect()
87
sb.cdp.gui_click_element('button[onclick="jsAlert()"]')
98
sb.sleep(1)
10-
sb.accept_alert()
9+
sb.uc_gui_press_key("\n") # Accept Alert
1110
sb.sleep(1)
1211
sb.cdp.gui_click_element('button[onclick="jsConfirm()"]')
1312
sb.sleep(1)
14-
sb.dismiss_alert()
13+
sb.uc_gui_press_key("ESC") # Dismiss Alert
1514
sb.sleep(1)
1615
sb.cdp.gui_click_element('button[onclick="jsPrompt()"]')
1716
sb.sleep(1)

help_docs/method_summary.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ self.refresh()
4040
# Duplicates: self.refresh_page(), self.reload_page(), self.reload()
4141
self.get_current_url()
4242
self.get_origin()
43+
self.get_html()
4344
self.get_page_source()
4445
self.get_title()
4546
# Duplicates: self.get_page_title()

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ pathspec==0.12.1
1414
Babel==2.17.0
1515
paginate==0.5.7
1616
mkdocs==1.6.1
17-
mkdocs-material==9.6.22
17+
mkdocs-material==9.6.23
1818
mkdocs-exclude-search==0.6.6
1919
mkdocs-simple-hooks==0.1.5
2020
mkdocs-material-extensions==1.3.1

requirements.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ filelock~=3.16.1;python_version<"3.9"
1414
filelock~=3.19.1;python_version>="3.9" and python_version<"3.10"
1515
filelock>=3.20.0;python_version>="3.10"
1616
fasteners>=0.20
17-
mycdp>=1.2.1
17+
mycdp>=1.3.0
1818
pynose>=1.5.5
1919
platformdirs~=4.3.6;python_version<"3.9"
2020
platformdirs~=4.4.0;python_version>="3.9" and python_version<"3.10"
@@ -45,7 +45,8 @@ sniffio==1.3.1
4545
h11==0.16.0
4646
outcome==1.3.0.post0
4747
trio==0.27.0;python_version<"3.9"
48-
trio>=0.31.0,<1;python_version>="3.9"
48+
trio>=0.31.0,<1;python_version>="3.9" and python_version<"3.10"
49+
trio>=0.32.0,<1;python_version>="3.10"
4950
trio-websocket~=0.12.2
5051
wsproto==1.2.0
5152
websocket-client~=1.8.0;python_version<"3.9"

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.44.3"
2+
__version__ = "4.44.4"

seleniumbase/core/browser_launcher.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -295,14 +295,14 @@ def extend_driver(
295295
driver.set_wire_proxy = DM.set_wire_proxy
296296
completed_loads = []
297297
for ext_dir in sb_config._ext_dirs:
298-
with suppress(Exception):
299-
if ext_dir not in completed_loads:
300-
completed_loads.append(ext_dir)
301-
if not use_uc and os.path.exists(os.path.abspath(ext_dir)):
302-
driver.webextension.install(os.path.abspath(ext_dir))
298+
if ext_dir not in completed_loads:
299+
completed_loads.append(ext_dir)
300+
if not use_uc and os.path.exists(os.path.realpath(ext_dir)):
301+
with suppress(Exception):
302+
driver.webextension.install(os.path.realpath(ext_dir))
303303
if proxy_auth:
304-
with suppress(Exception):
305-
if not use_uc and os.path.exists(proxy_helper.PROXY_DIR_PATH):
304+
if not use_uc and os.path.exists(proxy_helper.PROXY_DIR_PATH):
305+
with suppress(Exception):
306306
driver.webextension.install(proxy_helper.PROXY_DIR_PATH)
307307
# Proxy needs a moment to load in Manifest V3
308308
if use_uc:
@@ -838,6 +838,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
838838
cdp.get_element_position = CDPM.get_element_position
839839
cdp.get_gui_element_rect = CDPM.get_gui_element_rect
840840
cdp.get_gui_element_center = CDPM.get_gui_element_center
841+
cdp.get_html = CDPM.get_html
841842
cdp.get_page_source = CDPM.get_page_source
842843
cdp.get_user_agent = CDPM.get_user_agent
843844
cdp.get_cookie_string = CDPM.get_cookie_string
@@ -934,6 +935,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
934935
cdp.core = core_items
935936
cdp.loop = cdp.get_event_loop()
936937
driver.cdp = cdp
938+
driver.solve_captcha = CDPM.solve_captcha
937939
driver._is_using_cdp = True
938940

939941

@@ -2477,7 +2479,7 @@ def _set_chrome_options(
24772479
# Can be a comma-separated list of .ZIP or .CRX files
24782480
extension_zip_list = extension_zip.split(",")
24792481
for extension_zip_item in extension_zip_list:
2480-
abs_path = os.path.abspath(extension_zip_item)
2482+
abs_path = os.path.realpath(extension_zip_item)
24812483
if os.path.exists(abs_path):
24822484
try:
24832485
abs_path_dir = os.path.join(
@@ -2494,11 +2496,11 @@ def _set_chrome_options(
24942496
if extension_dir:
24952497
# load-extension input can be a comma-separated list
24962498
abs_path = (
2497-
",".join(os.path.abspath(p) for p in extension_dir.split(","))
2499+
",".join(os.path.realpath(p) for p in extension_dir.split(","))
24982500
)
24992501
chrome_options = add_chrome_ext_dir(chrome_options, abs_path)
25002502
for p in extension_dir.split(","):
2501-
sb_config._ext_dirs.append(os.path.abspath(p))
2503+
sb_config._ext_dirs.append(os.path.realpath(p))
25022504
if (
25032505
page_load_strategy
25042506
and page_load_strategy.lower() in ["eager", "none"]
@@ -2742,10 +2744,12 @@ def _set_chrome_options(
27422744
included_disabled_features.append(item)
27432745
d_f_string = ",".join(included_disabled_features)
27442746
chrome_options.add_argument("--disable-features=%s" % d_f_string)
2747+
chrome_options.add_argument("--enable-unsafe-extension-debugging")
27452748
if proxy_auth:
27462749
chrome_options.add_argument("--test-type")
27472750
if proxy_auth or sb_config._ext_dirs:
27482751
if not is_using_uc(undetectable, browser_name):
2752+
chrome_options.add_argument("--remote-debugging-pipe")
27492753
chrome_options.enable_webextensions = True
27502754
chrome_options.enable_bidi = True
27512755
if (
@@ -4577,12 +4581,12 @@ def get_local_driver(
45774581
# Can be a comma-separated list of .ZIP or .CRX files
45784582
extension_zip_list = extension_zip.split(",")
45794583
for extension_zip_item in extension_zip_list:
4580-
abs_path = os.path.abspath(extension_zip_item)
4584+
abs_path = os.path.realpath(extension_zip_item)
45814585
edge_options.add_extension(abs_path)
45824586
if extension_dir:
45834587
# load-extension input can be a comma-separated list
45844588
abs_path = (
4585-
",".join(os.path.abspath(p) for p in extension_dir.split(","))
4589+
",".join(os.path.realpath(p) for p in extension_dir.split(","))
45864590
)
45874591
edge_options = add_chrome_ext_dir(edge_options, abs_path)
45884592
edge_options.add_argument("--disable-infobars")

seleniumbase/core/sb_cdp.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1185,7 +1185,14 @@ def get_origin(self):
11851185
self.page.evaluate("window.location.origin")
11861186
)
11871187

1188-
def get_page_source(self):
1188+
def get_html(self, include_shadow_dom=True):
1189+
return self.get_page_source(
1190+
include_shadow_dom=include_shadow_dom
1191+
)
1192+
1193+
def get_page_source(self, include_shadow_dom=True):
1194+
if include_shadow_dom:
1195+
return self.find_element("html").get_html()
11891196
try:
11901197
source = self.loop.run_until_complete(
11911198
self.page.evaluate("document.documentElement.outerHTML")

seleniumbase/fixtures/base_case.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1293,8 +1293,11 @@ def get_origin(self):
12931293
self.__check_scope()
12941294
return self.execute_script("return window.location.origin;")
12951295

1296-
def get_page_source(self):
1297-
if self.__is_cdp_swap_needed():
1296+
def get_html(self, *args, **kwargs):
1297+
return self.get_page_source(*args, **kwargs)
1298+
1299+
def get_page_source(self, *args, **kwargs):
1300+
if self.__is_cdp_swap_needed(*args, **kwargs):
12981301
return self.cdp.get_page_source()
12991302
self.wait_for_ready_state_complete()
13001303
if self.__needs_minimum_wait:

0 commit comments

Comments
 (0)