seleniumbase 4.38.3__py3-none-any.whl → 4.39.1__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.38.3"
2
+ __version__ = "4.39.1"
@@ -1280,15 +1280,9 @@ def _perform_behave_unconfigure_():
1280
1280
  )
1281
1281
  find_it_3 = '<td class="col-result">Untested</td>'
1282
1282
  swap_with_3 = '<td class="col-result">Unreported</td>'
1283
- if sys.version_info[0] >= 3:
1284
- # These use caching to prevent extra method calls
1285
- DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1()
1286
- DASH_PIE_PNG_2 = constants.Dashboard.get_dash_pie_2()
1287
- else:
1288
- from seleniumbase.core import encoded_images
1289
-
1290
- DASH_PIE_PNG_1 = encoded_images.get_dash_pie_png1()
1291
- DASH_PIE_PNG_2 = encoded_images.get_dash_pie_png2()
1283
+ # These use caching to prevent extra method calls
1284
+ DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1()
1285
+ DASH_PIE_PNG_2 = constants.Dashboard.get_dash_pie_2()
1292
1286
  find_it_4 = 'href="%s"' % DASH_PIE_PNG_1
1293
1287
  swap_with_4 = 'href="%s"' % DASH_PIE_PNG_2
1294
1288
  try:
@@ -1001,7 +1001,6 @@ def main():
1001
1001
  retry_msg_2 = "** Unable to download driver! Retrying in 5s..."
1002
1002
  if " --proxy=" in " ".join(sys.argv):
1003
1003
  from seleniumbase.core import proxy_helper
1004
-
1005
1004
  for arg in sys.argv:
1006
1005
  if arg.startswith("--proxy="):
1007
1006
  proxy_string = arg.split("--proxy=")[1]
@@ -1036,11 +1035,9 @@ def main():
1036
1035
  show_install_usage()
1037
1036
  elif command == "commander" or command == "gui":
1038
1037
  from seleniumbase.console_scripts import sb_commander
1039
-
1040
1038
  sb_commander.main()
1041
1039
  elif command == "behave-gui" or command == "gui-behave":
1042
1040
  from seleniumbase.console_scripts import sb_behave_gui
1043
-
1044
1041
  sb_behave_gui.main()
1045
1042
  elif (
1046
1043
  command == "caseplans"
@@ -1048,14 +1045,12 @@ def main():
1048
1045
  or command == "case_plans"
1049
1046
  ):
1050
1047
  from seleniumbase.console_scripts import sb_caseplans
1051
-
1052
1048
  sb_caseplans.main()
1053
1049
  elif (
1054
1050
  command == "recorder"
1055
1051
  or (command == "record" and len(command_args) == 0)
1056
1052
  ):
1057
1053
  from seleniumbase.console_scripts import sb_recorder
1058
-
1059
1054
  sb_recorder.main()
1060
1055
  elif (
1061
1056
  command == "mkrec"
@@ -1064,7 +1059,6 @@ def main():
1064
1059
  ):
1065
1060
  if len(command_args) >= 1:
1066
1061
  from seleniumbase.console_scripts import sb_mkrec
1067
-
1068
1062
  sb_mkrec.main()
1069
1063
  else:
1070
1064
  show_basic_usage()
@@ -1075,7 +1069,6 @@ def main():
1075
1069
  elif command == "mkdir":
1076
1070
  if len(command_args) >= 1:
1077
1071
  from seleniumbase.console_scripts import sb_mkdir
1078
-
1079
1072
  sb_mkdir.main()
1080
1073
  else:
1081
1074
  show_basic_usage()
@@ -1083,7 +1076,6 @@ def main():
1083
1076
  elif command == "mkfile":
1084
1077
  if len(command_args) >= 1:
1085
1078
  from seleniumbase.console_scripts import sb_mkfile
1086
-
1087
1079
  sb_mkfile.main()
1088
1080
  else:
1089
1081
  show_basic_usage()
@@ -1091,7 +1083,6 @@ def main():
1091
1083
  elif command == "mkpres":
1092
1084
  if len(command_args) >= 1:
1093
1085
  from seleniumbase.console_scripts import sb_mkpres
1094
-
1095
1086
  sb_mkpres.main()
1096
1087
  else:
1097
1088
  show_basic_usage()
@@ -1099,7 +1090,6 @@ def main():
1099
1090
  elif command == "mkchart":
1100
1091
  if len(command_args) >= 1:
1101
1092
  from seleniumbase.console_scripts import sb_mkchart
1102
-
1103
1093
  sb_mkchart.main()
1104
1094
  else:
1105
1095
  show_basic_usage()
@@ -1107,7 +1097,6 @@ def main():
1107
1097
  elif command == "convert":
1108
1098
  if len(command_args) == 1:
1109
1099
  from seleniumbase.utilities.selenium_ide import convert_ide
1110
-
1111
1100
  convert_ide.main()
1112
1101
  else:
1113
1102
  show_basic_usage()
@@ -1115,22 +1104,13 @@ def main():
1115
1104
  elif command == "print":
1116
1105
  if len(command_args) >= 1:
1117
1106
  from seleniumbase.console_scripts import sb_print
1118
-
1119
1107
  sb_print.main()
1120
1108
  else:
1121
1109
  show_basic_usage()
1122
1110
  show_print_usage()
1123
1111
  elif command == "translate":
1124
1112
  if len(command_args) >= 1:
1125
- if sys.version_info[0] == 2:
1126
- c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX
1127
- cr = colorama.Style.RESET_ALL
1128
- msg = "The SeleniumBase Translator does NOT support Python 2!"
1129
- message = "\n" + c5 + msg + cr + "\n"
1130
- print("")
1131
- raise Exception(message)
1132
1113
  from seleniumbase.translate import translator
1133
-
1134
1114
  translator.main()
1135
1115
  else:
1136
1116
  show_basic_usage()
