From e0dc64b850e2ec66e804652253bb6b35396d38aa Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 6 Mar 2025 20:45:04 -0500 Subject: [PATCH 1/5] Update CDP Mode --- seleniumbase/core/browser_launcher.py | 41 +++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index 182c70c5..6341d61e 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -1288,6 +1288,13 @@ def _uc_gui_click_captcha( and driver.is_element_present("form div:not(:has(*))") ): frame = "form div:not(:has(*))" + elif ( + driver.is_element_present('[src*="/turnstile/"]') + and driver.is_element_present( + "body > div#check > div:not([class])" + ) + ): + frame = "body > div#check > div:not([class])" elif driver.is_element_present(".cf-turnstile-wrapper"): frame = ".cf-turnstile-wrapper" elif driver.is_element_present( @@ -1321,13 +1328,34 @@ def _uc_gui_click_captcha( driver.execute_script(script) elif ( driver.is_element_present("form") - and driver.is_element_present( - "form.turnstile #turnstile-widget > div:not([class])" + and ( + driver.is_element_present('form div[style*="center"]') + or driver.is_element_present('form div[style*="right"]') ) ): script = ( """var $elements = document.querySelectorAll( - 'form.turnstile #turnstile-widget'); + 'form[style], form div[style]'); + var index = 0, length = $elements.length; + for(; index < length; index++){ + the_style = $elements[index].getAttribute('style'); + new_style = the_style.replaceAll('center', 'left'); + new_style = new_style.replaceAll('right', 'left'); + $elements[index].setAttribute('style', new_style);}""" + ) + if __is_cdp_swap_needed(driver): + driver.cdp.evaluate(script) + else: + driver.execute_script(script) + elif ( + driver.is_element_present("form") + and driver.is_element_present( + 'form [id*="turnstile"] > div:not([class])' + ) + ): + script = ( + """var $elements = document.querySelectorAll( + 'form [id*="turnstile"]'); var index = 0, length = $elements.length; for(; index < length; index++){ $elements[index].setAttribute('align', 'left');}""" @@ -1577,6 +1605,13 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None): ): frame = "form div:not(:has(*))" tab_up_first = True + elif ( + driver.is_element_present('[src*="/turnstile/"]') + and driver.is_element_present( + "body > div#check > div:not([class])" + ) + ): + frame = "body > div#check > div:not([class])" else: return else: From 1372bfdcbd599071565e807f0109ea0710bc4f60 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 6 Mar 2025 20:46:15 -0500 Subject: [PATCH 2/5] Update command-line options --- seleniumbase/plugins/driver_manager.py | 17 +++++++++++++++++ seleniumbase/plugins/sb_manager.py | 17 +++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/seleniumbase/plugins/driver_manager.py b/seleniumbase/plugins/driver_manager.py index 72609637..663f06d0 100644 --- a/seleniumbase/plugins/driver_manager.py +++ b/seleniumbase/plugins/driver_manager.py @@ -781,6 +781,23 @@ def Driver( swiftshader = False if locale is not None and locale_code is None: locale_code = locale + if locale_code is None: + if '--locale="' in arg_join: + locale_code = ( + arg_join.split('--locale="')[1].split('"')[0] + ) + elif '--locale=' in arg_join: + locale_code = ( + arg_join.split('--locale=')[1].split(' ')[0] + ) + elif '--locale-code="' in arg_join: + locale_code = ( + arg_join.split('--locale-code="')[1].split('"')[0] + ) + elif '--locale-code=' in arg_join: + locale_code = ( + arg_join.split('--locale-code=')[1].split(' ')[0] + ) if ad_block is not None and ad_block_on is None: ad_block_on = ad_block if ad_block_on is None: diff --git a/seleniumbase/plugins/sb_manager.py b/seleniumbase/plugins/sb_manager.py index b3081c0a..0ed56d60 100644 --- a/seleniumbase/plugins/sb_manager.py +++ b/seleniumbase/plugins/sb_manager.py @@ -942,6 +942,23 @@ def SB( swiftshader = False if locale is not None and locale_code is None: locale_code = locale + if locale_code is None: + if '--locale="' in arg_join: + locale_code = ( + arg_join.split('--locale="')[1].split('"')[0] + ) + elif '--locale=' in arg_join: + locale_code = ( + arg_join.split('--locale=')[1].split(' ')[0] + ) + elif '--locale-code="' in arg_join: + locale_code = ( + arg_join.split('--locale-code="')[1].split('"')[0] + ) + elif '--locale-code=' in arg_join: + locale_code = ( + arg_join.split('--locale-code=')[1].split(' ')[0] + ) if ad_block is not None and ad_block_on is None: ad_block_on = ad_block if ad_block_on is None: From 31c0ffaa85b8b5dc4cf91396829ca17e2c19dd79 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 6 Mar 2025 20:48:39 -0500 Subject: [PATCH 3/5] Refresh Python dependencies --- requirements.txt | 4 ++-- setup.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 4b6801c4..f2153903 100755 --- a/requirements.txt +++ b/requirements.txt @@ -7,7 +7,7 @@ attrs>=25.1.0 certifi>=2025.1.31 exceptiongroup>=1.2.2 websockets~=13.1;python_version<"3.9" -websockets>=15.0;python_version>="3.9" +websockets>=15.0.1;python_version>="3.9" filelock~=3.16.1;python_version<"3.9" filelock>=3.17.0;python_version>="3.9" fasteners>=0.19 @@ -18,7 +18,7 @@ typing-extensions>=4.12.2 sbvirtualdisplay>=1.4.0 MarkupSafe==2.1.5;python_version<"3.9" MarkupSafe>=3.0.2;python_version>="3.9" -Jinja2>=3.1.5 +Jinja2>=3.1.6 six>=1.17.0 parse>=1.20.2 parse-type>=0.6.4 diff --git a/setup.py b/setup.py index f463a29e..6d6a804d 100755 --- a/setup.py +++ b/setup.py @@ -156,7 +156,7 @@ setup( "certifi>=2025.1.31", "exceptiongroup>=1.2.2", 'websockets~=13.1;python_version<"3.9"', - 'websockets>=15.0;python_version>="3.9"', + 'websockets>=15.0.1;python_version>="3.9"', 'filelock~=3.16.1;python_version<"3.9"', 'filelock>=3.17.0;python_version>="3.9"', 'fasteners>=0.19', @@ -167,7 +167,7 @@ setup( "sbvirtualdisplay>=1.4.0", 'MarkupSafe==2.1.5;python_version<"3.9"', 'MarkupSafe>=3.0.2;python_version>="3.9"', - "Jinja2>=3.1.5", + "Jinja2>=3.1.6", "six>=1.17.0", 'parse>=1.20.2', 'parse-type>=0.6.4', From e30e30e8f89c6f81fab2ebacf4eda75336dc26bc Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 6 Mar 2025 20:49:55 -0500 Subject: [PATCH 4/5] Add a new CDP Mode example --- examples/cdp_mode/raw_consecutive_c.py | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 examples/cdp_mode/raw_consecutive_c.py diff --git a/examples/cdp_mode/raw_consecutive_c.py b/examples/cdp_mode/raw_consecutive_c.py new file mode 100644 index 00000000..5ac1b7aa --- /dev/null +++ b/examples/cdp_mode/raw_consecutive_c.py @@ -0,0 +1,11 @@ +# An example of bypassing 2 consecutive CF CAPTCHAs""" +from seleniumbase import SB + +with SB(uc=True, test=True) as sb: + url = "https://sms-man.com/login" + sb.activate_cdp_mode(url) + sb.sleep(2) + sb.uc_gui_click_captcha() + sb.sleep(2) + sb.uc_gui_click_captcha() + sb.sleep(2) From 7c73ae30eed67c1449f45d5bbaba874f7bfe7e40 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 6 Mar 2025 20:50:12 -0500 Subject: [PATCH 5/5] Version 4.35.5 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 7fb5236d..a678865f 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.35.4" +__version__ = "4.35.5"