seleniumbase 4.32.11__py3-none-any.whl → 4.33.0__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
sbase/steps.py CHANGED
@@ -1189,3 +1189,10 @@ def set_attributes(context, selector, attribute, value):
1189
1189
  if attribute.endswith("'") or attribute.endswith('"'):
1190
1190
  attribute = attribute[:-1]
1191
1191
  sb.set_attributes(selector, attribute, value)
1192
+
1193
+
1194
+ @step("Activate CDP Mode")
1195
+ @step("User activates CDP Mode")
1196
+ def activate_cdp_mode(context):
1197
+ sb = context.sb
1198
+ sb.activate_cdp_mode()
@@ -1,2 +1,2 @@
1
1
  # seleniumbase package
2
- __version__ = "4.32.11"
2
+ __version__ = "4.33.0"
@@ -1,11 +1,18 @@
1
+ import colorama
1
2
  import logging
2
3
  import math
4
+ import sys
3
5
  import time
4
6
  import warnings
5
7
  from contextlib import contextmanager
6
8
  from functools import wraps
7
9
  from seleniumbase.common.exceptions import TimeoutException
8
10
 
11
+ c1 = colorama.Fore.BLUE + colorama.Back.LIGHTYELLOW_EX
12
+ cr = colorama.Style.RESET_ALL
13
+ if "linux" in sys.platform:
14
+ c1 = cr = ""
15
+
9
16
 
10
17
  @contextmanager
11
18
  def print_runtime(description=None, limit=None):
@@ -44,19 +51,20 @@ def print_runtime(description=None, limit=None):
44
51
  end_time = time.time()
45
52
  run_time = end_time - start_time
46
53
  name = description
54
+ info = c1 + "<info>" + cr
47
55
  # Print times with a statistically significant number of decimal places
48
56
  if run_time < 0.0001:
49
- print("<info> - {%s} ran for %.7f seconds." % (name, run_time))
57
+ print("%s - {%s} ran for %.7f seconds." % (info, name, run_time))
50
58
  elif run_time < 0.001:
51
- print("<info> - {%s} ran for %.6f seconds." % (name, run_time))
59
+ print("%s - {%s} ran for %.6f seconds." % (info, name, run_time))
52
60
  elif run_time < 0.01:
53
- print("<info> - {%s} ran for %.5f seconds." % (name, run_time))
61
+ print("%s - {%s} ran for %.5f seconds." % (info, name, run_time))
54
62
  elif run_time < 0.1:
55
- print("<info> - {%s} ran for %.4f seconds." % (name, run_time))
63
+ print("%s - {%s} ran for %.4f seconds." % (info, name, run_time))
56
64
  elif run_time < 1:
57
- print("<info> - {%s} ran for %.3f seconds." % (name, run_time))
65
+ print("%s - {%s} ran for %.3f seconds." % (info, name, run_time))
58
66
  else:
59
- print("<info> - {%s} ran for %.2f seconds." % (name, run_time))
67
+ print("%s - {%s} ran for %.2f seconds." % (info, name, run_time))
60
68
  if limit and limit > 0 and run_time > limit:
