Skip to content

Commit 37f9ee5

Browse files
authored
Merge pull request #4207 from seleniumbase/hcaptcha-support-and-more
hCaptcha support, and more
2 parents 25f68b3 + 1a7e602 commit 37f9ee5

File tree

16 files changed

+191
-47
lines changed

16 files changed

+191
-47
lines changed

examples/cdp_mode/ReadMe.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ sb.cdp.select_all(selector, timeout=None)
391391
sb.cdp.find_elements(selector, timeout=None)
392392
sb.cdp.find_visible_elements(selector, timeout=None)
393393
sb.cdp.click(selector, timeout=None)
394-
sb.cdp.click_if_visible(selector)
394+
sb.cdp.click_if_visible(selector, timeout=0)
395395
sb.cdp.click_visible_elements(selector, limit=0)
396396
sb.cdp.click_nth_element(selector, number)
397397
sb.cdp.click_nth_visible_element(selector, number)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
"""Reddit Search / Bypasses reCAPTCHA."""
2+
from seleniumbase import sb_cdp
3+
4+
search = "reddit+scraper"
5+
url = f"https://www.reddit.com/r/webscraping/search/?q={search}"
6+
sb = sb_cdp.Chrome(url, use_chromium=True)
7+
sb.solve_captcha() # Might not be needed
8+
post_title = '[data-testid="post-title"]'
9+
sb.wait_for_element(post_title)
10+
for i in range(8):
11+
sb.scroll_down(25)
12+
sb.sleep(0.2)
13+
posts = sb.select_all(post_title)
14+
print('*** Reddit Posts for "%s":' % search)
15+
for post in posts:
16+
print("* " + post.text)

examples/cdp_mode/raw_cf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
"""Using CDP Mode with PyAutoGUI to bypass CAPTCHAs."""
22
from seleniumbase import SB
33

4-
with SB(uc=True, test=True, locale="en", guest=True) as sb:
4+
with SB(uc=True, test=True, guest=True) as sb:
55
url = "https://www.cloudflare.com/login"
66
sb.activate_cdp_mode(url)
77
sb.sleep(3)
88
sb.uc_gui_handle_captcha() # PyAutoGUI press Tab and Spacebar
99
sb.sleep(3)
1010

11-
with SB(uc=True, test=True, locale="en", guest=True) as sb:
11+
with SB(uc=True, test=True, guest=True) as sb:
1212
url = "https://www.cloudflare.com/login"
1313
sb.activate_cdp_mode(url)
1414
sb.sleep(4)

examples/cdp_mode/raw_cf_captcha.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
with SB(uc=True, test=True, guest=True) as sb:
44
url = "https://www.cloudflare.com/login"
55
sb.activate_cdp_mode(url)
6-
sb.sleep(3)
6+
sb.wait_for_element('div[data-testid*="challenge-widget"]')
7+
sb.sleep(1.5)
78
sb.solve_captcha()
89
sb.sleep(3)
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
"""(Bypasses the Imperva/Incapsula hCaptcha)"""
2+
from seleniumbase import SB
3+
4+
with SB(uc=True, test=True) as sb:
5+
url = (
6+
"https://www.gassaferegister.co.uk/gas-safety"
7+
"/gas-safety-certificates-records/building-regulations-certificate"
8+
"/order-replacement-building-regulations-certificate/"
9+
)
10+
sb.activate_cdp_mode(url)
11+
sb.sleep(0.6)
12+
sb.solve_captcha()
13+
sb.sleep(1)
14+
sb.wait_for_element("#SearchTerm", timeout=5)
15+
sb.sleep(2)
16+
allow_cookies = 'button:contains("Allow all cookies")'
17+
sb.click_if_visible(allow_cookies, timeout=2)
18+
sb.sleep(1.2)
19+
sb.press_keys("#SearchTerm", "Hydrogen")
20+
sb.sleep(0.5)
21+
sb.click("button.search-button")
22+
sb.sleep(3)
23+
results = sb.find_elements("div.search-result")
24+
for result in results:
25+
print(result.text.replace(" " * 12, " ").strip())
26+
print()
27+
sb.scroll_to_bottom()
28+
sb.sleep(1)

examples/raw_cf.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
"""SB Manager using CDP Mode for bypassing CAPTCHAs."""
22
from seleniumbase import SB
33

4-
with SB(uc=True, test=True, locale="en", guest=True) as sb:
4+
with SB(uc=True, test=True, guest=True) as sb:
55
url = "https://www.cloudflare.com/login"
66
sb.activate_cdp_mode(url)
7-
sb.sleep(4)
7+
sb.wait_for_element('div[data-testid*="challenge-widget"]')
8+
sb.sleep(1.5)
89
sb.solve_captcha()
9-
sb.sleep(2.5)
10+
sb.sleep(3)

mkdocs_build/requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ click==8.3.1
1010
ghp-import==2.1.0
1111
watchdog==6.0.0
1212
cairocffi==1.7.1
13-
pathspec==1.0.1
13+
pathspec==1.0.3
1414
Babel==2.17.0
1515
paginate==0.5.7
1616
mkdocs==1.6.1

requirements.txt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ wheel>=0.45.1
66
attrs>=25.4.0
77
certifi>=2026.1.4
88
exceptiongroup>=1.3.1
9-
websockets>=15.0.1
9+
websockets~=15.0.1;python_version<"3.10"
10+
websockets>=16.0;python_version>="3.10"
1011
filelock~=3.19.1;python_version<"3.10"
11-
filelock>=3.20.2;python_version>="3.10"
12+
filelock>=3.20.3;python_version>="3.10"
1213
fasteners>=0.20
1314
mycdp>=1.3.2
1415
pynose>=1.5.5
@@ -26,7 +27,7 @@ pyyaml>=6.0.3
2627
pygments>=2.19.2
2728
pyreadline3>=3.5.4;platform_system=="Windows"
2829
tabcompleter>=1.4.0
29-
pdbp>=1.8.1
30+
pdbp>=1.8.2
3031
idna>=3.11
3132
chardet==5.2.0
3233
charset-normalizer>=3.4.4,<4

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.45.10"
2+
__version__ = "4.45.11"

seleniumbase/console_scripts/sb_install.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -554,7 +554,15 @@ def main(override=None, intel_for_uc=None, force_uc=None):
554554
else:
555555
url_request = get_cft_latest_versions_per_milestone()
556556
if not force_cft and url_request.ok:
557-
fver = get_cft_latest_version_from_milestone(use_version)
557+
try:
558+
fver = get_cft_latest_version_from_milestone(
559+
use_version
560+
)
561+
except KeyError:
562+
use_version = str(int(use_version) - 1)
563+
fver = get_cft_latest_version_from_milestone(
564+
use_version
565+
)
558566
found_chromedriver = True
559567
use_version = str(fver)
560568
if use_version == latest_version:

0 commit comments

Comments
 (0)