seleniumbase 4.41.0__py3-none-any.whl → 4.41.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.41.0"
2
+ __version__ = "4.41.2"
@@ -762,6 +762,7 @@ def uc_open_with_cdp_mode(driver, url=None, **kwargs):
762
762
  cdp.gui_write = CDPM.gui_write
763
763
  cdp.gui_click_x_y = CDPM.gui_click_x_y
764
764
  cdp.gui_click_element = CDPM.gui_click_element
765
+ cdp.gui_click_captcha = CDPM.gui_click_captcha
765
766
  cdp.gui_drag_drop_points = CDPM.gui_drag_drop_points
766
767
  cdp.gui_drag_and_drop = CDPM.gui_drag_and_drop
767
768
  cdp.gui_click_and_hold = CDPM.gui_click_and_hold
@@ -1504,7 +1505,10 @@ def _uc_gui_click_captcha(
1504
1505
  y += 0.5
1505
1506
  else:
1506
1507
  x = (i_x + 32) * width_ratio
1507
- y = (i_y + 32) * width_ratio
1508
+ if not IS_WINDOWS:
1509
+ y = (i_y + 32) * width_ratio
1510
+ else:
1511
+ y = (i_y + 22) * width_ratio
1508
1512
  if driver.is_connected():
1509
1513
  driver.switch_to.default_content()
1510
1514
  except Exception:
@@ -1629,6 +1629,152 @@ class CDPMethods():
1629
1629
  self.__slow_mode_pause_if_set()
1630
1630
  self.loop.run_until_complete(self.page.wait())
1631
1631
 
1632
+ def _on_a_cf_turnstile_page(self):
1633
+ source = self.get_page_source()
1634
+ if (
1635
+ 'data-callback="onCaptchaSuccess"' in source
1636
+ or "/challenge-platform/scripts/" in source
1637
+ or 'id="challenge-widget-' in source
1638
+ or "cf-turnstile-" in source
1639
+ ):
1640
+ return True
1641
+ return False
1642
+
1643
+ def gui_click_captcha(self):
1644
+ if not self._on_a_cf_turnstile_page():
1645
+ return
1646
+ selector = None
1647
+ if (
1648
+ self.is_element_present('[name*="cf-turnstile-"]')
1649
+ and self.is_element_present("#challenge-form div > div")
1650
+ ):
1651
+ selector = "#challenge-form div > div"
1652
+ elif (
1653
+ self.is_element_present('[name*="cf-turnstile-"]')
1654
+ and self.is_element_present(
1655
+ '[style="display: grid;"] div div'
1656
+ )
1657
+ ):
1658
+ selector = '[style="display: grid;"] div div'
1659
+ elif (
1660
+ self.is_element_present('[name*="cf-turnstile-"]')
1661
+ and self.is_element_present("[class*=spacer] + div div")
1662
+ ):
1663
+ selector = '[class*=spacer] + div div'
1664
+ elif (
1665
+ self.is_element_present('[name*="cf-turnstile-"]')
1666
+ and self.is_element_present("div.spacer div")
1667
+ ):
1668
+ selector = "div.spacer div"
1669
+ elif (
1670
+ self.is_element_present('script[src*="challenges.c"]')
1671
+ and self.is_element_present(
1672
+ '[data-testid*="challenge-"] div'
1673
+ )
1674
+ ):
1675
+ selector = '[data-testid*="challenge-"] div'
1676
+ elif self.is_element_present(
1677
+ "div#turnstile-widget div:not([class])"
1678
+ ):
1679
+ selector = "div#turnstile-widget div:not([class])"
1680
+ elif self.is_element_present(
1681
+ 'form div:not([class]):has(input[name*="cf-turn"])'
1682
+ ):
1683
+ selector = 'form div:not([class]):has(input[name*="cf-turn"])'
1684
+ elif (
1685
+ self.is_element_present('[src*="/turnstile/"]')
1686
+ and self.is_element_present("form div:not(:has(*))")
1687
+ ):
1688
+ selector = "form div:not(:has(*))"
1689
+ elif (
1690
+ self.is_element_present('[src*="/turnstile/"]')
1691
+ and self.is_element_present(
1692
+ "body > div#check > div:not([class])"
1693
+ )
1694
+ ):
1695
+ selector = "body > div#check > div:not([class])"
1696
+ elif self.is_element_present(".cf-turnstile-wrapper"):
1697
+ selector = ".cf-turnstile-wrapper"
1698
+ elif self.is_element_present('[class="cf-turnstile"]'):
1699
+ selector = '[class="cf-turnstile"]'
1700
+ elif self.is_element_present(
1701
+ '[data-callback="onCaptchaSuccess"]'
1702
+ ):
1703
+ selector = '[data-callback="onCaptchaSuccess"]'
1704
+ else:
1705
+ return
1706
+ if not selector:
1707
+ return
1708
+ if (
1709
+ self.is_element_present("form")
1710
+ and (
1711
+ self.is_element_present('form[class*="center"]')
1712
+ or self.is_element_present('form[class*="right"]')
1713
+ or self.is_element_present('form div[class*="center"]')
1714
+ or self.is_element_present('form div[class*="right"]')
1715
+ )
1716
+ ):
1717
+ script = (
1718
+ """var $elements = document.querySelectorAll(
1719
+ 'form[class], form div[class]');
1720
+ var index = 0, length = $elements.length;
1721
+ for(; index < length; index++){
1722
+ the_class = $elements[index].getAttribute('class');
1723
+ new_class = the_class.replaceAll('center', 'left');
1724
+ new_class = new_class.replaceAll('right', 'left');
1725
+ $elements[index].setAttribute('class', new_class);}"""
1726
+ )
1727
+ with suppress(Exception):
1728
+ self.loop.run_until_complete(self.page.evaluate(script))
1729
+ self.loop.run_until_complete(self.page.wait())
1730
+ elif (
1731
+ self.is_element_present("form")
1732
+ and (
1733
+ self.is_element_present('form div[style*="center"]')
1734
+ or self.is_element_present('form div[style*="right"]')
1735
+ )
1736
+ ):
1737
+ script = (
1738
+ """var $elements = document.querySelectorAll(
1739
+ 'form[style], form div[style]');
1740
+ var index = 0, length = $elements.length;
1741
+ for(; index < length; index++){
1742
+ the_style = $elements[index].getAttribute('style');
1743
+ new_style = the_style.replaceAll('center', 'left');
1744
+ new_style = new_style.replaceAll('right', 'left');
1745
+ $elements[index].setAttribute('style', new_style);}"""
1746
+ )
1747
+ with suppress(Exception):
1748
+ self.loop.run_until_complete(self.page.evaluate(script))
1749
+ self.loop.run_until_complete(self.page.wait())
1750
+ elif (
1751
+ self.is_element_present("form")
1752
+ and self.is_element_present(
1753
+ 'form [id*="turnstile"] > div:not([class])'
1754
+ )
1755
+ ):
1756
+ script = (
1757
+ """var $elements = document.querySelectorAll(
1758
+ 'form [id*="turnstile"]');
1759
+ var index = 0, length = $elements.length;
1760
+ for(; index < length; index++){
1761
+ $elements[index].setAttribute('align', 'left');}"""
1762
+ )
1763
+ with suppress(Exception):
1764
+ self.loop.run_until_complete(self.page.evaluate(script))
1765
+ self.loop.run_until_complete(self.page.wait())
1766
+ with suppress(Exception):
1767
+ element_rect = self.get_gui_element_rect(selector, timeout=1)
1768
+ e_x = element_rect["x"]
1769
+ e_y = element_rect["y"]
1770
+ x = e_x + 32
1771
+ if not shared_utils.is_windows():
1772
+ y = e_y + 32
1773
+ else:
1774
+ y = e_y + 22
1775
+ sb_config._saved_cf_x_y = (x, y)
1776
+ self.gui_click_x_y(x, y)
1777
+
1632
1778
  def __gui_drag_drop(self, x1, y1, x2, y2, timeframe=0.25, uc_lock=False):
1633
1779
  self.__install_pyautogui_if_missing()
1634
1780
  import pyautogui
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.41.0
3
+ Version: 4.41.2
4
4
  Summary: A complete web automation framework for end-to-end testing.
5
5
  Home-page: https://github.com/seleniumbase/SeleniumBase
6
6
  Author: Michael Mintz
@@ -72,12 +72,12 @@ Requires-Dist: exceptiongroup>=1.3.0
72
72
  Requires-Dist: websockets~=13.1; python_version < "3.9"
73
73
  Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
74
74
  Requires-Dist: filelock~=3.16.1; python_version < "3.9"
75
- Requires-Dist: filelock>=3.18.0; python_version >= "3.9"
75
+ Requires-Dist: filelock>=3.19.1; python_version >= "3.9"
76
76
  Requires-Dist: fasteners>=0.20
77
77
  Requires-Dist: mycdp>=1.2.0
78
78
  Requires-Dist: pynose>=1.5.4
79
79
  Requires-Dist: platformdirs>=4.3.6; python_version < "3.9"
80
- Requires-Dist: platformdirs>=4.3.8; python_version >= "3.9"
80
+ Requires-Dist: platformdirs>=4.4.0; python_version >= "3.9"
81
81
  Requires-Dist: typing-extensions>=4.13.2
82
82
  Requires-Dist: sbvirtualdisplay>=1.4.0
83
83
  Requires-Dist: MarkupSafe==2.1.5; python_version < "3.9"
@@ -97,7 +97,8 @@ Requires-Dist: chardet==5.2.0
97
97
  Requires-Dist: charset-normalizer<4,>=3.4.3
98
98
  Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
99
99
  Requires-Dist: urllib3<2.6.0,>=1.26.20; python_version >= "3.10"
100
- Requires-Dist: requests==2.32.4
100
+ Requires-Dist: requests==2.32.4; python_version < "3.9"
101
+ Requires-Dist: requests<2.33,>=2.32.5; python_version >= "3.9"
101
102
  Requires-Dist: sniffio==1.3.1
102
103
  Requires-Dist: h11==0.16.0
103
104
  Requires-Dist: outcome==1.3.0.post0
@@ -128,7 +129,7 @@ Requires-Dist: pytest-xdist==3.8.0; python_version >= "3.9"
128
129
  Requires-Dist: parameterized==0.9.0
129
130
  Requires-Dist: behave==1.2.6
130
131
  Requires-Dist: soupsieve==2.7
131
- Requires-Dist: beautifulsoup4==4.13.4
132
+ Requires-Dist: beautifulsoup4<4.14,>=4.13.5
132
133
  Requires-Dist: pyotp==2.9.0
133
134
  Requires-Dist: python-xlib==0.33; platform_system == "Linux"
134
135
  Requires-Dist: markdown-it-py==3.0.0; python_version < "3.10"
@@ -141,7 +142,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
141
142
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
142
143
  Provides-Extra: coverage
143
144
  Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
144
- Requires-Dist: coverage>=7.10.3; python_version >= "3.9" and extra == "coverage"
145
+ Requires-Dist: coverage>=7.10.5; python_version >= "3.9" and extra == "coverage"
145
146
  Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
146
147
  Requires-Dist: pytest-cov>=6.2.1; python_version >= "3.9" and extra == "coverage"
147
148
  Provides-Extra: flake8
@@ -3,7 +3,7 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
3
3
  sbase/steps.py,sha256=EdJyNVJ1yxoHsc7qp8kzx0EESIkOh_033yLCvmaPcs4,43281
4
4
  seleniumbase/__init__.py,sha256=JFEY9P5QJqsa1M6ghzLMH2eIPQyh85iglCaQwg8Y8z4,2498
5
5
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
6
- seleniumbase/__version__.py,sha256=RIkvgRen8s5bQ68HUzygAmT-XNl6i62badURgLN206Y,46
6
+ seleniumbase/__version__.py,sha256=ZyfXu0aOBZHSqkS5yxS9fAUyg-y0JTxnmYBJ6YyVB04,46
7
7
  seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  seleniumbase/behave/behave_helper.py,sha256=f4CdiSSYM3gMAicSKWJInkVGFwpGXtHMD8fikTehopQ,24291
9
9
  seleniumbase/behave/behave_sb.py,sha256=guLihFsr1uJ4v2AR3r3Vy_BTeHrHwy2JEJxhp-MVnZA,59872
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
36
36
  seleniumbase/console_scripts/sb_recorder.py,sha256=DH-n2fN7N9qyHMl7wjtn8MiliBgfw-1kwgmfg1GUuhk,10772
37
37
  seleniumbase/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
38
38
  seleniumbase/core/application_manager.py,sha256=e_0sjtI8cjY5BNyZj1QBR0j6_oCScxGmSXYEpcYwuZE,576
39
- seleniumbase/core/browser_launcher.py,sha256=sHrn_vHS_mEl-gkcPHoylMymf_gHrXDQQuq1ng1Ihg0,247571
39
+ seleniumbase/core/browser_launcher.py,sha256=HKXqGykDUTflUYL-5Y-8DqxgNjq8mYXayARYYV-eaxA,247732
40
40
  seleniumbase/core/capabilities_parser.py,sha256=meIS2uHapTCq2ldfNAToC7r0cKmZDRXuYNKExM1GHDY,6038
41
41
  seleniumbase/core/colored_traceback.py,sha256=DrRWfg7XEnKcgY59Xj7Jdk09H-XqHYBSUpB-DiZt6iY,2020
42
42
  seleniumbase/core/create_db_tables.sql,sha256=VWPtrdiW_HQ6yETHjqTu-VIrTwvd8I8o1NfBeaVSHpU,972
@@ -50,7 +50,7 @@ seleniumbase/core/proxy_helper.py,sha256=pZ1NboNfziHU3vWZLOZLX-qkfM3oKSnpc3omQf9
50
50
  seleniumbase/core/recorder_helper.py,sha256=OBqNiCC_11ctpsD72KV4YUaKovmSpvs14HP1gwFesBA,25190
51
51
  seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
52
52
  seleniumbase/core/s3_manager.py,sha256=z_4qx2jI_gtK5r3niGXgEOBpfMUicUCOciowai50MP4,3529
53
- seleniumbase/core/sb_cdp.py,sha256=bzYQwt23YAssxeW8oy8kmkg6SE2rJ29lFvXfsOnwPuc,94506
53
+ seleniumbase/core/sb_cdp.py,sha256=5HttSd6ZKAJK_7IPbKDYuc7gzybIc5u6zmKSqyHIM6s,100461
54
54
  seleniumbase/core/sb_driver.py,sha256=yUdS9_9OXTVaWzp1qY7msvnsvCK8X3FIcxMixb0BuBE,13827
55
55
  seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
56
56
  seleniumbase/core/settings_parser.py,sha256=gqVohHVlE_5L5Cqe2L24uYrRzvoK-saX8E_Df7_-_3I,7609
@@ -137,9 +137,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
137
137
  seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
138
138
  seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
139
  seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
140
- seleniumbase-4.41.0.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
141
- seleniumbase-4.41.0.dist-info/METADATA,sha256=5Z7U29ylTeltlkO7uwt2rHkFp_drtcp1kkXZPctw_sA,87397
142
- seleniumbase-4.41.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
- seleniumbase-4.41.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
- seleniumbase-4.41.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
- seleniumbase-4.41.0.dist-info/RECORD,,
140
+ seleniumbase-4.41.2.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
141
+ seleniumbase-4.41.2.dist-info/METADATA,sha256=b-68nE0Tj2sDFfVAqvJ0Zix7jfof6zflUL8d1-Yn9jo,87490
142
+ seleniumbase-4.41.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
143
+ seleniumbase-4.41.2.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
144
+ seleniumbase-4.41.2.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
145
+ seleniumbase-4.41.2.dist-info/RECORD,,