61
69
  message = (
62
70
  "\n {%s} duration of %.2fs exceeded the time limit of %.2fs!"
@@ -144,7 +144,9 @@ def main():
144
144
  elif option.lower() in ("--gui", "--headed"):
145
145
  if "linux" in sys.platform:
146
146
  force_gui = True
147
- elif option.lower() in ("--uc", "--undetected", "--undetectable"):
147
+ elif option.lower() in (
148
+ "--uc", "--cdp", "--undetected", "--undetectable"
149
+ ):
148
150
  use_uc = True
149
151
  elif option.lower() in ("--rec-behave", "--behave", "--gherkin"):
150
152
  rec_behave = True
@@ -9,6 +9,7 @@ Usage:
9
9
 
10
10
  Options:
11
11
  --uc / --undetected (Use undetectable mode.)
12
+ --cdp (Same as "--uc" and "--undetectable".)
12
13
  --behave (Also output Behave/Gherkin files.)
13
14
 
14
15
  Output:
@@ -151,6 +152,7 @@ def do_recording(file_name, url, overwrite_enabled, use_chrome, window):
151
152
  command += " --edge"
152
153
  if (
153
154
  "--uc" in command_args
155
+ or "--cdp" in command_args
154
156
  or "--undetected" in command_args
155
157
  or "--undetectable" in command_args
156
158
  ):
@@ -193,6 +195,7 @@ def do_playback(file_name, use_chrome, window, demo_mode=False):
193
195
  command_args = sys.argv[2:]
194
196
  if (
195
197
  "--uc" in command_args
198
+ or "--cdp" in command_args
196
199
  or "--undetected" in command_args
197
200
  or "--undetectable" in command_args
198
201
  ):
@@ -216,8 +216,10 @@ def extend_driver(driver):
216
216
  driver.get_text = DM.get_text
217
217
  driver.get_active_element_css = DM.get_active_element_css
218
218
  driver.get_locale_code = DM.get_locale_code
219
+ driver.get_screen_rect = DM.get_screen_rect
219
220
  driver.get_origin = DM.get_origin
220
221
  driver.get_user_agent = DM.get_user_agent
222
+ driver.get_cookie_string = DM.get_cookie_string
221
223
  driver.highlight = DM.highlight
222
224
  driver.highlight_click = DM.highlight_click
223
225
  driver.highlight_if_visible = DM.highlight_if_visible
@@ -234,6 +236,7 @@ def extend_driver(driver):
234
236
  driver.switch_to_window = DM.switch_to_window
235
237
  driver.switch_to_tab = DM.switch_to_tab
236
238
  driver.switch_to_frame = DM.switch_to_frame
239
+ driver.reset_window_size = DM.reset_window_size
237
240
  if hasattr(driver, "proxy"):
238
241
  driver.set_wire_proxy = DM.set_wire_proxy
239
242
  return driver
@@ -683,12 +686,17 @@ def uc_open_with_cdp_mode(driver, url=None):
683
686
  cdp.is_checked = CDPM.is_checked
684
687
  cdp.is_element_present = CDPM.is_element_present
685
688
  cdp.is_element_visible = CDPM.is_element_visible
689
+ cdp.wait_for_element_visible = CDPM.wait_for_element_visible
690
+ cdp.assert_element = CDPM.assert_element
691
+ cdp.assert_element_visible = CDPM.assert_element_visible
686
692
  cdp.assert_element_present = CDPM.assert_element_present
687
693
  cdp.assert_element_absent = CDPM.assert_element_absent
688
- cdp.assert_element = CDPM.assert_element
689
- cdp.assert_element_visible = CDPM.assert_element
690
694
  cdp.assert_element_not_visible = CDPM.assert_element_not_visible
695
+ cdp.assert_element_attribute = CDPM.assert_element_attribute
691
696
  cdp.assert_title = CDPM.assert_title
697
+ cdp.assert_title_contains = CDPM.assert_title_contains
698
+ cdp.assert_url = CDPM.assert_url
699
+ cdp.assert_url_contains = CDPM.assert_url_contains
692
700
  cdp.assert_text = CDPM.assert_text
693
701
  cdp.assert_exact_text = CDPM.assert_exact_text
694
702
  cdp.scroll_into_view = CDPM.scroll_into_view
@@ -2442,10 +2450,8 @@ def _set_firefox_options(
2442
2450
  firefox_arg_list = firefox_arg.split(",")
2443
2451
  for firefox_arg_item in firefox_arg_list:
2444
2452
  firefox_arg_item = firefox_arg_item.strip()
2445
- if not firefox_arg_item.startswith("--"):
2446
- if firefox_arg_item.startswith("-"):
2447
- firefox_arg_item = "-" + firefox_arg_item
2448
- else:
2453
+ if not firefox_arg_item.startswith("-"):
2454
+ if firefox_arg_item.count(os.sep) == 0:
2449
2455
  firefox_arg_item = "--" + firefox_arg_item
2450
2456
  if len(firefox_arg_item) >= 3:
2451
2457
  options.add_argument(firefox_arg_item)
@@ -20,8 +20,16 @@ class CDPMethods():
20
20
  self.driver = driver
21
21
 
22
22
  def __slow_mode_pause_if_set(self):
23
- if hasattr(sb_config, "slow_mode") and sb_config.slow_mode:
24
- time.sleep(0.16)
23
+ if (
24
+ (hasattr(sb_config, "demo_mode") and sb_config.demo_mode)
25
+ or "--demo" in sys.argv
26
+ ):
27
+ time.sleep(0.48)
28
+ elif (
29
+ (hasattr(sb_config, "slow_mode") and sb_config.slow_mode)
30
+ or "--slow" in sys.argv
31
+ ):
32
+ time.sleep(0.24)
25
33
 
26
34
  def __add_light_pause(self):
27
35
  time.sleep(0.007)
@@ -543,7 +551,7 @@ class CDPMethods():
543
551
  if (width != 0 or height != 0):
544
552
  element.click()
545
553
  click_count += 1
546
- time.sleep(0.0375)
554
+ time.sleep(0.044)
547
555
  self.__slow_mode_pause_if_set()
548
556
  self.loop.run_until_complete(self.page.wait())
549
557
  except Exception:
@@ -660,10 +668,10 @@ class CDPMethods():
660
668
  text = text[:-1]
661
669
  for key in text:
662
670
  element.send_keys(key)
663
- time.sleep(0.0375)
671
+ time.sleep(0.044)
664
672
  if submit:
665
673
  element.send_keys("\r\n")
666
- time.sleep(0.0375)
674
+ time.sleep(0.044)
667
675
  self.__slow_mode_pause_if_set()
668
676
  self.loop.run_until_complete(self.page.wait())
669
677
 
@@ -733,7 +741,7 @@ class CDPMethods():
733
741
  return
734
742
  elif self.get_window()[1].window_state.value == "minimized":
735
743
  self.loop.run_until_complete(self.page.maximize())
736
- time.sleep(0.0375)
744
+ time.sleep(0.044)
737
745
  return self.loop.run_until_complete(self.page.maximize())
738
746
 
739
747
  def minimize(self):
@@ -743,7 +751,7 @@ class CDPMethods():
743
751
  def medimize(self):
744
752
  if self.get_window()[1].window_state.value == "minimized":
745
753
  self.loop.run_until_complete(self.page.medimize())
746
- time.sleep(0.0375)
754
+ time.sleep(0.044)
747
755
  return self.loop.run_until_complete(self.page.medimize())
748
756
 
749
757
  def set_window_rect(self, x, y, width, height):
@@ -752,7 +760,7 @@ class CDPMethods():
752
760
  self.page.set_window_size(
753
761
  left=x, top=y, width=width, height=height)
754
762
  )
755
- time.sleep(0.0375)
763
+ time.sleep(0.044)
756
764
  return self.loop.run_until_complete(
757
765
  self.page.set_window_size(
758
766
  left=x, top=y, width=width, height=height)
@@ -1117,7 +1125,7 @@ class CDPMethods():
1117
1125
  )
1118
1126
  with gui_lock:
1119
1127
  pyautogui.press(key)
1120
- time.sleep(0.0375)
1128
+ time.sleep(0.044)
1121
1129
  self.__slow_mode_pause_if_set()
1122
1130
  self.loop.run_until_complete(self.page.wait())
1123
1131
 
@@ -1131,7 +1139,7 @@ class CDPMethods():
1131
1139
  with gui_lock:
1132
1140
  for key in keys:
1133
1141
  pyautogui.press(key)
1134
- time.sleep(0.0375)
1142
+ time.sleep(0.044)
1135
1143
  self.__slow_mode_pause_if_set()
1136
1144
  self.loop.run_until_complete(self.page.wait())
1137
1145
 
@@ -1472,25 +1480,53 @@ class CDPMethods():
1472
1480
  return True
1473
1481
  return False
1474
1482
 
1483
+ def wait_for_element_visible(
1484
+ self, selector, timeout=settings.SMALL_TIMEOUT
1485
+ ):
1486
+ try:
1487
+ self.select(selector, timeout=timeout)
1488
+ except Exception:
1489
+ raise Exception("Element {%s} was not found!" % selector)
1490
+ for i in range(30):
1491
+ if self.is_element_visible(selector):
1492
+ return self.select(selector)
1493
+ time.sleep(0.1)
1494
+ raise Exception("Element {%s} was not visible!" % selector)
1495
+
1475
1496
  def assert_element(self, selector, timeout=settings.SMALL_TIMEOUT):
1497
+ """Same as assert_element_visible()"""
1476
1498
  try:
1477
1499
  self.select(selector, timeout=timeout)
1478
1500
  except Exception:
1479
- raise Exception("Element {%s} not found!" % selector)
1501
+ raise Exception("Element {%s} was not found!" % selector)
1480
1502
  for i in range(30):
1481
1503
  if self.is_element_visible(selector):
1482
1504
  return True
1483
1505
  time.sleep(0.1)
1484
- raise Exception("Element {%s} not visible!" % selector)
1506
+ raise Exception("Element {%s} was not visible!" % selector)
1507
+
1508
+ def assert_element_visible(self, selector, timeout=settings.SMALL_TIMEOUT):
1509
+ """Same as assert_element()"""
1510
+ try:
1511
+ self.select(selector, timeout=timeout)
1512
+ except Exception:
1513
+ raise Exception("Element {%s} was not found!" % selector)
1514
+ for i in range(30):
1515
+ if self.is_element_visible(selector):
1516
+ return True
1517
+ time.sleep(0.1)
1518
+ raise Exception("Element {%s} was not visible!" % selector)
1485
1519
 
1486
1520
  def assert_element_present(self, selector, timeout=settings.SMALL_TIMEOUT):
1521
+ """Assert element is present in the DOM. (Visibility NOT required)"""
1487
1522
  try:
1488
1523
  self.select(selector, timeout=timeout)
1489
1524
  except Exception:
1490
- raise Exception("Element {%s} not found!" % selector)
1525
+ raise Exception("Element {%s} was not found!" % selector)
1491
1526
  return True
1492
1527
 
1493
1528
  def assert_element_absent(self, selector, timeout=settings.SMALL_TIMEOUT):
1529
+ """Assert element is not present in the DOM."""
1494
1530
  start_ms = time.time() * 1000.0
1495
1531
  stop_ms = start_ms + (timeout * 1000.0)
1496
1532
  for i in range(int(timeout * 10)):
@@ -1511,6 +1547,7 @@ class CDPMethods():
1511
1547
  def assert_element_not_visible(
1512
1548
  self, selector, timeout=settings.SMALL_TIMEOUT
1513
1549
  ):
1550
+ """Assert element is not visible on page. (May still be in DOM)"""
1514
1551
  start_ms = time.time() * 1000.0
1515
1552
  stop_ms = start_ms + (timeout * 1000.0)
1516
1553
  for i in range(int(timeout * 10)):
@@ -1530,6 +1567,21 @@ class CDPMethods():
1530
1567
  % (selector, timeout, plural)
1531
1568
  )
