3737
3838
3939async def _ensure_awaitable_callback_result (callback_function , result ):
40- if callable (callback_function ):
40+ if callback_function and callable (callback_function ):
4141 callback_result = callback_function (result )
4242 else :
4343 return result
@@ -272,14 +272,15 @@ def __init__(self,
272272 self ._closed = False
273273 self ._message_id = 0
274274 self .ws = None
275- self .default_recv_callback = default_recv_callback
276275 self ._recv_daemon_break_callback = _recv_daemon_break_callback or self ._RECV_DAEMON_BREAK_CALLBACK
277276 if self .chrome :
278277 self .req = self .chrome .req
279278 else :
280279 self .req = Requests ()
281280 self ._listener = Listener ()
282281 self ._enabled_domains : Set [str ] = set ()
282+ self ._default_recv_callback : List [Callable ] = []
283+ self .default_recv_callback = default_recv_callback
283284
284285 def __hash__ (self ):
285286 return self .tab_id
@@ -306,6 +307,27 @@ def ensure_timeout(self, timeout):
306307 else :
307308 return timeout
308309
310+ @property
311+ def default_recv_callback (self ):
312+ return self ._default_recv_callback or []
313+
314+ @default_recv_callback .setter
315+ def default_recv_callback (self , value ):
316+ if not value :
317+ self ._default_recv_callback = []
318+ elif isinstance (value , list ):
319+ self ._default_recv_callback = value
320+ elif callable (value ):
321+ self ._default_recv_callback = [value ]
322+ else :
323+ raise ValueError (
324+ 'default_recv_callback should be list or callable, and you can use tab.default_recv_callback.append(cb) to add new callback'
325+ )
326+
327+ @default_recv_callback .deleter
328+ def default_recv_callback (self ):
329+ self ._default_recv_callback = []
330+
309331 async def close_browser (self , timeout = 0 ):
310332 return await self .send ('Browser.close' , timeout = timeout )
311333
@@ -405,8 +427,9 @@ async def _recv_daemon(self):
405427 logger .debug (
406428 f'[json] data_str can not be json.loads: { data_str } ' )
407429 continue
408- await _ensure_awaitable_callback_result (self .default_recv_callback ,
409- data_dict )
430+ for cb in self .default_recv_callback :
431+ asyncio .ensure_future (
432+ _ensure_awaitable_callback_result (cb , data_dict ))
410433 f = self ._listener .find_future (data_dict )
411434 if f :
412435 if f ._state == _PENDING :
@@ -1008,7 +1031,9 @@ async def setBlockedURLs(self, urls: List[str], timeout=NotSet):
10081031
10091032 """
10101033 await self .enable ('Network' )
1011- return await self .send ('Network.setBlockedURLs' , urls = urls , timeout = timeout )
1034+ return await self .send ('Network.setBlockedURLs' ,
1035+ urls = urls ,
1036+ timeout = timeout )
10121037
10131038 async def set_url (self ,
10141039 url : Optional [str ] = None ,
0 commit comments