@@ -499,14 +499,18 @@ async def __anext__(self):
499
499
def add_next_symbol (self , next_symbol ):
500
500
self .next_symbol .append (next_symbol )
501
501
502
- async def _async_render (self , * , url : str , script : str = None , scrolldown , sleep : int , wait : float , reload , content : Optional [str ], timeout : Union [float , int ], keep_page : bool ):
502
+ async def _async_render (self , * , url : str , script : str = None , scrolldown , sleep : int , wait : float , reload , content : Optional [str ], timeout : Union [float , int ], keep_page : bool , cookies : list = [{}] ):
503
503
""" Handle page creation and js rendering. Internal use for render/arender methods. """
504
504
try :
505
505
page = await self .browser .newPage ()
506
506
507
507
# Wait before rendering the page, to prevent timeouts.
508
508
await asyncio .sleep (wait )
509
509
510
+ if cookies :
511
+ for cookie in cookies :
512
+ await page .setCookie (cookie )
513
+
510
514
# Load the given page (GET request, obviously.)
511
515
if reload :
512
516
await page .goto (url , options = {'timeout' : int (timeout * 1000 )})
@@ -538,7 +542,60 @@ async def _async_render(self, *, url: str, script: str = None, scrolldown, sleep
538
542
page = None
539
543
return None
540
544
541
- def render (self , retries : int = 8 , script : str = None , wait : float = 0.2 , scrolldown = False , sleep : int = 0 , reload : bool = True , timeout : Union [float , int ] = 8.0 , keep_page : bool = False ):
545
+ def _convert_cookie_to_render (self , session_cookie ):
546
+ """
547
+ Convert HTMLSession.cookies[] for browser.newPage().setCookie
548
+ """
549
+ # | setCookie(self, *cookies:dict) -> None
550
+ # | Set cookies.
551
+ # |
552
+ # | ``cookies`` should be dictionaries which contain these fields:
553
+ # |
554
+ # | * ``name`` (str): **required**
555
+ # | * ``value`` (str): **required**
556
+ # | * ``url`` (str)
557
+ # | * ``domain`` (str)
558
+ # | * ``path`` (str)
559
+ # | * ``expires`` (number): Unix time in seconds
560
+ # | * ``httpOnly`` (bool)
561
+ # | * ``secure`` (bool)
562
+ # | * ``sameSite`` (str): ``'Strict'`` or ``'Lax'``
563
+ cookie_render = {}
564
+ def __convert (cookie , key ):
565
+ try :
566
+ v = eval ("cookie." + key )
567
+ if not v : kv = ''
568
+ else : kv = {key : v }
569
+ except :
570
+ kv = ''
571
+ return kv
572
+
573
+ keys = [
574
+ 'name' ,
575
+ 'value' ,
576
+ 'url' ,
577
+ 'domain' ,
578
+ 'path' ,
579
+ 'sameSite' ,
580
+ 'expires' ,
581
+ 'httpOnly' ,
582
+ 'secure' ,
583
+ ]
584
+ for key in keys :
585
+ cookie_render .update (__convert (session_cookie , key ))
586
+ return cookie_render
587
+
588
+ def _convert_cookies_to_render (self ):
589
+ """
590
+ Convert HTMLSession.cookies for browser.newPage().setCookie
591
+ Return a list of dict
592
+ """
593
+ cookies_render = []
594
+ for cookie in self .session .cookies :
595
+ cookies_render .append (self ._convert_cookie_to_render (cookie ))
596
+ return cookies_render
597
+
598
+ def render (self , retries : int = 8 , script : str = None , wait : float = 0.2 , scrolldown = False , sleep : int = 0 , reload : bool = True , timeout : Union [float , int ] = 8.0 , keep_page : bool = False , cookies : list = [{}], send_cookies_session : bool = False ):
542
599
"""Reloads the response in Chromium, and replaces HTML content
543
600
with an updated version, with JavaScript executed.
544
601
@@ -550,6 +607,9 @@ def render(self, retries: int = 8, script: str = None, wait: float = 0.2, scroll
550
607
:param reload: If ``False``, content will not be loaded from the browser, but will be provided from memory.
551
608
:param keep_page: If ``True`` will allow you to interact with the browser page through ``r.html.page``.
552
609
610
+ :param send_cookies_session: If ``True`` send ``HTMLSession.cookies`` convert.
611
+ :param cookies: If not ``empty`` send ``cookies``.
612
+
553
613
If ``scrolldown`` is specified, the page will scrolldown the specified
554
614
number of times, after sleeping the specified amount of time
555
615
(e.g. ``scrolldown=10, sleep=1``).
@@ -590,12 +650,14 @@ def render(self, retries: int = 8, script: str = None, wait: float = 0.2, scroll
590
650
if self .url == DEFAULT_URL :
591
651
reload = False
592
652
653
+ if send_cookies_session :
654
+ cookies = self ._convert_cookies_to_render ()
593
655
594
656
for i in range (retries ):
595
657
if not content :
596
658
try :
597
659
598
- content , result , page = self .session .loop .run_until_complete (self ._async_render (url = self .url , script = script , sleep = sleep , wait = wait , content = self .html , reload = reload , scrolldown = scrolldown , timeout = timeout , keep_page = keep_page ))
660
+ content , result , page = self .session .loop .run_until_complete (self ._async_render (url = self .url , script = script , sleep = sleep , wait = wait , content = self .html , reload = reload , scrolldown = scrolldown , timeout = timeout , keep_page = keep_page , cookies = cookies ))
599
661
except TypeError :
600
662
pass
601
663
else :
0 commit comments