1532
1569
 
1570
+ def assert_element_attribute(self, selector, attribute, value=None):
1571
+ attributes = self.get_element_attributes(selector)
1572
+ if attribute not in attributes:
1573
+ raise Exception(
1574
+ "Attribute {%s} was not found in element {%s}!"
1575
+ % (attribute, selector)
1576
+ )
1577
+ if value and attributes[attribute] != value:
1578
+ raise Exception(
1579
+ "Expected value {%s} of attribute {%s} "
1580
+ "was not found in element {%s}! "
1581
+ "(Actual value was {%s})"
1582
+ % (value, attribute, selector, attributes[attribute])
1583
+ )
1584
+
1533
1585
  def assert_title(self, title):
1534
1586
  expected = title.strip()
1535
1587
  actual = self.get_title().strip()
@@ -1541,11 +1593,55 @@ class CDPMethods():
1541
1593
  raise Exception(error % (expected, actual))
1542
1594
  except Exception:
1543
1595
  time.sleep(2)
1544
- expected = title.strip()
1545
1596
  actual = self.get_title().strip()
1546
1597
  if expected != actual:
1547
1598
  raise Exception(error % (expected, actual))
1548
1599
 
1600
+ def assert_title_contains(self, substring):
1601
+ expected = substring.strip()
1602
+ actual = self.get_title().strip()
1603
+ error = (
1604
+ "Expected title substring [%s] does not appear "
1605
+ "in the actual page title [%s]!"
1606
+ )
1607
+ try:
1608
+ if expected not in actual:
1609
+ raise Exception(error % (expected, actual))
1610
+ except Exception:
1611
+ time.sleep(2)
1612
+ actual = self.get_title().strip()
1613
+ if expected not in actual:
1614
+ raise Exception(error % (expected, actual))
1615
+
1616
+ def assert_url(self, url):
1617
+ expected = url.strip()
1618
+ actual = self.get_current_url().strip()
1619
+ error = "Expected URL [%s] does not match the actual URL [%s]!"
1620
+ try:
1621
+ if expected != actual:
1622
+ raise Exception(error % (expected, actual))
1623
+ except Exception:
1624
+ time.sleep(2)
1625
+ actual = self.get_current_url().strip()
1626
+ if expected != actual:
1627
+ raise Exception(error % (expected, actual))
1628
+
1629
+ def assert_url_contains(self, substring):
1630
+ expected = substring.strip()
1631
+ actual = self.get_current_url().strip()
1632
+ error = (
1633
+ "Expected URL substring [%s] does not appear "
1634
+ "in the full URL [%s]!"
1635
+ )
1636
+ try:
1637
+ if expected not in actual:
1638
+ raise Exception(error % (expected, actual))
1639
+ except Exception:
1640
+ time.sleep(2)
1641
+ actual = self.get_current_url().strip()
1642
+ if expected not in actual:
1643
+ raise Exception(error % (expected, actual))
1644
+
1549
1645
  def assert_text(
1550
1646
  self, text, selector="html", timeout=settings.SMALL_TIMEOUT
1551
1647
  ):
@@ -1,6 +1,7 @@
1
1
  """Add new methods to extend the driver"""
2
2
  from contextlib import suppress
3
3
  from selenium.webdriver.remote.webelement import WebElement
4
+ from seleniumbase.config import settings
4
5
  from seleniumbase.fixtures import js_utils
5
6
  from seleniumbase.fixtures import page_actions
6
7
  from seleniumbase.fixtures import page_utils
@@ -189,6 +190,8 @@ class DriverMethods():
189
190
  return False
190
191
 
191
192
  def is_online(self):
193
+ if self.__is_cdp_swap_needed():
194
+ return self.driver.cdp.evaluate("navigator.onLine;")
192
195
  return self.driver.execute_script("return navigator.onLine;")
193
196
 
194
197
  def is_connected(self):
@@ -231,17 +234,35 @@ class DriverMethods():
231
234
  return page_actions.get_text(self.driver, *args, **kwargs)
232
235
 
233
236
  def get_active_element_css(self, *args, **kwargs):
237
+ if self.__is_cdp_swap_needed():
238
+ return self.driver.cdp.get_active_element_css()
234
239
  return js_utils.get_active_element_css(self.driver, *args, **kwargs)
235
240
 
236
241
  def get_locale_code(self, *args, **kwargs):
242
+ if self.__is_cdp_swap_needed():
243
+ return self.driver.cdp.get_locale_code()
237
244
  return js_utils.get_locale_code(self.driver, *args, **kwargs)
238
245
 
246
+ def get_screen_rect(self, *args, **kwargs):
247
+ if self.__is_cdp_swap_needed():
248
+ return self.driver.cdp.get_screen_rect()
249
+ return js_utils.get_screen_rect(self.driver, *args, **kwargs)
250
+
239
251
  def get_origin(self, *args, **kwargs):
252
+ if self.__is_cdp_swap_needed():
253
+ return self.driver.cdp.get_origin()
240
254
  return js_utils.get_origin(self.driver, *args, **kwargs)
241
255
 
242
256
  def get_user_agent(self, *args, **kwargs):
257
+ if self.__is_cdp_swap_needed():
258
+ return self.driver.cdp.get_user_agent()
243
259
  return js_utils.get_user_agent(self.driver, *args, **kwargs)
244
260
 
261
+ def get_cookie_string(self, *args, **kwargs):
262
+ if self.__is_cdp_swap_needed():
263
+ return self.driver.cdp.get_cookie_string()
264
+ return js_utils.get_cookie_string(self.driver, *args, **kwargs)
265
+
245
266
  def highlight(self, *args, **kwargs):
246
267
  if self.__is_cdp_swap_needed():
247
268
  selector = None
@@ -312,6 +333,16 @@ class DriverMethods():
312
333
  iframe = self.locator(frame)
313
334
  self.driver.switch_to.frame(iframe)
314
335
 
336
+ def reset_window_size(self):
337
+ if self.__is_cdp_swap_needed():
338
+ self.driver.cdp.reset_window_size()
339
+ return
340
+ x = settings.WINDOW_START_X
341
+ y = settings.WINDOW_START_Y
342
+ width = settings.CHROME_START_WIDTH
343
+ height = settings.CHROME_START_HEIGHT
344
+ self.driver.set_window_rect(x, y, width, height)
345
+
315
346
  def set_wire_proxy(self, string):