@@ -1138,7 +1118,6 @@ def main():
1138
1118
  elif command == "extract-objects" or command == "extract_objects":
1139
1119
  if len(command_args) >= 1:
1140
1120
  from seleniumbase.console_scripts import sb_objectify
1141
-
1142
1121
  sb_objectify.extract_objects()
1143
1122
  else:
1144
1123
  show_basic_usage()
@@ -1154,7 +1133,6 @@ def main():
1154
1133
  elif command == "objectify":
1155
1134
  if len(command_args) >= 1:
1156
1135
  from seleniumbase.console_scripts import sb_objectify
1157
-
1158
1136
  sb_objectify.objectify()
1159
1137
  else:
1160
1138
  show_basic_usage()
@@ -1162,7 +1140,6 @@ def main():
1162
1140
  elif command == "revert-objects" or command == "revert_objects":
1163
1141
  if len(command_args) >= 1:
1164
1142
  from seleniumbase.console_scripts import sb_objectify
1165
-
1166
1143
  sb_objectify.revert_objects()
1167
1144
  else:
1168
1145
  show_basic_usage()
@@ -1170,7 +1147,6 @@ def main():
1170
1147
  elif command == "encrypt" or command == "obfuscate":
1171
1148
  if len(command_args) >= 0:
1172
1149
  from seleniumbase.common import obfuscate
1173
-
1174
1150
  obfuscate.main()
1175
1151
  else:
1176
1152
  show_basic_usage()
@@ -1178,7 +1154,6 @@ def main():
1178
1154
  elif command == "decrypt" or command == "unobfuscate":
1179
1155
  if len(command_args) >= 0:
1180
1156
  from seleniumbase.common import unobfuscate
1181
-
1182
1157
  unobfuscate.main()
1183
1158
  else:
1184
1159
  show_basic_usage()
@@ -1188,7 +1163,6 @@ def main():
1188
1163
  from seleniumbase.utilities.selenium_grid import (
1189
1164
  download_selenium_server,
1190
1165
  )
1191
-
1192
1166
  download_selenium_server.main(force_download=True)
1193
1167
  else:
1194
1168
  show_basic_usage()
@@ -1196,7 +1170,6 @@ def main():
1196
1170
  elif command == "grid-hub" or command == "grid_hub":
1197
1171
  if len(command_args) >= 1:
1198
1172
  from seleniumbase.utilities.selenium_grid import grid_hub
1199
-
1200
1173
  grid_hub.main()
1201
1174
  else:
1202
1175
  show_basic_usage()
@@ -1204,7 +1177,6 @@ def main():
1204
1177
  elif command == "grid-node" or command == "grid_node":
1205
1178
  if len(command_args) >= 1:
1206
1179
  from seleniumbase.utilities.selenium_grid import grid_node
1207
-
1208
1180
  grid_node.main()
1209
1181
  else:
1210
1182
  show_basic_usage()
@@ -1212,7 +1184,6 @@ def main():
1212
1184
  elif command == "version" or command == "--version" or command == "-v":
1213
1185
  if len(command_args) == 0:
1214
1186
  from seleniumbase.console_scripts import logo_helper
1215
-
1216
1187
  seleniumbase_logo = logo_helper.get_seleniumbase_logo()
1217
1188
  print(seleniumbase_logo)
1218
1189
  print("")
@@ -1231,7 +1202,6 @@ def main():
1231
1202
  import fasteners
1232
1203
  import os
1233
1204
  import warnings
1234
-
1235
1205
  with warnings.catch_warnings():
1236
1206
  warnings.simplefilter("ignore", category=UserWarning)
