seleniumbase 4.37.7__py3-none-any.whl → 4.37.8__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.37.7"
2
+ __version__ = "4.37.8"
@@ -546,12 +546,15 @@ def uc_open_with_cdp_mode(driver, url=None):
546
546
  headless = False
547
547
  headed = None
548
548
  xvfb = None
549
+ binary_location = None
549
550
  if hasattr(sb_config, "headless"):
550
551
  headless = sb_config.headless
551
552
  if hasattr(sb_config, "headed"):
552
553
  headed = sb_config.headed
553
554
  if hasattr(sb_config, "xvfb"):
554
555
  xvfb = sb_config.xvfb
556
+ if hasattr(sb_config, "binary_location"):
557
+ binary_location = sb_config.binary_location
555
558
 
556
559
  loop = asyncio.new_event_loop()
557
560
  asyncio.set_event_loop(loop)
@@ -562,6 +565,7 @@ def uc_open_with_cdp_mode(driver, url=None):
562
565
  headless=headless,
563
566
  headed=headed,
564
567
  xvfb=xvfb,
568
+ browser_executable_path=binary_location,
565
569
  )
566
570
  )
567
571
  loop.run_until_complete(driver.cdp_base.wait(0))
@@ -1234,7 +1234,8 @@ def SB(
1234
1234
  sb._has_failure = False # This may change
1235
1235
 
1236
1236
  with suppress(Exception):
1237
- stack_base = traceback.format_stack()[0].split(os.sep)[-1]
1237
+ stack_base = traceback.format_stack()[0].split("with SB(")[0]
1238
+ stack_base = stack_base.split(os.sep)[-1]
1238
1239
  test_base = stack_base.split(", in ")[0]
1239
1240
  filename = test_base.split('"')[0]
1240
1241
  methodname = ".line_" + test_base.split(", line ")[-1]
@@ -1251,7 +1252,8 @@ def SB(
1251
1252
  c1 = colorama.Fore.GREEN
1252
1253
  b1 = colorama.Style.BRIGHT
1253
1254
  cr = colorama.Style.RESET_ALL
1254
- stack_base = traceback.format_stack()[0].split(os.sep)[-1]
1255
+ stack_base = traceback.format_stack()[0].split("with SB(")[0]
1256
+ stack_base = stack_base.split(os.sep)[-1]
1255
1257
  test_name = stack_base.split(", in ")[0].replace('", line ', ":")
1256
1258
  test_name += ":SB"
1257
1259
  start_text = "=== {%s} starts ===" % test_name
@@ -46,9 +46,8 @@ def deconstruct_browser():
46
46
  logger.debug(
47
47
  "Problem removing data dir %s\n"
48
48
  "Consider checking whether it's there "
49
- "and remove it by hand\nerror: %s",
50
- _.config.user_data_dir,
51
- e,
49
+ "and remove it by hand\nerror: %s"
50
+ % (_.config.user_data_dir, e)
52
51
  )
53
52
  break
54
53
  time.sleep(0.15)
@@ -190,7 +189,7 @@ class Browser:
190
189
 
191
190
  sleep = wait
192
191
  """Alias for wait"""
193
- def _handle_target_update(
192
+ async def _handle_target_update(
194
193
  self,
195
194
  event: Union[
196
195
  cdp.target.TargetInfoChanged,
@@ -224,21 +223,21 @@ class Browser:
224
223
  current_tab.target = target_info
225
224
  elif isinstance(event, cdp.target.TargetCreated):
226
225
  target_info: cdp.target.TargetInfo = event.target_info
227
- from .tab import Tab
228
-
229
- new_target = Tab(
230
- (
231
- f"ws://{self.config.host}:{self.config.port}"
232
- f"/devtools/{target_info.type_ or 'page'}"
233
- f"/{target_info.target_id}"
234
- ),
235
- target=target_info,
236
- browser=self,
237
- )
238
- self.targets.append(new_target)
239
- logger.debug(
240
- "Target #%d created => %s", len(self.targets), new_target
226
+ websocket_url = (
227
+ f"ws://{self.config.host}:{self.config.port}"
228
+ f"/devtools/{target_info.type_ or 'page'}"
229
+ f"/{target_info.target_id}"
241
230
  )
231
+ async with tab.Tab(
232
+ websocket_url=websocket_url,
233
+ target=target_info,
234
+ browser=self
235
+ ) as new_target:
236
+ self.targets.append(new_target)
237
+ logger.debug(
238
+ "Target #%d created => %s"
239
+ % (len(self.targets), new_target)
240
+ )
242
241
  elif isinstance(event, cdp.target.TargetDestroyed):
243
242
  current_tab = next(
244
243
  filter(
@@ -287,62 +286,42 @@ class Browser:
287
286
  connection: tab.Tab = next(
288
287
  filter(lambda item: item.type_ == "page", self.targets)
289
288
  )
290
- if hasattr(sb_config, "_cdp_locale") and sb_config._cdp_locale:
291
- await connection.send(cdp.page.navigate("about:blank"))
292
- if (
293
- hasattr(sb_config, "_cdp_user_agent")
294
- and sb_config._cdp_user_agent
295
- ):
296
- pass
297
- elif (
298
- hasattr(sb_config, "_cdp_platform")
299
- and sb_config._cdp_platform
300
- ):
301
- pass
302
- else:
303
- await connection.set_locale(sb_config._cdp_locale)
304
- if hasattr(sb_config, "_cdp_timezone") and sb_config._cdp_timezone:
305
- await connection.send(cdp.page.navigate("about:blank"))
306
- await connection.set_timezone(sb_config._cdp_timezone)
289
+ _cdp_timezone = None
290
+ _cdp_user_agent = ""
291
+ _cdp_locale = None
292
+ _cdp_platform = None
293
+ _cdp_geolocation = None
294
+ if (
295
+ hasattr(sb_config, "_cdp_timezone") and sb_config._cdp_timezone
296
+ ):
297
+ _cdp_timezone = sb_config._cdp_timezone
307
298
  if (
308
299
  hasattr(sb_config, "_cdp_user_agent")
309
300
  and sb_config._cdp_user_agent
310
301
  ):
311
- await connection.send(cdp.page.navigate("about:blank"))
312
- if hasattr(sb_config, "_cdp_locale") and sb_config._cdp_locale:
313
- _cdp_platform = None
314
- if (
315
- hasattr(sb_config, "_cdp_platform")
316
- and sb_config._cdp_platform
317
- ):
318
- _cdp_platform = sb_config._cdp_platform
319
- await connection.set_user_agent(
320
- sb_config._cdp_user_agent,
321
- sb_config._cdp_locale,
322
- _cdp_platform,
323
- )
324
- else:
325
- await connection.set_user_agent(sb_config._cdp_user_agent)
326
- elif (
327
- hasattr(sb_config, "_cdp_platform") and sb_config._cdp_platform
328
- ):
329
- await connection.send(cdp.page.navigate("about:blank"))
330
- if hasattr(sb_config, "_cdp_locale") and sb_config._cdp_locale:
331
- _cdp_platform = sb_config._cdp_platform
332
- await connection.set_user_agent(
333
- accept_language=sb_config._cdp_locale,
334
- platform=_cdp_platform,
335
- )
336
- else:
337
- await connection.set_user_agent(
338
- platform=sb_config._cdp_platform
339
- )
302
+ _cdp_user_agent = sb_config._cdp_user_agent
303
+ if hasattr(sb_config, "_cdp_locale") and sb_config._cdp_locale:
304
+ _cdp_locale = sb_config._cdp_locale
305
+ if hasattr(sb_config, "_cdp_platform") and sb_config._cdp_platform:
306
+ _cdp_platform = sb_config._cdp_platform
340
307
  if (
341
308
  hasattr(sb_config, "_cdp_geolocation")
342
309
  and sb_config._cdp_geolocation
343
310
  ):
311
+ _cdp_geolocation = sb_config._cdp_geolocation
312
+ if _cdp_timezone:
313
+ await connection.send(cdp.page.navigate("about:blank"))
314
+ await connection.set_timezone(_cdp_timezone)
315
+ if _cdp_user_agent or _cdp_locale or _cdp_platform:
316
+ await connection.send(cdp.page.navigate("about:blank"))
317
+ await connection.set_user_agent(
318
+ user_agent=_cdp_user_agent,
319
+ accept_language=_cdp_locale,
320
+ platform=_cdp_platform,
321
+ )
322
+ if _cdp_geolocation:
344
323
  await connection.send(cdp.page.navigate("about:blank"))
345
- await connection.set_geolocation(sb_config._cdp_geolocation)
324
+ await connection.set_geolocation(_cdp_geolocation)
346
325
  # Use the tab to navigate to new url
347
326
  frame_id, loader_id, *_ = await connection.send(
348
327
  cdp.page.navigate(url)
@@ -376,8 +355,8 @@ class Browser:
376
355
  self.config.port = util.free_port()
377
356
  if not connect_existing:
378
357
  logger.debug(
379
- "BROWSER EXECUTABLE PATH: %s",
380
- self.config.browser_executable_path,
358
+ "BROWSER EXECUTABLE PATH: %s"
359
+ % self.config.browser_executable_path,
381
360
  )
382
361
  if not pathlib.Path(self.config.browser_executable_path).exists():
383
362
  raise FileNotFoundError(
@@ -782,10 +761,8 @@ class CookieJar:
782
761
  for cookie in cookies:
783
762
  for match in pattern.finditer(str(cookie.__dict__)):
784
763
  logger.debug(
785
- "Saved cookie for matching pattern '%s' => (%s: %s)",
786
- pattern.pattern,
787
- cookie.name,
788
- cookie.value,
764
+ "Saved cookie for matching pattern '%s' => (%s: %s)"
765
+ % (pattern.pattern, cookie.name, cookie.value)
789
766
  )
790
767
  included_cookies.append(cookie)
791
768
  break
@@ -822,10 +799,8 @@ class CookieJar:
822
799
  for match in pattern.finditer(str(cookie.__dict__)):
823
800
  included_cookies.append(cookie)
824
801
  logger.debug(
825
- "Loaded cookie for matching pattern '%s' => (%s: %s)",
826
- pattern.pattern,
827
- cookie.name,
828
- cookie.value,
802
+ "Loaded cookie for matching pattern '%s' => (%s: %s)"
803
+ % (pattern.pattern, cookie.name, cookie.value)
829
804
  )
830
805
  break
831
806
  await connection.send(cdp.network.set_cookies(included_cookies))
@@ -325,6 +325,11 @@ async def start(
325
325
  ad_block_dir = os.path.join(DOWNLOADS_FOLDER, "ad_block")
326
326
  __unzip_to_new_folder(ad_block_zip, ad_block_dir)
327
327
  extension_dir = __add_chrome_ext_dir(extension_dir, ad_block_dir)
328
+ if (
329
+ "binary_location" in kwargs
330
+ and not browser_executable_path
331
+ ):
332
+ browser_executable_path = kwargs["binary_location"]
328
333
  if not config:
329
334
  config = Config(
330
335
  user_data_dir,
@@ -6,6 +6,7 @@ import logging
6
6
  import pathlib
7
7
  import urllib.parse
8
8
  import warnings
9
+ from seleniumbase import config as sb_config
9
10
  from typing import Dict, List, Union, Optional, Tuple
10
11
  from . import browser as cdp_browser
11
12
  from . import element
@@ -137,6 +138,14 @@ class Tab(Connection):
137
138
  self._dom = None
138
139
  self._window_id = None
139
140
 
141
+ async def __aenter__(self):
142
+ return self
143
+
144
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
145
+ await self.aclose()
146
+ if exc_type and exc_val:
147
+ raise exc_type(exc_val)
148
+
140
149
  @property
141
150
  def inspector_url(self):
142
151
  """
@@ -348,7 +357,12 @@ class Tab(Connection):
348
357
  if new_window and not new_tab:
349
358
  new_tab = True
350
359
  if new_tab:
351
- return await self.browser.get(url, new_tab, new_window)
360
+ if hasattr(sb_config, "incognito") and sb_config.incognito:
361
+ return await self.browser.get(
362
+ url, new_tab=False, new_window=True
363
+ )
364
+ else:
365
+ return await self.browser.get(url, new_tab, new_window)
352
366
  else:
353
367
  frame_id, loader_id, *_ = await self.send(cdp.page.navigate(url))
354
368
  await self
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: seleniumbase
3
- Version: 4.37.7
3
+ Version: 4.37.8
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,13 +59,14 @@ 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>=25.0.1
62
+ Requires-Dist: pip>=25.0.1; python_version < "3.9"
63
+ Requires-Dist: pip>=25.1; python_version >= "3.9"
63
64
  Requires-Dist: packaging>=25.0
64
65
  Requires-Dist: setuptools~=70.2; python_version < "3.10"
65
- Requires-Dist: setuptools>=79.0.1; python_version >= "3.10"
66
+ Requires-Dist: setuptools>=80.0.0; python_version >= "3.10"
66
67
  Requires-Dist: wheel>=0.45.1
67
68
  Requires-Dist: attrs>=25.3.0
68
- Requires-Dist: certifi>=2025.1.31
69
+ Requires-Dist: certifi>=2025.4.26
69
70
  Requires-Dist: exceptiongroup>=1.2.2
70
71
  Requires-Dist: websockets~=13.1; python_version < "3.9"
71
72
  Requires-Dist: websockets>=15.0.1; python_version >= "3.9"
@@ -3,7 +3,7 @@ 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=ZU4HNYoq3elduI1j6IgiPolitwipkaMBnUux0Mq5m68,46
6
+ seleniumbase/__version__.py,sha256=V58urCObAfon7OXV-6PlzXfY_nvnJAlueUECpoey6BA,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=qQF85LoohJBfrPK5ZcPi50v-pWtOrC9qcN1B3Ki_3tY,59401
@@ -36,7 +36,7 @@ seleniumbase/console_scripts/sb_print.py,sha256=tNy-bMDgwHJO3bZxMpmo9weSE8uhbH0C
36
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=H8CVjbO6M43op-sCNakek8NYBdZnc3FC1ekGtj-I6oI,239787
39
+ seleniumbase/core/browser_launcher.py,sha256=Jy-F1k45yxSW4-Io403zEOgoGgZg2ZLsHLYSh7VTKgs,239965
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
@@ -90,7 +90,7 @@ seleniumbase/plugins/driver_manager.py,sha256=1l4fxISvGV62gfDxp3yfYE2zz4WKJFLE0t
90
90
  seleniumbase/plugins/page_source.py,sha256=loTnXxOj4kxEukuTZEiGyvKBhY3KDVDMnNlHHheTBDE,1889
91
91
  seleniumbase/plugins/pytest_plugin.py,sha256=952AIyaH-PdmNksoeXjzhXxoc8Z53yV-WPjlrHhp2OM,108382
92
92
  seleniumbase/plugins/s3_logging_plugin.py,sha256=WDfertQgGOW_SRJpFMaekYD6vBVW9VO62POtXXy2HCM,2319
93
- seleniumbase/plugins/sb_manager.py,sha256=IMUACNzz3Jz0F8YNr6MzX3nO_cEG9YQVzXc8X6PNiZY,57530
93
+ seleniumbase/plugins/sb_manager.py,sha256=LkqdnOUAVY0d6Pa2k0jRHGtLkMUTrM5-2FF5nqnORtY,57636
94
94
  seleniumbase/plugins/screen_shots.py,sha256=1hrXw-hzuZ1BR6Yh7AyWX2ABnvnP73-RCbwdz958gj4,1127
95
95
  seleniumbase/plugins/selenium_plugin.py,sha256=y0eNco8T4KgGLProLPHPLw479QH5lRms4wqwOnTgkSc,60081
96
96
  seleniumbase/resources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -115,12 +115,12 @@ 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=5nlLQE58JvwooyUVAXQMosr6C-vj2iSpzyldnLZCnLM,32914
119
- seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=MhiRNf49G_Ee6JkslES-WegTfY2U4uSS3hTNP-GlcGc,23807
118
+ seleniumbase/undetected/cdp_driver/browser.py,sha256=zhdHeUDXsJpLzLS72SLT-cAdrU1Tf4TE4prQN-wpdC0,31905
119
+ seleniumbase/undetected/cdp_driver/cdp_util.py,sha256=3DhxoMwn0kXCz0QBYKEzLlyrztYeu-2HkyVCmg6sq64,23964
120
120
  seleniumbase/undetected/cdp_driver/config.py,sha256=t8KV1Vqa5SQRBq3-gjkHHmj9h85AplAM01asO3AWufs,12507
121
121
  seleniumbase/undetected/cdp_driver/connection.py,sha256=jccGcDt-TqgknvMNQYpRbhrSMC_74tYs-9YH1NK5UGU,24572
122
122
  seleniumbase/undetected/cdp_driver/element.py,sha256=FIC6v7OmumLCT-_vIc3H4oju_oBbaLpWJUJIKm2c_q4,40467
123
- seleniumbase/undetected/cdp_driver/tab.py,sha256=bxkCFKDejQ1xKsX3740RvvrYfC4OBv1mlQ4yWJM6As4,52260
123
+ seleniumbase/undetected/cdp_driver/tab.py,sha256=7zyOFczrRHY-kQhUSl8--luKr4ZMG7F7yzXzeC-WXqY,52743
124
124
  seleniumbase/utilities/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
125
125
  seleniumbase/utilities/selenium_grid/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
126
126
  seleniumbase/utilities/selenium_grid/download_selenium_server.py,sha256=ZdoInIbhtmdKCIPxxtJHhd2sqotqcNXWMYbwWrkh9O0,1727
@@ -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.37.7.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
- seleniumbase-4.37.7.dist-info/METADATA,sha256=62USFVvtKAkiB_nfh6y_ms0lcAW1cl-DQyy-oU2j_qs,86879
140
- seleniumbase-4.37.7.dist-info/WHEEL,sha256=SmOxYU7pzNKBqASvQJ7DjX3XGUF92lrGhMb3R6_iiqI,91
141
- seleniumbase-4.37.7.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
- seleniumbase-4.37.7.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
- seleniumbase-4.37.7.dist-info/RECORD,,
138
+ seleniumbase-4.37.8.dist-info/licenses/LICENSE,sha256=BRblZsX7HyPUjQmYTiyWr_e9tzWvmR3R4SFclM2R3W0,1085
139
+ seleniumbase-4.37.8.dist-info/METADATA,sha256=fQ_267nDHyMhbJU6z1QsU6ZIpt0RLAnDkcS7CpRIJiw,86953
140
+ seleniumbase-4.37.8.dist-info/WHEEL,sha256=ck4Vq1_RXyvS4Jt6SI0Vz6fyVs4GWg7AINwpsaGEgPE,91
141
+ seleniumbase-4.37.8.dist-info/entry_points.txt,sha256=CNrh2EKNaHYEhO6pP1RJyVLB99LkDDYX7TnUK8xfjqk,623
142
+ seleniumbase-4.37.8.dist-info/top_level.txt,sha256=4N97aBOQ8ETCnDnokBsWb07lJfTaq3C1ZzYRxvLMxqU,19
143
+ seleniumbase-4.37.8.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (79.0.1)
2
+ Generator: setuptools (80.0.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5