316
347
  """Set a proxy server for selenium-wire mode ("--wire")
317
348
  Examples: (ONLY avilable if using selenium-wire mode!)
@@ -1310,9 +1310,13 @@ class BaseCase(unittest.TestCase):
1310
1310
  return self.get_page_title()
1311
1311
 
1312
1312
  def get_user_agent(self):
1313
+ if self.__is_cdp_swap_needed():
1314
+ return self.cdp.get_user_agent()
1313
1315
  return self.execute_script("return navigator.userAgent;")
1314
1316
 
1315
1317
  def get_locale_code(self):
1318
+ if self.__is_cdp_swap_needed():
1319
+ return self.cdp.get_locale_code()
1316
1320
  return self.execute_script(
1317
1321
  "return navigator.language || navigator.languages[0];"
1318
1322
  )
@@ -3448,6 +3452,13 @@ class BaseCase(unittest.TestCase):
3448
3452
  y = element_rect["y"] + (element_rect["height"] / 2.0) + 0.5
3449
3453
  return (x, y)
3450
3454
 
3455
+ def get_screen_rect(self):
3456
+ self.__check_scope()
3457
+ if self.__is_cdp_swap_needed():
3458
+ return self.cdp.get_screen_rect()
3459
+ self._check_browser()
3460
+ return self.driver.get_screen_rect()
3461
+
3451
3462
  def get_window_rect(self):
3452
3463
  self.__check_scope()
3453
3464
  if self.__is_cdp_swap_needed():
@@ -3471,6 +3482,9 @@ class BaseCase(unittest.TestCase):
3471
3482
 
3472
3483
  def set_window_rect(self, x, y, width, height):
3473
3484
  self.__check_scope()
3485
+ if self.__is_cdp_swap_needed():
3486
+ self.cdp.set_window_rect(x, y, width, height)
3487
+ return
3474
3488
  self._check_browser()
3475
3489
  self.driver.set_window_rect(x, y, width, height)
3476
3490
  self.__demo_mode_pause_if_active(tiny=True)
@@ -3489,10 +3503,35 @@ class BaseCase(unittest.TestCase):
3489
3503
 
3490
3504
  def maximize_window(self):
3491
3505
  self.__check_scope()
3506
+ if self.__is_cdp_swap_needed():
3507
+ self.cdp.maximize()
3508
+ return
3492
3509
  self._check_browser()
3493
3510
  self.driver.maximize_window()
3494
3511
  self.__demo_mode_pause_if_active(tiny=True)
3495
3512
 
3513
+ def minimize_window(self):
3514
+ self.__check_scope()
3515
+ if self.__is_cdp_swap_needed():
3516
+ self.cdp.minimize()
3517
+ return
3518
+ self._check_browser()
3519
+ self.driver.minimize_window()
3520
+ self.__demo_mode_pause_if_active(tiny=True)
3521
+
3522
+ def reset_window_size(self):
3523
+ self.__check_scope()
3524
+ if self.__is_cdp_swap_needed():
3525
+ self.cdp.reset_window_size()
3526
+ return
3527
+ self._check_browser()
3528
+ x = settings.WINDOW_START_X
3529
+ y = settings.WINDOW_START_Y
3530
+ width = settings.CHROME_START_WIDTH
3531
+ height = settings.CHROME_START_HEIGHT
3532
+ self.set_window_rect(x, y, width, height)
3533
+ self.__demo_mode_pause_if_active(tiny=True)
3534
+
3496
3535
  def switch_to_frame(self, frame="iframe", timeout=None):
3497
3536
  """Wait for an iframe to appear, and switch to it. This should be
3498
3537
  usable as a drop-in replacement for driver.switch_to.frame().
@@ -4547,6 +4586,11 @@ class BaseCase(unittest.TestCase):
4547
4586
  def get_cookies(self):
4548
4587
  return self.driver.get_cookies()
4549
4588
 
4589
+ def get_cookie_string(self):
4590
+ if self.__is_cdp_swap_needed():
4591
+ return self.cdp.get_cookie_string()
4592
+ return self.execute_script("return document.cookie;")
4593
+
4550
4594
  def add_cookie(self, cookie_dict, expiry=False):
4551
4595
  """Usage examples:
4552
4596
  self.add_cookie({'name': 'foo', 'value': 'bar'})
@@ -5429,7 +5473,10 @@ class BaseCase(unittest.TestCase):
5429
5473
  new_file = True
5430
5474
  sb_config._recorded_actions[filename] = []
5431
5475
  data.append("from seleniumbase import BaseCase")
5432
- data.append("BaseCase.main(__name__, __file__)")
5476
+ if "--uc" in sys.argv:
5477
+ data.append('BaseCase.main(__name__, __file__, "--uc")')
5478
+ else:
5479
+ data.append("BaseCase.main(__name__, __file__)")
5433
5480
  data.append("")
5434
5481
  data.append("")
5435
5482
  data.append("class %s(BaseCase):" % classname)
@@ -5439,7 +5486,13 @@ class BaseCase(unittest.TestCase):
5439
5486
  data.append("class %s(BaseCase):" % classname)
5440
5487
  data.append(" def %s(self):" % methodname)
5441
5488
  if len(sb_actions) > 0:
5489
+ if "--uc" in sys.argv:
5490
+ data.append(" self.activate_cdp_mode()")
5442
5491
  for action in sb_actions:
5492
+ if "--uc" in sys.argv:
5493
+ action = action.replace(
5494
+ "self.type(", "self.press_keys("
5495
+ )
5443
5496
  data.append(" " + action)
5444
5497
  else:
5445
5498
  data.append(" pass")
@@ -5617,6 +5670,9 @@ class BaseCase(unittest.TestCase):
5617
5670
  data.append(" Scenario: %s" % scenario_test)
5618
5671
  if len(behave_actions) > 0:
5619
5672
  count = 0
5673
+ if "--uc" in sys.argv:
5674
+ data.append(" Given Activate CDP Mode")
5675
+ count += 1
5620
5676
  for action in behave_actions:
5621
5677
  if count == 0:
5622
5678
  data.append(" Given " + action)
@@ -7645,7 +7701,10 @@ class BaseCase(unittest.TestCase):
7645
7701
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
7646
7702
  timeout = self.__get_new_timeout(timeout)
7647
7703
  selector, by = self.__recalculate_selector(selector, by)
7648
- if self.__is_shadow_selector(selector):
7704
+ if self.__is_cdp_swap_needed():
7705
+ self.cdp.assert_element_attribute(selector, attribute, value)
7706
+ return
7707
+ elif self.__is_shadow_selector(selector):
7649
7708
  return self.__wait_for_shadow_attribute_present(
7650
7709
  selector, attribute, value=value, timeout=timeout
7651
7710
  )
@@ -7670,6 +7729,9 @@ class BaseCase(unittest.TestCase):
7670
7729
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
7671
7730
  timeout = self.__get_new_timeout(timeout)
7672
7731
  selector, by = self.__recalculate_selector(selector, by)
7732
+ if self.__is_cdp_swap_needed():
7733
+ self.cdp.assert_element_attribute(selector, attribute, value)
7734
+ return
7673
7735
  self.wait_for_attribute(
7674
7736
  selector, attribute, value=value, by=by, timeout=timeout
7675
7737
  )
@@ -7768,6 +7830,9 @@ class BaseCase(unittest.TestCase):
7768
7830
  but then the title switches over to the actual page title.
7769
7831
  In Recorder Mode, this assertion is skipped because the Recorder
7770
7832
  changes the page title to the selector of the hovered element."""