1237
1207
  pip_find_lock = fasteners.InterProcessLock(
@@ -20,13 +20,6 @@ import tkinter as tk
20
20
  from seleniumbase.fixtures import shared_utils
21
21
  from tkinter.scrolledtext import ScrolledText
22
22
 
23
- if sys.version_info <= (3, 8):
24
- current_version = ".".join(str(ver) for ver in sys.version_info[:3])
25
- raise Exception(
26
- "\n* SBase Commander requires Python 3.8 or newer!"
27
- "\n** You are currently using Python %s" % current_version
28
- )
29
-
30
23
 
31
24
  def set_colors(use_colors):
32
25
  c0 = ""
@@ -25,13 +25,6 @@ from seleniumbase.fixtures import shared_utils
25
25
  from tkinter import messagebox
26
26
  from tkinter.scrolledtext import ScrolledText
27
27
 
28
- if sys.version_info <= (3, 8):
29
- current_version = ".".join(str(ver) for ver in sys.version_info[:3])
30
- raise Exception(
31
- "\n* SBase Case Plans Generator requires Python 3.8 or newer!"
32
- "\n** You are currently using Python %s" % current_version
33
- )
34
-
35
28
 
36
29
  def set_colors(use_colors):
37
30
  c0 = ""
@@ -25,13 +25,6 @@ import tkinter as tk
25
25
  from seleniumbase.fixtures import shared_utils
26
26
  from tkinter.scrolledtext import ScrolledText
27
27
 
28
- if sys.version_info <= (3, 8):
29
- current_version = ".".join(str(ver) for ver in sys.version_info[:3])
30
- raise Exception(
31
- "\n* SBase Commander requires Python 3.8 or newer!"
32
- "\n** You are currently using Python %s" % current_version
33
- )
34
-
35
28
 
36
29
  def set_colors(use_colors):
37
30
  c0 = ""
@@ -192,8 +192,9 @@ def main():
192
192
  elif "'" not in start_page:
193
193
  used_sp = "'%s'" % start_page
194
194
  data.append(
195
- " self.uc_open_with_disconnect(\n"
196
- " %s\n"
195
+ " self.activate_cdp_mode(\n"
196
+ " %s,\n"
197
+ " recorder=True,\n"
197
198
  " )" % used_sp
198
199
  )
199
200
  else:
@@ -30,12 +30,6 @@ sb_config.rec_subprocess_used = False
30
30
  sys_executable = sys.executable
31
31
  if " " in sys_executable:
32
32
  sys_executable = "python"
33
- if sys.version_info <= (3, 8):
34
- current_version = ".".join(str(ver) for ver in sys.version_info[:3])
35
- raise Exception(
36
- "\n* Recorder Desktop requires Python 3.8 or newer!"
37
- "\n*** You are currently using Python %s" % current_version
38
- )
39
33
 
40
34
 
41
35
  def set_colors(use_colors):
@@ -108,7 +108,9 @@ def make_driver_executable_if_not(driver_path):
108
108
  shared_utils.make_executable(driver_path)
109
109
 
110
110
 
111
- def extend_driver(driver, proxy_auth=False, use_uc=True):
111
+ def extend_driver(
112
+ driver, proxy_auth=False, use_uc=True, recorder_ext=False
113
+ ):
112
114
  # Extend the driver with new methods
113
115
  driver.default_find_element = driver.find_element
114
116
  driver.default_find_elements = driver.find_elements
@@ -234,6 +236,14 @@ def extend_driver(driver, proxy_auth=False, use_uc=True):
234
236
  driver.switch_to_tab = DM.switch_to_tab
235
237
  driver.switch_to_frame = DM.switch_to_frame
236
238
  driver.reset_window_size = DM.reset_window_size
239
+ if recorder_ext:
240
+ from seleniumbase.js_code.recorder_js import recorder_js
241
+ recorder_code = (
242
+ """window.onload = function() { %s };""" % recorder_js
243
+ )
244
+ driver.execute_cdp_cmd(
245
+ "Page.addScriptToEvaluateOnNewDocument", {"source": recorder_code}
246
+ )
237
247
  if hasattr(driver, "proxy"):
238
248
  driver.set_wire_proxy = DM.set_wire_proxy
239
249
  if proxy_auth:
@@ -2542,6 +2552,7 @@ def _set_chrome_options(
2542
2552
  included_disabled_features.append("PrivacySandboxSettings4")
2543
2553
  included_disabled_features.append("SidePanelPinning")
2544
2554
  included_disabled_features.append("UserAgentClientHint")
2555
+ included_disabled_features.append("DisableLoadExtensionCommandLineSwitch")
2545
2556
  for item in extra_disabled_features:
2546
2557
  if item not in included_disabled_features:
2547
2558
  included_disabled_features.append(item)
@@ -2819,6 +2830,8 @@ def get_driver(
2819
2830
  if headless2 and browser_name == constants.Browser.FIREFOX:
2820
2831
  headless2 = False # Only for Chromium
2821
2832
  headless = True
2833
+ if binary_location and isinstance(binary_location, str):
2834
+ binary_location = binary_location.strip()
2822
2835
  if (
2823
2836
  is_using_uc(undetectable, browser_name)
2824
2837
  and binary_location
@@ -3014,6 +3027,8 @@ def get_driver(
3014
3027
  proxy_pass = None
3015
3028
  proxy_scheme = "http"
3016
3029
  if proxy_string:
3030
+ # (The code below was for the Chrome 137 extension fix)
3031
+ # sb_config._cdp_proxy = proxy_string
3017
3032
  username_and_password = None
3018
3033
  if "@" in proxy_string:
3019
3034
  # Format => username:password@hostname:port
@@ -4450,6 +4465,9 @@ def get_local_driver(
4450
4465
  included_disabled_features.append("PrivacySandboxSettings4")
4451
4466
  included_disabled_features.append("SidePanelPinning")
4452
4467
  included_disabled_features.append("UserAgentClientHint")
4468
+ included_disabled_features.append(
4469
+ "DisableLoadExtensionCommandLineSwitch"
4470
+ )
4453
4471
  for item in extra_disabled_features:
4454
4472
  if item not in included_disabled_features:
4455
4473
  included_disabled_features.append(item)
@@ -5328,7 +5346,9 @@ def get_local_driver(
5328
5346
  driver = webdriver.Chrome(
5329
5347
  service=service, options=chrome_options
5330
5348
  )
5331
- return extend_driver(driver, proxy_auth, use_uc)
5349
+ return extend_driver(
5350
+ driver, proxy_auth, use_uc, recorder_ext
5351
+ )
5332
5352
  if not auto_upgrade_chromedriver:
5333
5353
  raise # Not an obvious fix.
5334
5354
  else:
@@ -5580,11 +5600,15 @@ def get_local_driver(
5580
5600
  'Emulation.setDeviceMetricsOverride',
5581
5601
  set_device_metrics_override
5582
5602
  )
5583
- return extend_driver(driver, proxy_auth, use_uc)
5603
+ return extend_driver(
5604
+ driver, proxy_auth, use_uc, recorder_ext
5605
+ )
5584
5606
  else: # Running headless on Linux (and not using --uc)
5585
5607
  try:
5586
5608
  driver = webdriver.Chrome(options=chrome_options)
5587
- return extend_driver(driver, proxy_auth, use_uc)
5609
+ return extend_driver(
5610
+ driver, proxy_auth, use_uc, recorder_ext
5611
+ )
5588
5612
  except Exception as e:
5589
5613
  if not hasattr(e, "msg"):
5590
5614
  raise
@@ -5606,7 +5630,9 @@ def get_local_driver(
5606
5630
  driver = webdriver.Chrome(
5607
5631
  service=service, options=chrome_options
5608
5632
  )
5609
- return extend_driver(driver, proxy_auth, use_uc)
5633
+ return extend_driver(
5634
+ driver, proxy_auth, use_uc, recorder_ext
5635
+ )
5610
5636
  mcv = None # Major Chrome Version
5611
5637
  if "Current browser version is " in e.msg:
5612
5638
  line = e.msg.split("Current browser version is ")[1]
@@ -5649,7 +5675,9 @@ def get_local_driver(
5649
5675
  service=service,
5650
5676
  options=chrome_options,
5651
5677
  )
5652
- return extend_driver(driver, proxy_auth, use_uc)
5678
+ return extend_driver(
5679
+ driver, proxy_auth, use_uc, recorder_ext
5680
+ )
5653
5681
  # Use the virtual display on Linux during headless errors
5654
5682
  logging.debug(
5655
5683
  "\nWarning: Chrome failed to launch in"
@@ -5667,7 +5695,9 @@ def get_local_driver(
5667
5695
  driver = webdriver.Chrome(
5668
5696
  service=service, options=chrome_options
5669
5697
  )
5670
- return extend_driver(driver, proxy_auth, use_uc)
5698
+ return extend_driver(
5699
+ driver, proxy_auth, use_uc, recorder_ext
5700
+ )
5671
5701
  except Exception as original_exception:
5672
5702
  if use_uc:
5673
5703
  raise
@@ -5677,7 +5707,9 @@ def get_local_driver(
5677
5707
  driver = webdriver.Chrome(
5678
5708
  service=service, options=chrome_options
5679
5709
  )
5680
- return extend_driver(driver, proxy_auth, use_uc)
5710
+ return extend_driver(
5711
+ driver, proxy_auth, use_uc, recorder_ext
5712
+ )
5681
5713
  if user_data_dir:
5682
5714
  print("\nUnable to set user_data_dir while starting Chrome!\n")
5683
5715
  raise
@@ -5704,7 +5736,9 @@ def get_local_driver(
5704
5736
  )
5705
5737
  try:
5706
5738
  driver = webdriver.Chrome(service=service)
5707
- return extend_driver(driver, proxy_auth, use_uc)
5739
+ return extend_driver(
5740
+ driver, proxy_auth, use_uc, recorder_ext
5741
+ )
5708
5742
  except Exception:
5709
5743
  raise original_exception
5710
5744
  else:
@@ -19,8 +19,8 @@ class DatabaseManager:
19
19
  constants.PipInstall.FINDLOCK
20
20
  )
21
21
  with pip_find_lock:
22
- if sys.version_info >= (3, 7) and sys.version_info < (3, 9):
23
- # Fix bug in newer cryptography for Python 3.7 and 3.8:
22
+ if sys.version_info < (3, 9):
23
+ # Fix bug with newer cryptography on Python 3.8:
24
24
  # "pyo3_runtime.PanicException: Python API call failed"
25
25
  # (Match the version needed for pdfminer.six functions)
26
26
  try:
@@ -1,4 +1,3 @@
1
- import sys
2
1
  import textwrap
3
2
  from seleniumbase.fixtures import constants
4
3
 
@@ -11,18 +10,12 @@ class Saved:
11
10
  def get_report_style():
12
11
  if hasattr(Saved, "report_style"):
13
12
  return Saved.report_style
14
- if sys.version_info[0] >= 3:
15
- # Uses caching to prevent extra method calls
16
- REPORT_FAVICON = constants.Report.get_favicon()
17
- else:
18
- from seleniumbase.core import encoded_images
19
-
20
- REPORT_FAVICON = encoded_images.get_report_favicon()
13
+ # Uses caching to prevent extra method calls
14
+ REPORT_FAVICON = constants.Report.get_favicon()
21
15
  title = """<meta id="OGTitle" property="og:title" content="SeleniumBase">
22
16
  <title>Test Report</title>
23
17
  <link rel="SHORTCUT ICON"
24
18
  href="%s" />""" % REPORT_FAVICON
25
-
26
19
  style = (
27
20
  title
28
21
  + """<style type="text/css">
@@ -1,5 +1,4 @@
1
1
  import os
2
- import sys
3
2
  from seleniumbase.core import log_helper
4
3
  from seleniumbase.fixtures import constants
5
4
 
@@ -22,13 +21,8 @@ def visual_baseline_folder_setup():
22
21
 
23
22
 
24
23
  def get_sbs_head():
25
- if sys.version_info[0] >= 3:
26
- # Uses caching to prevent extra method calls
27
- SIDE_BY_SIDE_PNG = constants.SideBySide.get_favicon()
28
- else:
29
- from seleniumbase.core import encoded_images
30
-
31
- SIDE_BY_SIDE_PNG = encoded_images.get_side_by_side_png()
24
+ # Uses caching to prevent extra method calls
25
+ SIDE_BY_SIDE_PNG = constants.SideBySide.get_favicon()
32
26
  head = (
33
27
  '<head><meta charset="utf-8">'
34
28
  '<meta name="viewport" content="shrink-to-fit=no">'
Binary file
@@ -10044,12 +10044,14 @@ class BaseCase(unittest.TestCase):
10044
10044
  elif self.__is_cdp_swap_needed():
10045
10045
  self.cdp.assert_text(text, selector, timeout=timeout)
10046
10046
  return True
10047
- elif not self.is_connected():
10048
- self.connect()
10049
10047
  elif self.__is_shadow_selector(selector):
10048
+ if hasattr(self, "connect") and not self.is_connected():
10049
+ self.connect()
10050
10050
  self.__assert_shadow_text_visible(text, selector, timeout)
10051
10051
  return True
10052
10052
  else:
10053
+ if hasattr(self, "connect") and not self.is_connected():
10054
+ self.connect()
10053
10055
  self.wait_for_text_visible(text, selector, by=by, timeout=timeout)
10054
10056
  if self.demo_mode:
10055
10057
  a_t = "ASSERT TEXT"
@@ -292,6 +292,7 @@ class Browser:
292
292
  _cdp_locale = None
293
293
  _cdp_platform = None
294
294
  _cdp_geolocation = None
295
+ _cdp_recorder = None
295
296
  if (
296
297
  hasattr(sb_config, "_cdp_timezone") and sb_config._cdp_timezone
297
298
  ):
@@ -330,6 +331,8 @@ class Browser:
330
331
  _cdp_geolocation = kwargs["geolocation"]
331
332
  elif "geoloc" in kwargs:
332
333
  _cdp_geolocation = kwargs["geoloc"]
334
+ if "recorder" in kwargs:
335
+ _cdp_recorder = kwargs["recorder"]
333
336
  if _cdp_timezone:
334
337
  await connection.send(cdp.page.navigate("about:blank"))
335
338
  await connection.set_timezone(_cdp_timezone)
@@ -344,9 +347,37 @@ class Browser:
344
347
  await connection.send(cdp.page.navigate("about:blank"))
345
348
  await connection.set_geolocation(_cdp_geolocation)
346
349
  # Use the tab to navigate to new url
350
+ if (
351
+ hasattr(sb_config, "_cdp_proxy")
352
+ and "@" in sb_config._cdp_proxy
353
+ and sb_config._cdp_proxy
354
+ and "auth" not in kwargs
355
+ ):
356
+ username_and_password = sb_config._cdp_proxy.split("@")[0]
357
+ proxy_user = username_and_password.split(":")[0]
358
+ proxy_pass = username_and_password.split(":")[1]
359
+ await connection.set_auth(
360
+ proxy_user, proxy_pass, self.tabs[0]
361
+ )
362
+ time.sleep(0.25)
363
+ elif "auth" in kwargs and kwargs["auth"] and ":" in kwargs["auth"]:
364
+ username_and_password = kwargs["auth"]
365
+ proxy_user = username_and_password.split(":")[0]
366
+ proxy_pass = username_and_password.split(":")[1]
367
+ await connection.set_auth(
368
+ proxy_user, proxy_pass, self.tabs[0]
369
+ )
370
+ time.sleep(0.25)
347
371
  frame_id, loader_id, *_ = await connection.send(
348
372
  cdp.page.navigate(url)
349
373
  )
374
+ if _cdp_recorder:
375
+ pass # (The code below was for the Chrome 137 extension fix)
376
+ '''from seleniumbase.js_code.recorder_js import recorder_js
377
+ recorder_code = (
378
+ """window.onload = function() { %s };""" % recorder_js
379
+ )
380
+ await connection.send(cdp.runtime.evaluate(recorder_code))'''
350
381
  # Update the frame_id on the tab
351
382
  connection.frame_id = frame_id
352
383
  connection.browser = self
@@ -680,6 +711,9 @@ class Browser:
680
711
  self._process = None
681
712
  self._process_pid = None
682
713
 
714
+ def quit(self):
715
+ self.stop()
716
+
683
717
  def __await__(self):
684
718
  # return ( asyncio.sleep(0)).__await__()
685
719
  return self.update_targets().__await__()
@@ -360,8 +360,10 @@ async def start(
360
360
  except Exception:
361
361
  time.sleep(0.15)
362
362
  driver = await Browser.create(config)
363
- if proxy and "@" in str(proxy):
364
- time.sleep(0.15)
363
+ if proxy:
364
+ sb_config._cdp_proxy = proxy
365
+ if "@" in str(proxy):
366
+ time.sleep(0.15)
365
367
  if lang:
366
368
  sb_config._cdp_locale = lang
367
369
  elif "locale" in kwargs:
@@ -402,10 +404,14 @@ async def start_async(*args, **kwargs) -> Browser:
402
404
  binary_location = None
403
405
  if "browser_executable_path" in kwargs:
404
406
  binary_location = kwargs["browser_executable_path"]
407
+ if binary_location and isinstance(binary_location, str):
408
+ binary_location = binary_location.strip()
405
409
  else:
406
410
  binary_location = detect_b_ver.get_binary_location("google-chrome")
407
- if binary_location and not os.path.exists(binary_location):
408
- binary_location = None
411
+ if binary_location and isinstance(binary_location, str):
412
+ binary_location = binary_location.strip()
413
+ if not os.path.exists(binary_location):
414
+ binary_location = None
409
415
  if (
410
416
  shared_utils.is_chrome_130_or_newer(binary_location)
411
417
  and "user_data_dir" in kwargs
@@ -438,10 +444,14 @@ def start_sync(*args, **kwargs) -> Browser:
438
444
  binary_location = None
439
445
  if "browser_executable_path" in kwargs:
440
446
  binary_location = kwargs["browser_executable_path"]
447
+ if binary_location and isinstance(binary_location, str):
448
+ binary_location = binary_location.strip()
441
449
  else:
442
450
  binary_location = detect_b_ver.get_binary_location("google-chrome")
443
- if binary_location and not os.path.exists(binary_location):
444
- binary_location = None
451
+ if binary_location and isinstance(binary_location, str):
452
+ binary_location = binary_location.strip()
453
+ if not os.path.exists(binary_location):
454
+ binary_location = None
445
455
  if (
446
456
  shared_utils.is_chrome_130_or_newer(binary_location)
447
457
  and "user_data_dir" in kwargs
@@ -144,7 +144,8 @@ class Config:
144
144
  "--disable-features=IsolateOrigins,site-per-process,Translate,"
145
145
  "InsecureDownloadWarnings,DownloadBubble,DownloadBubbleV2,"
146
146
  "OptimizationTargetPrediction,OptimizationGuideModelDownloading,"
147
- "SidePanelPinning,UserAgentClientHint,PrivacySandboxSettings4",
147
+ "SidePanelPinning,UserAgentClientHint,PrivacySandboxSettings4,"
148
+ "DisableLoadExtensionCommandLineSwitch",
148
149
  ]
149
150
 
150
151
  @property
@@ -378,6 +378,36 @@ class Connection(metaclass=CantTouchThis):
378
378
  accuracy=100,
379
379
  ))
380
380
 
381
+ async def set_auth(self, username, password, tab):
382
+ async def auth_challenge_handler(event: cdp.fetch.AuthRequired):
383
+ await tab.send(
384
+ cdp.fetch.continue_with_auth(
385
+ request_id=event.request_id,
386
+ auth_challenge_response=cdp.fetch.AuthChallengeResponse(
387
+ response="ProvideCredentials",
388
+ username=username,
389
+ password=password,
390
+ ),
391
+ )
392
+ )
393
+
394
+ async def req_paused(event: cdp.fetch.RequestPaused):
395
+ await tab.send(
396
+ cdp.fetch.continue_request(request_id=event.request_id)
397
+ )
398
+
399
+ tab.add_handler(
400
+ cdp.fetch.RequestPaused,
401
+ lambda event: asyncio.create_task(req_paused(event)),
402
+ )
403
+
404
+ tab.add_handler(
405
+ cdp.fetch.AuthRequired,
406
+ lambda event: asyncio.create_task(auth_challenge_handler(event)),
407
+ )
408
+
409
+ await tab.send(cdp.fetch.enable(handle_auth_requests=True))
410
+
381
411
  def __getattr__(self, item):
382
412
  """:meta private:"""
383
413
  try:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.38.3
3
+ Version: 4.39.1
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
@@ -106,7 +106,8 @@ Requires-Dist: trio-websocket==0.12.2
106
106
  Requires-Dist: wsproto==1.2.0
107
107
  Requires-Dist: websocket-client==1.8.0
108
108
  Requires-Dist: selenium==4.27.1; python_version < "3.9"
109
- Requires-Dist: selenium==4.32.0; python_version >= "3.9"
109
+ Requires-Dist: selenium==4.32.0; python_version >= "3.9" and python_version < "3.10"
110
+ Requires-Dist: selenium==4.33.0; python_version >= "3.10"
110
111
  Requires-Dist: cssselect==1.2.0; python_version < "3.9"
111
112
  Requires-Dist: cssselect==1.3.0; python_version >= "3.9"
112
113
  Requires-Dist: sortedcontainers==2.4.0
@@ -120,7 +121,8 @@ Requires-Dist: pytest-metadata==3.1.1
120
121
  Requires-Dist: pytest-ordering==0.6
121
122
  Requires-Dist: pytest-rerunfailures==14.0; python_version < "3.9"
122
123
  Requires-Dist: pytest-rerunfailures==15.1; python_version >= "3.9"
123
- Requires-Dist: pytest-xdist==3.6.1
124
+ Requires-Dist: pytest-xdist==3.6.1; python_version < "3.9"
125
+ Requires-Dist: pytest-xdist==3.7.0; python_version >= "3.9"
124
126
  Requires-Dist: parameterized==0.9.0
125
127
  Requires-Dist: behave==1.2.6
126
128
  Requires-Dist: soupsieve==2.7
@@ -136,7 +138,7 @@ Requires-Dist: allure-python-commons>=2.13.5; extra == "allure"
136
138
  Requires-Dist: allure-behave>=2.13.5; extra == "allure"
137
139
  Provides-Extra: coverage
138
140
  Requires-Dist: coverage>=7.6.1; python_version < "3.9" and extra == "coverage"
139
- Requires-Dist: coverage>=7.8.1; python_version >= "3.9" and extra == "coverage"
141
+ Requires-Dist: coverage>=7.8.2; python_version >= "3.9" and extra == "coverage"
140
142
  Requires-Dist: pytest-cov>=5.0.0; python_version < "3.9" and extra == "coverage"
141
143
  Requires-Dist: pytest-cov>=6.1.1; python_version >= "3.9" and extra == "coverage"
142
144
  Provides-Extra: flake8
@@ -157,7 +159,7 @@ Provides-Extra: pdfminer
157
159
  Requires-Dist: pdfminer.six==20250324; python_version < "3.9" and extra == "pdfminer"
158
160
  Requires-Dist: pdfminer.six==20250506; python_version >= "3.9" and extra == "pdfminer"
159
161
  Requires-Dist: cryptography==39.0.2; python_version < "3.9" and extra == "pdfminer"
160
- Requires-Dist: cryptography==45.0.2; python_version >= "3.9" and extra == "pdfminer"
162
+ Requires-Dist: cryptography==45.0.3; python_version >= "3.9" and extra == "pdfminer"
161
163
  Requires-Dist: cffi==1.17.1; extra == "pdfminer"
162
164
  Requires-Dist: pycparser==2.22; extra == "pdfminer"
163
165
  Provides-Extra: pillow
@@ -3,10 +3,10 @@ sbase/__main__.py,sha256=G0bVB1-DM4PGwQ1KyOupaWCs4ePbChZNNWuX2htim5U,647
3
3
  sbase/steps.py,sha256=_WvAjydKqZfTdnZW9LPKkRty-g-lfdUPmLqnZj6ulcs,43013
4
4
  seleniumbase/__init__.py,sha256=JFEY9P5QJqsa1M6ghzLMH2eIPQyh85iglCaQwg8Y8z4,2498
5
5
  seleniumbase/__main__.py,sha256=dn1p6dgCchmcH1zzTzzQvFwwdQQqnTGH6ULV9m4hv24,654
6
- seleniumbase/__version__.py,sha256=yES8EmUkIFb8NQimY5PDyFOPmtf58Bah5sKLqF3tO8M,46
6
+ seleniumbase/__version__.py,sha256=bj46m18MZVWgWtHoBUoAWE_nY0f7HF4ab-r22nf_9_E,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
- seleniumbase/behave/behave_sb.py,sha256=qQF85LoohJBfrPK5ZcPi50v-pWtOrC9qcN1B3Ki_3tY,59401
9
+ seleniumbase/behave/behave_sb.py,sha256=bbbfa8ID6nMnmrVJ7G-014uOj5PE4B8IROZB2WXSQ8I,59172
10
10
  seleniumbase/behave/steps.py,sha256=8-N-NB2tnDsxaP4LSg-uSBgbwZYMS6ZEL1oggO1PCoU,390
11
11
  seleniumbase/common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  seleniumbase/common/decorators.py,sha256=DYdjtF8Y7YJj0JS33WtmsIn4yddPoniNwcPyrgt522o,7857
@@ -21,22 +21,22 @@ seleniumbase/config/settings.py,sha256=cAMmoFBQ6g8GCJIsRsSwGsP1_fJxhADxjHq30lFB1
21
21
  seleniumbase/console_scripts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  seleniumbase/console_scripts/logo_helper.py,sha256=ZqS9TAwpcu5mM5ll-a0wTbXLs2Sbcsyo3EoC4jwtnME,2927
23
23
  seleniumbase/console_scripts/rich_helper.py,sha256=U_zvXpalxVV8rtg8c8EnNNmnh45tii3AV5ZV3O3KbGA,2234
24
- seleniumbase/console_scripts/run.py,sha256=6Q9kbpOY40kTczcQVrD-x6thb3QO9-2wfse7DpL3Hik,59052
25
- seleniumbase/console_scripts/sb_behave_gui.py,sha256=3Zl7_QQczvkkQW_UuaqYEUlEjiZ6AJzHR9GeNyVVXkc,15147
26
- seleniumbase/console_scripts/sb_caseplans.py,sha256=qlmvjQ49bOBE1Q29fVmabimkVibCVr25GNtJhFPTMrc,18145
27
- seleniumbase/console_scripts/sb_commander.py,sha256=exQGKzqRAoGqRmQtDmlmoHnSG9eSy9eh8HVy-tXw6s4,13343
24
+ seleniumbase/console_scripts/run.py,sha256=scHfo8Zf6F7ABAGBiKHF-Vv7MOrB6qU75RRiywjDYEg,58672
25
+ seleniumbase/console_scripts/sb_behave_gui.py,sha256=CX5dTIIptsaR1xLVy53DM6haV_mIc3kYALUkkhAkfRI,14888
26
+ seleniumbase/console_scripts/sb_caseplans.py,sha256=C_vhATSa9dEDOSmHT9uk64ebkXcqM5uu8Y1S3LjATkc,17875
27
+ seleniumbase/console_scripts/sb_commander.py,sha256=Ejal4WhnMSTLcykCT04jmMuH_fvDrfIAoxoJ23LclAM,13084
28
28
  seleniumbase/console_scripts/sb_install.py,sha256=PUVOlajP43t0tf7fDLntYdOMGN4Ez7K5aDgXyyIZYYk,55662
29
29
  seleniumbase/console_scripts/sb_mkchart.py,sha256=ep9g-9CSIwaOJKVxhB3xjRQpfsuApyN8-Dr129cNXwQ,10941
30
30
  seleniumbase/console_scripts/sb_mkdir.py,sha256=iFN6ZMOgmH_GAvEuvzYltWuYiS3PRFQcL5fJIj1yX_Y,30897
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=PrizjTmyrROYPO0yDm-zQS3QSfsZNeAmcJKKUvfgLhc,11966
33
+ seleniumbase/console_scripts/sb_mkrec.py,sha256=E268227Q75ZHP1rGFoIY_6i6FzGxD_kWmKm7QMntpW4,12012
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=fnHb5-kh11Hit-E9Ha-e4QXzqLcZvtij6mb5qNd4B1Q,11032
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=8t9wHj7hiGrTC3SHlPi7AhTAX8y9XnV5Y6bgLWFkuVE,241559
39
+ seleniumbase/core/browser_launcher.py,sha256=WD-m3IOJ2spaYelEn29bTpAOYUs9mIlCBIg7m7MZrII,242804
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
@@ -45,7 +45,7 @@ seleniumbase/core/download_helper.py,sha256=qSR54kQISucF4RQaLCOuuerSu6DR41juGi_3
45
45
  seleniumbase/core/encoded_images.py,sha256=rDKJ4cNJSuKiRcFViYU7bjyTS9_moI57gUPRXVg3u2k,14209
46
46
  seleniumbase/core/jqc_helper.py,sha256=2DDQr9Q2jSSZqFzX588jLlUM9oJvyrRWq2aORSIPUdI,10322
47
47
  seleniumbase/core/log_helper.py,sha256=SW8wx2f2HfU3ERbANjxEC-jDbjy_IzaNYRKPlayfRRI,23442
48
- seleniumbase/core/mysql.py,sha256=8Fzj3p5dhtDWfMpFqFYxpSwa9s1UltiHsWJ56_aPOqk,3993
48
+ seleniumbase/core/mysql.py,sha256=X1McqBWCzN9DndyBbNrVg9_kvtaByVhodiXYkGbn36A,3955
49
49
  seleniumbase/core/proxy_helper.py,sha256=pZ1NboNfziHU3vWZLOZLX-qkfM3oKSnpc3omQf9EUQQ,8809
50
50
  seleniumbase/core/recorder_helper.py,sha256=fNGjbapXmEsht54x1o6Igk198QdnPxDDnjUOzQxNhNQ,25055
51
51
  seleniumbase/core/report_helper.py,sha256=AIl6Qava2yW1uSzbLpJBlPlYDz0KE-rVhogh8hsGWBo,12201
@@ -54,18 +54,18 @@ seleniumbase/core/sb_cdp.py,sha256=zgkVXOhwf94NGdsUO0eM8yVUS3s5FzSuAPJNsz3lrZo,8
54
54
  seleniumbase/core/sb_driver.py,sha256=yvTDRblBzG6bDX7XcLiAA6QcBelSJj_HHL_04lcfeeE,13760
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
57
- seleniumbase/core/style_sheet.py,sha256=QsfTBtgedfM3uTqgxtd53bhq202p9fwLMbFl9mPZgVg,11892
57
+ seleniumbase/core/style_sheet.py,sha256=5qYN5GLk4gkwg7nqp3h0XH5YXRijANzKDuEdalzccuw,11714
58
58
  seleniumbase/core/testcase_manager.py,sha256=TblCfo8Zfap1Bayip-qTu9gqT-KALSwXAX4awBpnEHg,4633
59
59
  seleniumbase/core/tour_helper.py,sha256=kj2cz-DGKlw9SX3tWnVp-snpk6Flvqj81-xmKdKDtg0,42555
60
- seleniumbase/core/visual_helper.py,sha256=Dj5iJKw-bT_3e6KDqMf0sJi7xs_D96yqLcNc8fqhrjI,3408
60
+ seleniumbase/core/visual_helper.py,sha256=HxPOulfEebc9ZSwe7E-nSQJ12N2l4vhqUQubLvE2QQw,3227
61
61
  seleniumbase/drivers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
62
62
  seleniumbase/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
63
63
  seleniumbase/extensions/ad_block.zip,sha256=LTlaOYUs6a1Zu4op64pLoDEqYKJb8zHq_Y0PsBIIqCk,1454
64
64
  seleniumbase/extensions/disable_csp.zip,sha256=5RvomXnm2PdivUVcxTV6jfvD8WhTEsQYHaQZe7nk9Yc,20014
65
- seleniumbase/extensions/recorder.zip,sha256=OOyzF-Ize2cSRu1CqhzSAq5vusI9hqLLd2OIApUHesI,11918
65
+ seleniumbase/extensions/recorder.zip,sha256=JEE_FVEvlS63cFQbVLEroIyPSS91nWCDL0MhjVrmIpk,11813
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=D5UuI8vHaZKYkVBQb_49NZXsLHDBsyF6SOQ76s5biSE,726962
68
+ seleniumbase/fixtures/base_case.py,sha256=zlF10aFjJdRUS6nT9ksvcXPdyD7A_mlFyAgEuQkVRj4,727097
69
69
  seleniumbase/fixtures/constants.py,sha256=WMrItuNyKq3XVJ64NluLIRc4gJCxDw8K8qXED0b9S2w,13752
70
70
  seleniumbase/fixtures/css_to_xpath.py,sha256=9ouDB1xl4MJ2os6JOgTIAyHKOQfuxtxvXC3O5hSnEKA,1954
71
71
  seleniumbase/fixtures/errors.py,sha256=KyxuEVx_e3MPhVrJfNIa_3ltMpbCFxfy_jxK8RFNTns,555
@@ -115,10 +115,10 @@ seleniumbase/undetected/reactor.py,sha256=NropaXcO54pzmDq6quR27qPJxab6636H7LRAaq
115
115
  seleniumbase/undetected/webelement.py,sha256=OOpUYbEiOG52KsYYyuDW9tYLdA2SMnukvwQHUdPVn9E,1389
116
116
  seleniumbase/undetected/cdp_driver/__init__.py,sha256=Ga9alwuaZZy4_XOShc0HjgFnNqpPdrcbjAicz5gE7a4,215
117
117
  seleniumbase/undetected/cdp_driver/_contradict.py,sha256=lP4b0h5quAy573ETn_TBbYV889cL1AuPLVInpJ0ZkiU,3183
118
- seleniumbase/undetected/cdp_driver/browser.py,sha256=9JGyDIQftCY-u3ega6gO5PTSxkHs7x9ykJszCdyugLo,32814
119
- seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=c4z2ltGeAKoLE8eyviJUxEM1GWK22qKPRDalVZcTuXQ,24357
120
- seleniumbase/undetected/cdp_driver/config.py,sha256=t8KV1Vqa5SQRBq3-gjkHHmj9h85AplAM01asO3AWufs,12507
121
- seleniumbase/undetected/cdp_driver/connection.py,sha256=d5G4MkCaDCv8ErtOCPB5hnr18kIZMuaGx8o0DKS0HNY,24559
118
+ seleniumbase/undetected/cdp_driver/browser.py,sha256=EQJNg8RBBg82rJiyyo3BDpZzViqyCrnA-pnLxhpg45g,34382
119
+ seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=Pjyfx4NZJ4sjRHxXjZWOvKvgki3RIJx8p4j1tCAjOpE,24868
120
+ seleniumbase/undetected/cdp_driver/config.py,sha256=4-nUkEf7JSuOdFMNd6XmJnFucZrA59-kH1FUMxDcgFU,12561
121
+ seleniumbase/undetected/cdp_driver/connection.py,sha256=DbySOlk5mQnbWtz9SOQvEDYp9ws7ZOjz2HRCARXR-dk,25649
122
122
  seleniumbase/undetected/cdp_driver/element.py,sha256=FIC6v7OmumLCT-_vIc3H4oju_oBbaLpWJUJIKm2c_q4,40467
123
123
  seleniumbase/undetected/cdp_driver/tab.py,sha256=t7Ucn0pmm7imwdCM-5KmIJNU2MCeMuIl6G3T2VMrbxU,53170
124
124
  seleniumbase/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -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.38.3.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
- seleniumbase-4.38.3.dist-info/METADATA,sha256=Gpf1Nwx7FSwxCppzt5zbTiLDTlklDLR3kSLrpzHW9As,87036
140
- seleniumbase-4.38.3.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
141
- seleniumbase-4.38.3.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
- seleniumbase-4.38.3.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
- seleniumbase-4.38.3.dist-info/RECORD,,
138
+ seleniumbase-4.39.1.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
+ seleniumbase-4.39.1.dist-info/METADATA,sha256=mouLj0Wi78TD1BfpXwhjXZ15pNjBBFwDaMXB0bHy5dg,87206
140
+ seleniumbase-4.39.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
141
+ seleniumbase-4.39.1.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
+ seleniumbase-4.39.1.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
+ seleniumbase-4.39.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5