seleniumbase 4.31.6a4__py3-none-any.whl → 4.32.0__py3-none-any.whl
Sign up to get free protection for your applications and to get access to all the features.
- seleniumbase/__version__.py +1 -1
- seleniumbase/common/decorators.py +8 -7
- seleniumbase/console_scripts/sb_install.py +4 -4
- seleniumbase/core/browser_launcher.py +252 -44
- seleniumbase/core/sb_cdp.py +898 -0
- seleniumbase/core/sb_driver.py +44 -0
- seleniumbase/fixtures/base_case.py +208 -6
- seleniumbase/fixtures/constants.py +1 -0
- seleniumbase/fixtures/js_utils.py +4 -0
- seleniumbase/fixtures/page_actions.py +106 -0
- seleniumbase/fixtures/shared_utils.py +26 -0
- seleniumbase/plugins/driver_manager.py +136 -47
- seleniumbase/plugins/sb_manager.py +40 -1
- seleniumbase/undetected/__init__.py +2 -0
- seleniumbase/undetected/patcher.py +5 -5
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/METADATA +26 -20
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/RECORD +21 -20
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/WHEEL +1 -1
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/LICENSE +0 -0
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/entry_points.txt +0 -0
- {seleniumbase-4.31.6a4.dist-info → seleniumbase-4.32.0.dist-info}/top_level.txt +0 -0
seleniumbase/__version__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# seleniumbase package
|
2
|
-
__version__ = "4.
|
2
|
+
__version__ = "4.32.0"
|
@@ -43,23 +43,24 @@ def print_runtime(description=None, limit=None):
|
|
43
43
|
finally:
|
44
44
|
end_time = time.time()
|
45
45
|
run_time = end_time - start_time
|
46
|
+
name = description
|
46
47
|
# Print times with a statistically significant number of decimal places
|
47
48
|
if run_time < 0.0001:
|
48
|
-
print("
|
49
|
+
print("<info> - {%s} ran for %.7f seconds." % (name, run_time))
|
49
50
|
elif run_time < 0.001:
|
50
|
-
print("
|
51
|
+
print("<info> - {%s} ran for %.6f seconds." % (name, run_time))
|
51
52
|
elif run_time < 0.01:
|
52
|
-
print("
|
53
|
+
print("<info> - {%s} ran for %.5f seconds." % (name, run_time))
|
53
54
|
elif run_time < 0.1:
|
54
|
-
print("
|
55
|
+
print("<info> - {%s} ran for %.4f seconds." % (name, run_time))
|
55
56
|
elif run_time < 1:
|
56
|
-
print("
|
57
|
+
print("<info> - {%s} ran for %.3f seconds." % (name, run_time))
|
57
58
|
else:
|
58
|
-
print("
|
59
|
+
print("<info> - {%s} ran for %.2f seconds." % (name, run_time))
|
59
60
|
if limit and limit > 0 and run_time > limit:
|
60
61
|
message = (
|
61
62
|
"\n {%s} duration of %.2fs exceeded the time limit of %.2fs!"
|
62
|
-
% (
|
63
|
+
% (name, run_time, limit)
|
63
64
|
)
|
64
65
|
if exception:
|
65
66
|
message = exception.msg + "\nAND " + message
|
@@ -811,7 +811,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
|
|
811
811
|
zip_ref.extractall(downloads_folder)
|
812
812
|
zip_ref.close()
|
813
813
|
os.remove(zip_file_path)
|
814
|
-
shutil.
|
814
|
+
shutil.copy3(driver_path, os.path.join(downloads_folder, filename))
|
815
815
|
log_d("%sUnzip Complete!%s\n" % (c2, cr))
|
816
816
|
to_remove = [
|
817
817
|
"%s/%s/ruby_example/Gemfile" % (downloads_folder, h_ie_fn),
|
@@ -953,7 +953,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
|
|
953
953
|
)
|
954
954
|
if copy_to_path and os.path.exists(LOCAL_PATH):
|
955
955
|
path_file = LOCAL_PATH + f_name
|
956
|
-
shutil.
|
956
|
+
shutil.copy2(new_file, path_file)
|
957
957
|
make_executable(path_file)
|
958
958
|
log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
|
959
959
|
log_d("")
|
@@ -1042,7 +1042,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
|
|
1042
1042
|
)
|
1043
1043
|
if copy_to_path and os.path.exists(LOCAL_PATH):
|
1044
1044
|
path_file = LOCAL_PATH + f_name
|
1045
|
-
shutil.
|
1045
|
+
shutil.copy2(new_file, path_file)
|
1046
1046
|
make_executable(path_file)
|
1047
1047
|
log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
|
1048
1048
|
log_d("")
|
@@ -1078,7 +1078,7 @@ def main(override=None, intel_for_uc=None, force_uc=None):
|
|
1078
1078
|
)
|
1079
1079
|
if copy_to_path and os.path.exists(LOCAL_PATH):
|
1080
1080
|
path_file = LOCAL_PATH + f_name
|
1081
|
-
shutil.
|
1081
|
+
shutil.copy2(new_file, path_file)
|
1082
1082
|
make_executable(path_file)
|
1083
1083
|
log_d("Also copied to: %s%s%s" % (c3, path_file, cr))
|
1084
1084
|
log_d("")
|
@@ -29,6 +29,7 @@ from seleniumbase.core import detect_b_ver
|
|
29
29
|
from seleniumbase.core import download_helper
|
30
30
|
from seleniumbase.core import proxy_helper
|
31
31
|
from seleniumbase.core import sb_driver
|
32
|
+
from seleniumbase.core import sb_cdp
|
32
33
|
from seleniumbase.fixtures import constants
|
33
34
|
from seleniumbase.fixtures import js_utils
|
34
35
|
from seleniumbase.fixtures import page_actions
|
@@ -153,8 +154,10 @@ def extend_driver(driver):
|
|
153
154
|
page.find_element = DM.find_element
|
154
155
|
page.find_elements = DM.find_elements
|
155
156
|
page.locator = DM.locator
|
157
|
+
page.get_current_url = DM.get_current_url
|
156
158
|
page.get_page_source = DM.get_page_source
|
157
159
|
page.get_title = DM.get_title
|
160
|
+
page.get_page_title = DM.get_title
|
158
161
|
page.switch_to_default_window = DM.switch_to_default_window
|
159
162
|
page.switch_to_newest_window = DM.switch_to_newest_window
|
160
163
|
page.open_new_window = DM.open_new_window
|
@@ -206,6 +209,9 @@ def extend_driver(driver):
|
|
206
209
|
driver.is_valid_url = DM.is_valid_url
|
207
210
|
driver.is_alert_present = DM.is_alert_present
|
208
211
|
driver.is_online = DM.is_online
|
212
|
+
driver.is_connected = DM.is_connected
|
213
|
+
driver.is_uc_mode_active = DM.is_uc_mode_active
|
214
|
+
driver.is_cdp_mode_active = DM.is_cdp_mode_active
|
209
215
|
driver.js_click = DM.js_click
|
210
216
|
driver.get_text = DM.get_text
|
211
217
|
driver.get_active_element_css = DM.get_active_element_css
|
@@ -217,8 +223,10 @@ def extend_driver(driver):
|
|
217
223
|
driver.highlight_if_visible = DM.highlight_if_visible
|
218
224
|
driver.sleep = time.sleep
|
219
225
|
driver.get_attribute = DM.get_attribute
|
226
|
+
driver.get_current_url = DM.get_current_url
|
220
227
|
driver.get_page_source = DM.get_page_source
|
221
228
|
driver.get_title = DM.get_title
|
229
|
+
driver.get_page_title = DM.get_title
|
222
230
|
driver.switch_to_default_window = DM.switch_to_default_window
|
223
231
|
driver.switch_to_newest_window = DM.switch_to_newest_window
|
224
232
|
driver.open_new_window = DM.open_new_window
|
@@ -362,6 +370,11 @@ def has_captcha(text):
|
|
362
370
|
return False
|
363
371
|
|
364
372
|
|
373
|
+
def __is_cdp_swap_needed(driver):
|
374
|
+
"""If the driver is disconnected, use a CDP method when available."""
|
375
|
+
return shared_utils.is_cdp_swap_needed(driver)
|
376
|
+
|
377
|
+
|
365
378
|
def uc_special_open_if_cf(
|
366
379
|
driver,
|
367
380
|
url,
|
@@ -432,10 +445,11 @@ def uc_special_open_if_cf(
|
|
432
445
|
|
433
446
|
|
434
447
|
def uc_open(driver, url):
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
448
|
+
url = shared_utils.fix_url_as_needed(url)
|
449
|
+
if __is_cdp_swap_needed(driver):
|
450
|
+
driver.cdp.get(url)
|
451
|
+
time.sleep(0.3)
|
452
|
+
return
|
439
453
|
if (url.startswith("http:") or url.startswith("https:")):
|
440
454
|
with driver:
|
441
455
|
script = 'window.location.href = "%s";' % url
|
@@ -446,10 +460,11 @@ def uc_open(driver, url):
|
|
446
460
|
|
447
461
|
|
448
462
|
def uc_open_with_tab(driver, url):
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
463
|
+
url = shared_utils.fix_url_as_needed(url)
|
464
|
+
if __is_cdp_swap_needed(driver):
|
465
|
+
driver.cdp.get(url)
|
466
|
+
time.sleep(0.3)
|
467
|
+
return
|
453
468
|
if (url.startswith("http:") or url.startswith("https:")):
|
454
469
|
with driver:
|
455
470
|
driver.execute_script('window.open("%s","_blank");' % url)
|
@@ -462,12 +477,13 @@ def uc_open_with_tab(driver, url):
|
|
462
477
|
|
463
478
|
def uc_open_with_reconnect(driver, url, reconnect_time=None):
|
464
479
|
"""Open a url, disconnect chromedriver, wait, and reconnect."""
|
480
|
+
url = shared_utils.fix_url_as_needed(url)
|
481
|
+
if __is_cdp_swap_needed(driver):
|
482
|
+
driver.cdp.get(url)
|
483
|
+
time.sleep(0.3)
|
484
|
+
return
|
465
485
|
if not reconnect_time:
|
466
486
|
reconnect_time = constants.UC.RECONNECT_TIME
|
467
|
-
if url.startswith("//"):
|
468
|
-
url = "https:" + url
|
469
|
-
elif ":" not in url:
|
470
|
-
url = "https://" + url
|
471
487
|
if (url.startswith("http:") or url.startswith("https:")):
|
472
488
|
script = 'window.open("%s","_blank");' % url
|
473
489
|
driver.execute_script(script)
|
@@ -493,15 +509,157 @@ def uc_open_with_reconnect(driver, url, reconnect_time=None):
|
|
493
509
|
return None
|
494
510
|
|
495
511
|
|
512
|
+
def uc_open_with_cdp_mode(driver, url=None):
|
513
|
+
import asyncio
|
514
|
+
from seleniumbase.undetected.cdp_driver import cdp_util
|
515
|
+
|
516
|
+
current_url = None
|
517
|
+
try:
|
518
|
+
current_url = driver.current_url
|
519
|
+
except Exception:
|
520
|
+
driver.connect()
|
521
|
+
current_url = driver.current_url
|
522
|
+
url_protocol = current_url.split(":")[0]
|
523
|
+
if url_protocol not in ["about", "data", "chrome"]:
|
524
|
+
script = 'window.open("data:,","_blank");'
|
525
|
+
js_utils.call_me_later(driver, script, 3)
|
526
|
+
time.sleep(0.012)
|
527
|
+
driver.close()
|
528
|
+
driver.clear_cdp_listeners()
|
529
|
+
driver.delete_all_cookies()
|
530
|
+
driver.delete_network_conditions()
|
531
|
+
driver.disconnect()
|
532
|
+
|
533
|
+
cdp_details = driver._get_cdp_details()
|
534
|
+
cdp_host = cdp_details[1].split("://")[1].split(":")[0]
|
535
|
+
cdp_port = int(cdp_details[1].split("://")[1].split(":")[1].split("/")[0])
|
536
|
+
|
537
|
+
url = shared_utils.fix_url_as_needed(url)
|
538
|
+
url_protocol = url.split(":")[0]
|
539
|
+
safe_url = True
|
540
|
+
if url_protocol not in ["about", "data", "chrome"]:
|
541
|
+
safe_url = False
|
542
|
+
|
543
|
+
loop = asyncio.new_event_loop()
|
544
|
+
asyncio.set_event_loop(loop)
|
545
|
+
driver.cdp_base = loop.run_until_complete(
|
546
|
+
cdp_util.start(host=cdp_host, port=cdp_port)
|
547
|
+
)
|
548
|
+
page = loop.run_until_complete(driver.cdp_base.get(url))
|
549
|
+
if not safe_url:
|
550
|
+
time.sleep(constants.UC.CDP_MODE_OPEN_WAIT)
|
551
|
+
cdp = types.SimpleNamespace()
|
552
|
+
CDPM = sb_cdp.CDPMethods(loop, page, driver)
|
553
|
+
cdp.get = CDPM.get
|
554
|
+
cdp.open = CDPM.get
|
555
|
+
cdp.reload = CDPM.reload
|
556
|
+
cdp.refresh = CDPM.refresh
|
557
|
+
cdp.add_handler = CDPM.add_handler
|
558
|
+
cdp.get_event_loop = CDPM.get_event_loop
|
559
|
+
cdp.find_element = CDPM.find_element
|
560
|
+
cdp.find = CDPM.find_element
|
561
|
+
cdp.locator = CDPM.find_element
|
562
|
+
cdp.find_all = CDPM.find_all
|
563
|
+
cdp.find_elements_by_text = CDPM.find_elements_by_text
|
564
|
+
cdp.select = CDPM.select
|
565
|
+
cdp.select_all = CDPM.select_all
|
566
|
+
cdp.click_link = CDPM.click_link
|
567
|
+
cdp.tile_windows = CDPM.tile_windows
|
568
|
+
cdp.get_all_cookies = CDPM.get_all_cookies
|
569
|
+
cdp.set_all_cookies = CDPM.set_all_cookies
|
570
|
+
cdp.save_cookies = CDPM.save_cookies
|
571
|
+
cdp.load_cookies = CDPM.load_cookies
|
572
|
+
cdp.clear_cookies = CDPM.clear_cookies
|
573
|
+
cdp.bring_active_window_to_front = CDPM.bring_active_window_to_front
|
574
|
+
cdp.bring_to_front = CDPM.bring_active_window_to_front
|
575
|
+
cdp.get_active_element = CDPM.get_active_element
|
576
|
+
cdp.get_active_element_css = CDPM.get_active_element_css
|
577
|
+
cdp.click = CDPM.click
|
578
|
+
cdp.click_active_element = CDPM.click_active_element
|
579
|
+
cdp.click_if_visible = CDPM.click_if_visible
|
580
|
+
cdp.mouse_click = CDPM.mouse_click
|
581
|
+
cdp.remove_element = CDPM.remove_element
|
582
|
+
cdp.remove_from_dom = CDPM.remove_from_dom
|
583
|
+
cdp.remove_elements = CDPM.remove_elements
|
584
|
+
cdp.scroll_into_view = CDPM.scroll_into_view
|
585
|
+
cdp.send_keys = CDPM.send_keys
|
586
|
+
cdp.press_keys = CDPM.press_keys
|
587
|
+
cdp.type = CDPM.type
|
588
|
+
cdp.evaluate = CDPM.evaluate
|
589
|
+
cdp.js_dumps = CDPM.js_dumps
|
590
|
+
cdp.maximize = CDPM.maximize
|
591
|
+
cdp.minimize = CDPM.minimize
|
592
|
+
cdp.medimize = CDPM.medimize
|
593
|
+
cdp.set_window_rect = CDPM.set_window_rect
|
594
|
+
cdp.reset_window_size = CDPM.reset_window_size
|
595
|
+
cdp.set_attributes = CDPM.set_attributes
|
596
|
+
cdp.internalize_links = CDPM.internalize_links
|
597
|
+
cdp.get_window = CDPM.get_window
|
598
|
+
cdp.get_element_attributes = CDPM.get_element_attributes
|
599
|
+
cdp.get_element_html = CDPM.get_element_html
|
600
|
+
cdp.get_element_rect = CDPM.get_element_rect
|
601
|
+
cdp.get_element_size = CDPM.get_element_size
|
602
|
+
cdp.get_element_position = CDPM.get_element_position
|
603
|
+
cdp.get_gui_element_rect = CDPM.get_gui_element_rect
|
604
|
+
cdp.get_gui_element_center = CDPM.get_gui_element_center
|
605
|
+
cdp.get_page_source = CDPM.get_page_source
|
606
|
+
cdp.get_user_agent = CDPM.get_user_agent
|
607
|
+
cdp.get_cookie_string = CDPM.get_cookie_string
|
608
|
+
cdp.get_locale_code = CDPM.get_locale_code
|
609
|
+
cdp.get_text = CDPM.get_text
|
610
|
+
cdp.get_title = CDPM.get_title
|
611
|
+
cdp.get_page_title = CDPM.get_title
|
612
|
+
cdp.get_current_url = CDPM.get_current_url
|
613
|
+
cdp.get_origin = CDPM.get_origin
|
614
|
+
cdp.get_nested_element = CDPM.get_nested_element
|
615
|
+
cdp.get_document = CDPM.get_document
|
616
|
+
cdp.get_flattened_document = CDPM.get_flattened_document
|
617
|
+
cdp.get_screen_rect = CDPM.get_screen_rect
|
618
|
+
cdp.get_window_rect = CDPM.get_window_rect
|
619
|
+
cdp.get_window_size = CDPM.get_window_size
|
620
|
+
cdp.nested_click = CDPM.nested_click
|
621
|
+
cdp.flash = CDPM.flash
|
622
|
+
cdp.focus = CDPM.focus
|
623
|
+
cdp.highlight_overlay = CDPM.highlight_overlay
|
624
|
+
cdp.get_window_position = CDPM.get_window_position
|
625
|
+
cdp.is_element_present = CDPM.is_element_present
|
626
|
+
cdp.is_element_visible = CDPM.is_element_visible
|
627
|
+
cdp.assert_element_present = CDPM.assert_element_present
|
628
|
+
cdp.assert_element = CDPM.assert_element
|
629
|
+
cdp.assert_element_visible = CDPM.assert_element
|
630
|
+
cdp.assert_text = CDPM.assert_text
|
631
|
+
cdp.assert_exact_text = CDPM.assert_exact_text
|
632
|
+
cdp.save_screenshot = CDPM.save_screenshot
|
633
|
+
cdp.page = page # async world
|
634
|
+
cdp.driver = driver.cdp_base # async world
|
635
|
+
cdp.tab = cdp.page # shortcut (original)
|
636
|
+
cdp.browser = driver.cdp_base # shortcut (original)
|
637
|
+
cdp.util = cdp_util # shortcut (original)
|
638
|
+
core_items = types.SimpleNamespace()
|
639
|
+
core_items.browser = cdp.browser
|
640
|
+
core_items.tab = cdp.tab
|
641
|
+
core_items.util = cdp.util
|
642
|
+
cdp.core = core_items
|
643
|
+
driver.cdp = cdp
|
644
|
+
driver._is_using_cdp = True
|
645
|
+
|
646
|
+
|
647
|
+
def uc_activate_cdp_mode(driver, url=None):
|
648
|
+
uc_open_with_cdp_mode(driver, url=url)
|
649
|
+
|
650
|
+
|
496
651
|
def uc_open_with_disconnect(driver, url, timeout=None):
|
497
652
|
"""Open a url and disconnect chromedriver.
|
498
653
|
Then waits for the duration of the timeout.
|
499
654
|
Note: You can't perform Selenium actions again
|
500
655
|
until after you've called driver.connect()."""
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
656
|
+
url = shared_utils.fix_url_as_needed(url)
|
657
|
+
if __is_cdp_swap_needed(driver):
|
658
|
+
driver.cdp.get(url)
|
659
|
+
time.sleep(0.3)
|
660
|
+
return
|
661
|
+
if not driver.is_connected():
|
662
|
+
driver.connect()
|
505
663
|
if (url.startswith("http:") or url.startswith("https:")):
|
506
664
|
script = 'window.open("%s","_blank");' % url
|
507
665
|
driver.execute_script(script)
|
@@ -685,6 +843,9 @@ def uc_gui_write(driver, text):
|
|
685
843
|
|
686
844
|
|
687
845
|
def get_gui_element_position(driver, selector):
|
846
|
+
if __is_cdp_swap_needed(driver):
|
847
|
+
element_rect = driver.cdp.get_gui_element_rect(selector)
|
848
|
+
return (element_rect["x"], element_rect["y"])
|
688
849
|
element = driver.wait_for_element_present(selector, timeout=3)
|
689
850
|
element_rect = element.rect
|
690
851
|
window_rect = driver.get_window_rect()
|
@@ -823,6 +984,7 @@ def _uc_gui_click_captcha(
|
|
823
984
|
blind=False,
|
824
985
|
ctype=None,
|
825
986
|
):
|
987
|
+
cdp_mode_on_at_start = __is_cdp_swap_needed(driver)
|
826
988
|
_on_a_captcha_page = None
|
827
989
|
if ctype == "cf_t":
|
828
990
|
if not _on_a_cf_turnstile_page(driver):
|
@@ -864,10 +1026,13 @@ def _uc_gui_click_captcha(
|
|
864
1026
|
is_in_frame = js_utils.is_in_frame(driver)
|
865
1027
|
if not is_in_frame:
|
866
1028
|
# Make sure the window is on top
|
867
|
-
|
868
|
-
driver
|
869
|
-
|
870
|
-
|
1029
|
+
if __is_cdp_swap_needed(driver):
|
1030
|
+
driver.cdp.bring_active_window_to_front()
|
1031
|
+
else:
|
1032
|
+
page_actions.switch_to_window(
|
1033
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
1034
|
+
)
|
1035
|
+
if IS_WINDOWS and not __is_cdp_swap_needed(driver):
|
871
1036
|
window_rect = driver.get_window_rect()
|
872
1037
|
width = window_rect["width"]
|
873
1038
|
height = window_rect["height"]
|
@@ -950,7 +1115,10 @@ def _uc_gui_click_captcha(
|
|
950
1115
|
new_class = the_class.replaceAll('center', 'left');
|
951
1116
|
$elements[index].setAttribute('class', new_class);}"""
|
952
1117
|
)
|
953
|
-
driver
|
1118
|
+
if __is_cdp_swap_needed(driver):
|
1119
|
+
driver.cdp.evaluate(script)
|
1120
|
+
else:
|
1121
|
+
driver.execute_script(script)
|
954
1122
|
if not is_in_frame or needs_switch:
|
955
1123
|
# Currently not in frame (or nested frame outside CF one)
|
956
1124
|
try:
|
@@ -961,16 +1129,22 @@ def _uc_gui_click_captcha(
|
|
961
1129
|
if visible_iframe:
|
962
1130
|
if driver.is_element_present("iframe"):
|
963
1131
|
i_x, i_y = get_gui_element_position(driver, "iframe")
|
964
|
-
driver.
|
1132
|
+
if driver.is_connected():
|
1133
|
+
driver.switch_to_frame("iframe")
|
965
1134
|
else:
|
966
1135
|
return
|
967
1136
|
if not i_x or not i_y:
|
968
1137
|
return
|
969
1138
|
try:
|
970
|
-
if
|
1139
|
+
if ctype == "g_rc" and not driver.is_connected():
|
1140
|
+
x = (i_x + 32) * width_ratio
|
1141
|
+
y = (i_y + 34) * width_ratio
|
1142
|
+
elif visible_iframe:
|
971
1143
|
selector = "span"
|
972
1144
|
if ctype == "g_rc":
|
973
1145
|
selector = "span.recaptcha-checkbox"
|
1146
|
+
if not driver.is_connected():
|
1147
|
+
selector = "iframe"
|
974
1148
|
element = driver.wait_for_element_present(
|
975
1149
|
selector, timeout=2.5
|
976
1150
|
)
|
@@ -981,16 +1155,18 @@ def _uc_gui_click_captcha(
|
|
981
1155
|
else:
|
982
1156
|
x = (i_x + 34) * width_ratio
|
983
1157
|
y = (i_y + 34) * width_ratio
|
984
|
-
driver.
|
985
|
-
except Exception:
|
986
|
-
try:
|
1158
|
+
if driver.is_connected():
|
987
1159
|
driver.switch_to.default_content()
|
988
|
-
|
989
|
-
|
1160
|
+
except Exception:
|
1161
|
+
if driver.is_connected():
|
1162
|
+
try:
|
1163
|
+
driver.switch_to.default_content()
|
1164
|
+
except Exception:
|
1165
|
+
return
|
990
1166
|
if x and y:
|
991
1167
|
sb_config._saved_cf_x_y = (x, y)
|
992
1168
|
if driver.is_element_present(".footer .clearfix .ray-id"):
|
993
|
-
driver.uc_open_with_disconnect(driver.
|
1169
|
+
driver.uc_open_with_disconnect(driver.get_current_url(), 3.8)
|
994
1170
|
else:
|
995
1171
|
driver.disconnect()
|
996
1172
|
with suppress(Exception):
|
@@ -1013,9 +1189,12 @@ def _uc_gui_click_captcha(
|
|
1013
1189
|
if retry and x and y and (caught or _on_a_captcha_page(driver)):
|
1014
1190
|
with gui_lock: # Prevent issues with multiple processes
|
1015
1191
|
# Make sure the window is on top
|
1016
|
-
|
1017
|
-
driver
|
1018
|
-
|
1192
|
+
if __is_cdp_swap_needed(driver):
|
1193
|
+
driver.cdp.bring_active_window_to_front()
|
1194
|
+
else:
|
1195
|
+
page_actions.switch_to_window(
|
1196
|
+
driver, driver.current_window_handle, 2, uc_lock=False
|
1197
|
+
)
|
1019
1198
|
if driver.is_element_present("iframe"):
|
1020
1199
|
try:
|
1021
1200
|
driver.switch_to_frame(frame)
|
@@ -1035,14 +1214,18 @@ def _uc_gui_click_captcha(
|
|
1035
1214
|
driver.switch_to.parent_frame(checkbox_success)
|
1036
1215
|
return
|
1037
1216
|
if blind:
|
1038
|
-
driver.uc_open_with_disconnect(driver.
|
1039
|
-
|
1217
|
+
driver.uc_open_with_disconnect(driver.get_current_url(), 3.8)
|
1218
|
+
if __is_cdp_swap_needed(driver) and _on_a_captcha_page(driver):
|
1219
|
+
_uc_gui_click_x_y(driver, x, y, timeframe=0.32)
|
1220
|
+
else:
|
1221
|
+
time.sleep(0.1)
|
1040
1222
|
else:
|
1041
|
-
driver.uc_open_with_reconnect(driver.
|
1223
|
+
driver.uc_open_with_reconnect(driver.get_current_url(), 3.8)
|
1042
1224
|
if _on_a_captcha_page(driver):
|
1043
1225
|
driver.disconnect()
|
1044
1226
|
_uc_gui_click_x_y(driver, x, y, timeframe=0.32)
|
1045
|
-
|
1227
|
+
if not cdp_mode_on_at_start:
|
1228
|
+
driver.reconnect(reconnect_time)
|
1046
1229
|
|
1047
1230
|
|
1048
1231
|
def uc_gui_click_captcha(driver, frame="iframe", retry=False, blind=False):
|
@@ -1089,6 +1272,9 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1089
1272
|
ctype = "cf_t"
|
1090
1273
|
else:
|
1091
1274
|
return
|
1275
|
+
if not driver.is_connected():
|
1276
|
+
driver.connect()
|
1277
|
+
time.sleep(2)
|
1092
1278
|
install_pyautogui_if_missing(driver)
|
1093
1279
|
import pyautogui
|
1094
1280
|
pyautogui = get_configured_pyautogui(pyautogui)
|
@@ -1111,9 +1297,12 @@ def _uc_gui_handle_captcha_(driver, frame="iframe", ctype=None):
|
|
1111
1297
|
page_actions.switch_to_window(
|
1112
1298
|
driver, driver.current_window_handle, 2, uc_lock=False
|
1113
1299
|
)
|
1114
|
-
if
|
1300
|
+
if (
|
1301
|
+
IS_WINDOWS
|
1302
|
+
and hasattr(pyautogui, "getActiveWindowTitle")
|
1303
|
+
):
|
1115
1304
|
py_a_g_title = pyautogui.getActiveWindowTitle()
|
1116
|
-
window_title = driver.
|
1305
|
+
window_title = driver.get_title()
|
1117
1306
|
if not py_a_g_title.startswith(window_title):
|
1118
1307
|
window_rect = driver.get_window_rect()
|
1119
1308
|
width = window_rect["width"]
|
@@ -1614,6 +1803,7 @@ def _set_chrome_options(
|
|
1614
1803
|
prefs["default_content_settings.popups"] = 0
|
1615
1804
|
prefs["managed_default_content_settings.popups"] = 0
|
1616
1805
|
prefs["profile.password_manager_enabled"] = False
|
1806
|
+
prefs["profile.password_manager_leak_detection"] = False
|
1617
1807
|
prefs["profile.default_content_setting_values.notifications"] = 2
|
1618
1808
|
prefs["profile.default_content_settings.popups"] = 0
|
1619
1809
|
prefs["profile.managed_default_content_settings.popups"] = 0
|
@@ -3271,6 +3461,7 @@ def get_local_driver(
|
|
3271
3461
|
"default_content_settings.popups": 0,
|
3272
3462
|
"managed_default_content_settings.popups": 0,
|
3273
3463
|
"profile.password_manager_enabled": False,
|
3464
|
+
"profile.password_manager_leak_detection": False,
|
3274
3465
|
"profile.default_content_setting_values.notifications": 2,
|
3275
3466
|
"profile.default_content_settings.popups": 0,
|
3276
3467
|
"profile.managed_default_content_settings.popups": 0,
|
@@ -4244,13 +4435,17 @@ def get_local_driver(
|
|
4244
4435
|
with uc_lock: # Avoid multithreaded issues
|
4245
4436
|
if make_uc_driver_from_chromedriver:
|
4246
4437
|
if os.path.exists(LOCAL_CHROMEDRIVER):
|
4247
|
-
|
4248
|
-
|
4249
|
-
|
4438
|
+
with suppress(Exception):
|
4439
|
+
make_driver_executable_if_not(
|
4440
|
+
LOCAL_CHROMEDRIVER
|
4441
|
+
)
|
4442
|
+
shutil.copy2(LOCAL_CHROMEDRIVER, LOCAL_UC_DRIVER)
|
4250
4443
|
elif os.path.exists(path_chromedriver):
|
4251
|
-
|
4252
|
-
|
4253
|
-
|
4444
|
+
with suppress(Exception):
|
4445
|
+
make_driver_executable_if_not(
|
4446
|
+
path_chromedriver
|
4447
|
+
)
|
4448
|
+
shutil.copy2(path_chromedriver, LOCAL_UC_DRIVER)
|
4254
4449
|
try:
|
4255
4450
|
make_driver_executable_if_not(LOCAL_UC_DRIVER)
|
4256
4451
|
except Exception as e:
|
@@ -4670,6 +4865,9 @@ def get_local_driver(
|
|
4670
4865
|
options=chrome_options,
|
4671
4866
|
)
|
4672
4867
|
driver.default_get = driver.get # Save copy of original
|
4868
|
+
driver.cdp = None # Set a placeholder
|
4869
|
+
driver._is_using_cdp = False
|
4870
|
+
driver._is_connected = True
|
4673
4871
|
if uc_activated:
|
4674
4872
|
driver.get = lambda url: uc_special_open_if_cf(
|
4675
4873
|
driver,
|
@@ -4697,6 +4895,16 @@ def get_local_driver(
|
|
4697
4895
|
driver.uc_click = lambda *args, **kwargs: uc_click(
|
4698
4896
|
driver, *args, **kwargs
|
4699
4897
|
)
|
4898
|
+
driver.uc_activate_cdp_mode = (
|
4899
|
+
lambda *args, **kwargs: uc_activate_cdp_mode(
|
4900
|
+
driver, *args, **kwargs
|
4901
|
+
)
|
4902
|
+
)
|
4903
|
+
driver.uc_open_with_cdp_mode = (
|
4904
|
+
lambda *args, **kwargs: uc_open_with_cdp_mode(
|
4905
|
+
driver, *args, **kwargs
|
4906
|
+
)
|
4907
|
+
)
|
4700
4908
|
driver.uc_gui_press_key = (
|
4701
4909
|
lambda *args, **kwargs: uc_gui_press_key(
|
4702
4910
|
driver, *args, **kwargs
|