7833
+ if self.__is_cdp_swap_needed():
7834
+ self.cdp.assert_title_contains(substring)
7835
+ return
7771
7836
  self.wait_for_ready_state_complete()
7772
7837
  expected = substring.strip()
7773
7838
  actual = self.get_page_title().strip()
@@ -7811,6 +7876,9 @@ class BaseCase(unittest.TestCase):
7811
7876
 
7812
7877
  def assert_url(self, url):
7813
7878
  """Asserts that the web page URL matches the expected URL."""
7879
+ if self.__is_cdp_swap_needed():
7880
+ self.cdp.assert_url(url)
7881
+ return
7814
7882
  self.wait_for_ready_state_complete()
7815
7883
  expected = url.strip()
7816
7884
  actual = self.get_current_url().strip()
@@ -7846,6 +7914,9 @@ class BaseCase(unittest.TestCase):
7846
7914
 
7847
7915
  def assert_url_contains(self, substring):
7848
7916
  """Asserts that the URL substring appears in the full URL."""
7917
+ if self.__is_cdp_swap_needed():
7918
+ self.cdp.assert_url_contains(substring)
7919
+ return
7849
7920
  self.wait_for_ready_state_complete()
7850
7921
  expected = substring.strip()
7851
7922
  actual = self.get_current_url().strip()
@@ -8044,6 +8115,8 @@ class BaseCase(unittest.TestCase):
8044
8115
 
8045
8116
  def is_online(self):
8046
8117
  """Return True if connected to the Internet."""
8118
+ if self.__is_cdp_swap_needed():
8119
+ return self.cdp.evaluate("navigator.onLine;")
8047
8120
  return self.execute_script("return navigator.onLine;")
8048
8121
 
8049
8122
  def is_connected(self):
@@ -8952,7 +9025,9 @@ class BaseCase(unittest.TestCase):
8952
9025
  timeout = self.__get_new_timeout(timeout)
8953
9026
  original_selector = selector
8954
9027
  selector, by = self.__recalculate_selector(selector, by)
8955
- if self.__is_shadow_selector(selector):
9028
+ if self.__is_cdp_swap_needed():
9029
+ return self.cdp.select(selector)
9030
+ elif self.__is_shadow_selector(selector):
8956
9031
  # If a shadow selector, use visible instead of clickable
8957
9032
  return self.__wait_for_shadow_element_visible(selector, timeout)
8958
9033
  return page_actions.wait_for_element_clickable(
@@ -9353,7 +9428,7 @@ class BaseCase(unittest.TestCase):
9353
9428
  selector, by = self.__recalculate_selector(selector, by)
9354
9429
  if self.__is_cdp_swap_needed():
9355
9430
  return self.cdp.select(selector)
9356
- if self.__is_shadow_selector(selector):
9431
+ elif self.__is_shadow_selector(selector):
9357
9432
  return self.__wait_for_shadow_element_present(selector, timeout)
9358
9433
  return page_actions.wait_for_element_present(
9359
9434
  self.driver,
@@ -9416,6 +9491,8 @@ class BaseCase(unittest.TestCase):
9416
9491
  if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
9417
9492
  timeout = self.__get_new_timeout(timeout)
9418
9493
  css_selector = self.convert_to_css_selector(selector, by=by)
9494
+ if self.__is_cdp_swap_needed():
9495
+ return self.cdp.select(css_selector)
9419
9496
  return js_utils.wait_for_css_query_selector(
9420
9497
  self.driver, css_selector, timeout
9421
9498
  )
@@ -9637,7 +9714,7 @@ class BaseCase(unittest.TestCase):
9637
9714
  selector, by = self.__recalculate_selector(selector, by)
9638
9715
  if self.__is_cdp_swap_needed():
9639
9716
  return self.cdp.find_element(selector)
9640
- if self.__is_shadow_selector(selector):
9717
+ elif self.__is_shadow_selector(selector):
9641
9718
  return self.__wait_for_shadow_text_visible(text, selector, timeout)
9642
9719
  return page_actions.wait_for_text_visible(
9643
9720
  self.driver, text, selector, by, timeout
@@ -10160,6 +10237,9 @@ class BaseCase(unittest.TestCase):
10160
10237
  timeout = settings.SMALL_TIMEOUT
10161
10238
  if self.timeout_multiplier and timeout == settings.SMALL_TIMEOUT:
10162
10239
  timeout = self.__get_new_timeout(timeout)
10240
+ if self.__is_cdp_swap_needed():
10241
+ self.cdp.assert_element_not_visible(selector)
10242
+ return True
10163
10243
  self.wait_for_element_not_visible(selector, by=by, timeout=timeout)
10164
10244
  if self.recorder_mode and self.__current_url_is_recordable():
10165
10245
  if self.get_session_storage_item("pause_recorder") == "no":
@@ -14496,7 +14576,7 @@ class BaseCase(unittest.TestCase):
14496
14576
  message = (
14497
14577
  "Expected value {%s} for attribute {%s} of element "
14498
14578
  "{%s} was not present after %s second%s! "
14499
- "(The actual value was {%s})"
14579
+ "(Actual value was {%s})"
14500
14580
  % (
14501
14581
  value,
14502
14582
  attribute,
@@ -1188,6 +1188,10 @@ def get_locale_code(driver):
1188
1188
  return driver.execute_script(script)
1189
1189
 
1190
1190
 
1191
+ def get_screen_rect(driver):
1192
+ return driver.execute_script("return window.screen;")
1193
+
1194
+
1191
1195
  def get_origin(driver):
1192
1196
  return driver.execute_script("return window.location.origin;")
1193
1197
 
@@ -1196,6 +1200,10 @@ def get_user_agent(driver):
1196
1200
  return driver.execute_script("return navigator.userAgent;")
1197
1201
 
1198
1202
 
1203
+ def get_cookie_string(driver):
1204
+ return driver.execute_script("return document.cookie;")
1205
+
1206
+
1199
1207
  def get_scroll_distance_to_element(driver, element):
1200
1208
  try:
1201
1209
  scroll_position = driver.execute_script("return window.scrollY;")
@@ -275,12 +275,15 @@ def SB(
275
275
  collect_only = ("--co" in sys_argv or "--collect-only" in sys_argv)
276
276
  all_scripts = (hasattr(sb_config, "all_scripts") and sb_config.all_scripts)
277
277
  do_log_folder_setup = False # The first "test=True" run does it
278
+ inner_test = False
278
279
  if (
279
280
  (hasattr(sb_config, "is_behave") and sb_config.is_behave)
280
281
  or (hasattr(sb_config, "is_pytest") and sb_config.is_pytest)
281
282
  or (hasattr(sb_config, "is_nosetest") and sb_config.is_nosetest)
282
283
  ):
283
284
  existing_runner = True
285
+ if test:
286
+ inner_test = True
284
287
  test = False # Already using a test runner. Skip extra test steps.
285
288
  elif test is None and "--test" in sys_argv:
286
289
  test = True
@@ -1222,7 +1225,10 @@ def SB(
1222
1225
  sb._has_failure = True
1223
1226
  exception = e
1224
1227
  test_passed = False
1225
- if not test_name:
1228
+ if (test or inner_test) and not test_name:
1229
+ print(e)
1230
+ return
1231
+ elif not test_name:
1226
1232
  raise
1227
1233
  else:
1228
1234
  the_traceback = traceback.format_exc().strip()
@@ -455,7 +455,7 @@ class Chrome(selenium.webdriver.chrome.webdriver.WebDriver):
455
455
  if self.service.is_connectable():
456
456
  self.stop_client()
457
457
  self.service.stop()
458
- self._is_connected = False
458
+ self._is_connected = False
459
459
 
460
460
  def connect(self):
461
461
  """Starts the chromedriver service that runs in the background
@@ -211,7 +211,11 @@ async def start(
211
211
  expert=expert,
212
212
  **kwargs,
213
213
  )
214
- return await Browser.create(config)
214
+ try:
215
+ return await Browser.create(config)
216
+ except Exception:
217
+ time.sleep(0.15)
218
+ return await Browser.create(config)
215
219
 
216
220
 
217
221
  async def start_async(*args, **kwargs) -> Browser:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: seleniumbase
3
- Version: 4.32.11
3
+ Version: 4.33.0
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
@@ -59,12 +59,16 @@ Classifier: Topic :: Utilities
59
59
  Requires-Python: >=3.8
60
60
  Description-Content-Type: text/markdown
61
61
  License-File: LICENSE
62
- Requires-Dist: pip>=24.2
62
+ Requires-Dist: pip>=24.3.1
63
63
  Requires-Dist: packaging>=24.2
64
- Requires-Dist: wheel>=0.45.0
64
+ Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
+ Requires-Dist: setuptools>=75.6.0; python_version >= "3.10"
66
+ Requires-Dist: wheel>=0.45.1
65
67
  Requires-Dist: attrs>=24.2.0
66
68
  Requires-Dist: certifi>=2024.8.30
67
69
  Requires-Dist: exceptiongroup>=1.2.2
70
+ Requires-Dist: websockets~=13.1; python_version < "3.9"
71
+ Requires-Dist: websockets>=14.1; python_version >= "3.9"
68
72
  Requires-Dist: filelock>=3.16.1
69
73
  Requires-Dist: fasteners>=0.19
70
74
  Requires-Dist: mycdp>=1.1.0
@@ -78,11 +82,14 @@ Requires-Dist: parse-type>=0.6.4
78
82
  Requires-Dist: colorama>=0.4.6
79
83
  Requires-Dist: pyyaml>=6.0.2
80
84
  Requires-Dist: pygments>=2.18.0
85
+ Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
81
86
  Requires-Dist: tabcompleter>=1.4.0
82
87
  Requires-Dist: pdbp>=1.6.1
83
88
  Requires-Dist: idna==3.10
84
89
  Requires-Dist: chardet==5.2.0
85
90
  Requires-Dist: charset-normalizer==3.4.0
91
+ Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
92
+ Requires-Dist: urllib3<2.3.0,>=1.26.20; python_version >= "3.10"
86
93
  Requires-Dist: requests==2.32.3
87
94
  Requires-Dist: sniffio==1.3.1
88
95
  Requires-Dist: h11==0.14.0
@@ -91,7 +98,7 @@ Requires-Dist: trio==0.27.0
91
98
  Requires-Dist: trio-websocket==0.11.1
92
99
  Requires-Dist: wsproto==1.2.0
93
100
  Requires-Dist: websocket-client==1.8.0
94
- Requires-Dist: selenium==4.26.1
101
+ Requires-Dist: selenium==4.27.1
95
102
  Requires-Dist: cssselect==1.2.0
96
103
  Requires-Dist: sortedcontainers==2.4.0
97
104
  Requires-Dist: execnet==2.1.1
@@ -102,40 +109,34 @@ Requires-Dist: pytest==8.3.3
102
109
  Requires-Dist: pytest-html==2.0.1
103
110
  Requires-Dist: pytest-metadata==3.1.1
104
111
  Requires-Dist: pytest-ordering==0.6
105
- Requires-Dist: pytest-rerunfailures==14.0
112
+ Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
113
+ Requires-Dist: pytest-rerunfailures==15.0; python_version >= "3.9"
106
114
  Requires-Dist: pytest-xdist==3.6.1
107
115
  Requires-Dist: parameterized==0.9.0
108
116
  Requires-Dist: behave==1.2.6
109
117
  Requires-Dist: soupsieve==2.6
110
118
  Requires-Dist: beautifulsoup4==4.12.3
111
119
  Requires-Dist: pyotp==2.9.0
120
+ Requires-Dist: python-xlib==0.33; platform_system == "Linux"
112
121
  Requires-Dist: markdown-it-py==3.0.0
113
122
  Requires-Dist: mdurl==0.1.2
114
123
  Requires-Dist: rich==13.9.4
115
- Requires-Dist: python-xlib==0.33; platform_system == "Linux"
116
- Requires-Dist: pyreadline3>=3.5.3; platform_system == "Windows"
117
- Requires-Dist: setuptools~=70.2; python_version < "3.10"
118
- Requires-Dist: urllib3<2,>=1.26.20; python_version < "3.10"
119
- Requires-Dist: websockets~=13.1; python_version < "3.9"
120
- Requires-Dist: setuptools>=75.5.0; python_version >= "3.10"
121
- Requires-Dist: urllib3<2.3.0,>=1.26.20; python_version >= "3.10"
122
- Requires-Dist: websockets>=14.1; python_version >= "3.9"
123
124
  Provides-Extra: allure
124
125
  Requires-Dist: allure-pytest>=2.13.5; extra == "allure"
125
126
  Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
126
127
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
127
128
  Provides-Extra: coverage
128
129
  Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
130
+ Requires-Dist: coverage>=7.6.8; python_version >= "3.9" and extra == "coverage"
129
131
  Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
130
- Requires-Dist: coverage>=7.6.5; python_version >= "3.9" and extra == "coverage"
131
132
  Requires-Dist: pytest-cov>=6.0.0; python_version >= "3.9" and extra == "coverage"
132
133
  Provides-Extra: flake8
133
- Requires-Dist: mccabe==0.7.0; extra == "flake8"
134
134
  Requires-Dist: flake8==5.0.4; python_version < "3.9" and extra == "flake8"
135
- Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
136
- Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
137
135
  Requires-Dist: flake8==7.1.1; python_version >= "3.9" and extra == "flake8"
136
+ Requires-Dist: mccabe==0.7.0; extra == "flake8"
137
+ Requires-Dist: pyflakes==2.5.0; python_version < "3.9" and extra == "flake8"
138
138
  Requires-Dist: pyflakes==3.2.0; python_version >= "3.9" and extra == "flake8"
139
+ Requires-Dist: pycodestyle==2.9.1; python_version < "3.9" and extra == "flake8"
139
140
  Requires-Dist: pycodestyle==2.12.1; python_version >= "3.9" and extra == "flake8"
140
141
  Provides-Extra: ipdb
141
142
  Requires-Dist: ipdb==0.13.13; extra == "ipdb"
@@ -144,10 +145,10 @@ Provides-Extra: mss
144
145
  Requires-Dist: mss==9.0.2; extra == "mss"
145
146
  Provides-Extra: pdfminer
146
147
  Requires-Dist: pdfminer.six==20240706; extra == "pdfminer"
147
- Requires-Dist: cffi==1.17.1; extra == "pdfminer"
148
- Requires-Dist: pycparser==2.22; extra == "pdfminer"
149
148
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
150
149
  Requires-Dist: cryptography==43.0.3; python_version >= "3.9" and extra == "pdfminer"
150
+ Requires-Dist: cffi==1.17.1; extra == "pdfminer"
151
+ Requires-Dist: pycparser==2.22; extra == "pdfminer"
151
152
  Provides-Extra: pillow
152
153
  Requires-Dist: Pillow>=10.4.0; python_version < "3.9" and extra == "pillow"
153
154
  Requires-Dist: Pillow>=11.0.0; python_version >= "3.9" and extra == "pillow"
@@ -1,15 +1,15 @@
1
1
  sbase/__init__.py,sha256=02izDj786GVBT0bpSq2Q2O8uwSxtyT09pnobZz91ML8,605
2
2
  sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
3
- sbase/steps.py,sha256=bKT_u5bJkKzYWEuAXi9NVVRYYxQRCM1_YJUrNFFRVPY,42865
3
+ sbase/steps.py,sha256=_WvAjydKqZfTdnZW9LPKkRty-g-lfdUPmLqnZj6ulcs,43013
4
4
  seleniumbase/__init__.py,sha256=OtJh8nGKL4xtZpw8KPqmn7Q6R-86t4cWUDyVF5MbMTo,2398
5
5
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
6
- seleniumbase/__version__.py,sha256=0NN9rH4ffocZPC19OF8zCT06wDT8muncnxK87-frKM8,47
6
+ seleniumbase/__version__.py,sha256=QWcZHZxKcoTjnqMUASmFQCA91tzSUF4vP43yJf9hNSk,46
7
7
  seleniumbase/behave/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  seleniumbase/behave/behave_helper.py,sha256=elkl8P9eLulRAioLstE9baYNM9N_PHBmAOcajX-pH_Y,24198
9
9
  seleniumbase/behave/behave_sb.py,sha256=-hza7Nx2U41mSObYiPMi48v3JlPh3sJO3yzP0kqZ1Gk,59174
10
10
  seleniumbase/behave/steps.py,sha256=8-N-NB2tnDsxaP4LSg-uSBgbwZYMS6ZEL1oggO1PCoU,390
11
11
  seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
- seleniumbase/common/decorators.py,sha256=xDW2tlXKOV-3xN8h7hP6iRleenn17tAM1ToPZ-eGQ3Y,7653
12
+ seleniumbase/common/decorators.py,sha256=DYdjtF8Y7YJj0JS33WtmsIn4yddPoniNwcPyrgt522o,7857
13
13
  seleniumbase/common/encryption.py,sha256=IfAuE0hdrd3y-_qAQUWdSOKRGQ4QN24uTOBiQ9Eeq2s,5593
14
14
  seleniumbase/common/exceptions.py,sha256=SbdHOTbg7ycrioWleAVw9kG9vBtDfbYoj3e7ikkYYz0,3257
15
15
  seleniumbase/common/obfuscate.py,sha256=VrwPbVigPH_Jk6ADCk5_miMoq1VK4M9SKnYScDkk-DQ,1204
@@ -30,13 +30,13 @@ seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApy
30
30
  seleniumbase/console_scripts/sb_mkdir.py,sha256=csqyWGEUdT2slLnQU3p9gnu5qE26TSVi_ZE3wttH_SQ,29778
31
31
  seleniumbase/console_scripts/sb_mkfile.py,sha256=OWYd4yFccmjrd-gNn1t1una-HDRU2_N2-r4Tg3nHsj0,17744
32
32
  seleniumbase/console_scripts/sb_mkpres.py,sha256=EWFRVacjYTX49y-fEiYTZacM9_01IxuuaO4nMjHrIGo,11015
33
- seleniumbase/console_scripts/sb_mkrec.py,sha256=WrpT4Qd4TWAU3X5CMm_IBb4FhL27FISU9GD2Spe7svY,11927
33
+ seleniumbase/console_scripts/sb_mkrec.py,sha256=PrizjTmyrROYPO0yDm-zQS3QSfsZNeAmcJKKUvfgLhc,11966
34
34
  seleniumbase/console_scripts/sb_objectify.py,sha256=nGxtVGL_nHj0bLHvk86znV3EABsE2_tjF74lgto1_Mk,122020
35
35
  seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0CUpP4VZqWxvI,30558
36
- seleniumbase/console_scripts/sb_recorder.py,sha256=1oAA4wFzVboNhIFDwJLD3jgy9RuoavywKQG7R67bNZE,10908
36
+ seleniumbase/console_scripts/sb_recorder.py,sha256=fnHb5-kh11Hit-E9Ha-e4QXzqLcZvtij6mb5qNd4B1Q,11032
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=Lo-R29qNyhNw2mTjm1I8JkwqIVchEHQeJTiE8JVdATE,219934
39
+ seleniumbase/core/browser_launcher.py,sha256=GT7S15R_nxJJUesB693ST2F0kUMNn4FXrwiNBoXAKpE,220293
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,8 +50,8 @@ seleniumbase/core/proxy_helper.py,sha256=cXhu8ErK9Vjdm82RMaQj7hEq_yUWizSp6LyiD50
50
50
  seleniumbase/core/recorder_helper.py,sha256=fNGjbapXmEsht54x1o6Igk198QdnPxDDnjUOzQxNhNQ,25055
51
51
  seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
52
52
  seleniumbase/core/s3_manager.py,sha256=bkeI8I4y19ebWuQG1oEZV5qJbotC6eN8vin31OCNWJk,3521
53
- seleniumbase/core/sb_cdp.py,sha256=zisjMDPULeGZQ48Cdqpa1JE41NYsoR1dVS8OJB2yHZA,63278
54
- seleniumbase/core/sb_driver.py,sha256=xMgtvBitEMr73RkqgQLT-3IvkP6sh7cJv-caCUPoO-o,12179
53
+ seleniumbase/core/sb_cdp.py,sha256=4H91tZw77A8capl7wsRjzkpD62H018AmzKSQpmxXp6k,66948
54
+ seleniumbase/core/sb_driver.py,sha256=NGa4adi8OAi2WFtFkEguXg3JCd1p-JuZweIpGNifEfU,13488
55
55
  seleniumbase/core/session_helper.py,sha256=s9zD3PVZEWVzG2h81cCUskbNWLfdjC_LwwQjKptHCak,558
56
56
  seleniumbase/core/settings_parser.py,sha256=KokVXpCiGZhJ-D4Bo-hizPz5r-iefzWoiTANu9zNaq4,7504
57
57
  seleniumbase/core/style_sheet.py,sha256=tPpJ1xl6Kuw425Z-3Y0OgVRLGXk_ciBDREZjXk_NuPE,11395
@@ -65,11 +65,11 @@ seleniumbase/extensions/disable_csp.zip,sha256=YMifIIgEBiLrEFrS1sfW4Exh4br1V4oK1
65
65
  seleniumbase/extensions/recorder.zip,sha256=OOyzF-Ize2cSRu1CqhzSAq5vusI9hqLLd2OIApUHesI,11918
66
66
  seleniumbase/extensions/sbase_ext.zip,sha256=3s1N8zrVaMz8RQEOIoBzC3KDjtmHwVZRvVsX25Odr_s,8175
67
67
  seleniumbase/fixtures/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- seleniumbase/fixtures/base_case.py,sha256=4NIR3rsLRqLtDLoe67SsLnB6ln3q2ycjyXL5QqboT8Y,713744
68
+ seleniumbase/fixtures/base_case.py,sha256=_A6LC26exhIz_4o3XXCmn36JeVmC3gJLKSJQeUXLFRg,716755
69
69
  seleniumbase/fixtures/constants.py,sha256=e1LppavlrAcI4XBJMq7u5j8SffaQ7SPQps1y0YvZYfY,13649
70
70
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
71
71
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
72
- seleniumbase/fixtures/js_utils.py,sha256=2l4UY_zUBsMviRoJpLA0z3XxhGeLMWj0Mv07FUR_jzg,50939
72
+ seleniumbase/fixtures/js_utils.py,sha256=uHJ7RdOzvSkhG81nnO_m9qFRVmfCUsYbkH463q_w8Bo,51121
73
73
  seleniumbase/fixtures/page_actions.py,sha256=dbp63c-7asYZyd8aOu57Y3dxQQozp_VJsP5h74s1kBA,66552
74
74
  seleniumbase/fixtures/page_utils.py,sha256=5m7iXpikLs80TJoRO6_gEfXE1AKeQgcH1aFbR8o1C9A,12034
75
75
  seleniumbase/fixtures/shared_utils.py,sha256=WbPb15IvIWzRtMInKG8DUzJ26UZU-PixdOwTCjXQirU,7545
@@ -90,7 +90,7 @@ seleniumbase/plugins/driver_manager.py,sha256=s20s0pJYaNrG0WNwyIC04oUMRVFjtm6V_n
90
90
  seleniumbase/plugins/page_source.py,sha256=loTnXxOj4kxEukuTZEiGyvKBhY3KDVDMnNlHHheTBDE,1889
91
91
  seleniumbase/plugins/pytest_plugin.py,sha256=Up96HY6q3hcPo4LQoEcKqt1hm2OmY5GZz_nMXTqDSXQ,97185
92
92
  seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
93
- seleniumbase/plugins/sb_manager.py,sha256=lVCPDL0Y1ig2TAOZUlJmMZs2ij-SqhYhaEd_SYZyRfQ,54256
93
+ seleniumbase/plugins/sb_manager.py,sha256=qCf6RAkAfziLTGgiJvB3V416RxWoTbRLm9wc-KsB8g8,54419
94
94
  seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
95
95
  seleniumbase/plugins/selenium_plugin.py,sha256=GhGW2ATy2kM7UH7NrZ2je402nN2LMlVHpM-yxlU3I9E,59069
96
96
  seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -106,7 +106,7 @@ seleniumbase/translate/portuguese.py,sha256=x3P4qxp56UiI41GoaL7JbUvFRYsgXU1EKjTg
106
106
  seleniumbase/translate/russian.py,sha256=TyN9n0b4GRWDEYnHRGw1rfNAscdDmP3F3Y3aySM3C7s,27978
107
107
  seleniumbase/translate/spanish.py,sha256=hh3xgW1Pq122SHYVvJAxFaXhFrjniOVncVbJbfWqOUM,25528
108
108
  seleniumbase/translate/translator.py,sha256=wPhZH6e5NhmebYL1kP2eGxUcVy1gfTb6XCH8ATEPpxE,49238
109
- seleniumbase/undetected/__init__.py,sha256=yBUsi4T79yUVxg9yKuDdjeCP85tMiaVBpjarTniBDTQ,23002
109
+ seleniumbase/undetected/__init__.py,sha256=PSaAVgWU-yU1zwts2-UIJMWS6Mwo1YwAw0pMlSx6jVM,22998
110
110
  seleniumbase/undetected/cdp.py,sha256=RLpwZnhUvmK9tgXcZIBBQedwk2q7Jj_EXZkmzI8WUqk,4023
111
111
  seleniumbase/undetected/dprocess.py,sha256=83EV8ZHJWHG1TSUv9JNClBhdgiBXlkCc6mJ--HsoP3k,1681
112
112
  seleniumbase/undetected/options.py,sha256=BoNuwhrG7oOvuLvTwkvsWCF36pMkS1tHCG-XpP4_EkI,3001
@@ -116,7 +116,7 @@ seleniumbase/undetected/webelement.py,sha256=_s6evgUkdWJpwOnzX4qR9i796PoVbz3txlz
116
116
  seleniumbase/undetected/cdp_driver/__init__.py,sha256=c0TjMwPfVFyoqYOJ7PQ-Jln_L_dpN3ebHyaD-juQoM0,64
117
117
  seleniumbase/undetected/cdp_driver/_contradict.py,sha256=6thDYeoEGiC7Q3tXLgoD_AhxecCFnATzBSjNympyRHA,3184
118
118
  seleniumbase/undetected/cdp_driver/browser.py,sha256=mGmpWuR206yYJoBPTNslru8CbEpQuvvIHdjBylSkoKg,30020
119
- seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=Erfb62fzpvGr0QIIJOiqvGkyoyBakHOIwgbrQ7dqUgM,16625
119
+ seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=YhtD2Tm6PLIy9VKbgk8lHdGniS3mObyX4yAC1aG0TgQ,16733
120
120
  seleniumbase/undetected/cdp_driver/config.py,sha256=Rjvde7V-XJ0ihZdTmOmHEVWSuDWm3SprQ3njg8SN3Go,12087
121
121
  seleniumbase/undetected/cdp_driver/connection.py,sha256=sOTUGjbUqKA2hPvDcRCdqw1VQjVGJs7mbgVvzS7ldtE,23360
122
122
  seleniumbase/undetected/cdp_driver/element.py,sha256=wEHtuF9oiny7cb4QMMjdtD5Yf1z3WOs2_NHEWcscusM,40289
@@ -135,9 +135,9 @@ seleniumbase/utilities/selenium_grid/start-grid-hub.bat,sha256=Ftq-GrAKRYH2ssDPr
135
135
  seleniumbase/utilities/selenium_grid/start-grid-hub.sh,sha256=KADv0RUHONLL2_I443QFK8PryBpDmKn5Gy0s4o0vDSM,106
136
136
  seleniumbase/utilities/selenium_ide/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
137
137
  seleniumbase/utilities/selenium_ide/convert_ide.py,sha256=pZFnqEJQEKZPyNFjkLD29s2HPQgCrWW9XJWpCPhWOoM,31691
138
- seleniumbase-4.32.11.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
139
- seleniumbase-4.32.11.dist-info/METADATA,sha256=VuRR7rY9QmKSwRL8cbN6el6Vrw4NFcJ_qYpkxWg_22o,86462
140
- seleniumbase-4.32.11.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
141
- seleniumbase-4.32.11.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
- seleniumbase-4.32.11.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
- seleniumbase-4.32.11.dist-info/RECORD,,
138
+ seleniumbase-4.33.0.dist-info/LICENSE,sha256=odSYtWibXBnQ1gBg6CnDZ82n8kLF_if5-2nbqnEyD8k,1085
139
+ seleniumbase-4.33.0.dist-info/METADATA,sha256=vubW0bw2Oh3djh-PyVRyNtMR0qOqUWSzYo05-T_IE5w,86554
140
+ seleniumbase-4.33.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
141
+ seleniumbase-4.33.0.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
+ seleniumbase-4.33.0.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
+ seleniumbase-4.33.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5