@@ -645,6 +645,23 @@ def tile_windows(self, windows=None, max_columns=0):
645645 driver .tile_windows (windows , max_columns )
646646 )
647647
648+ def grant_permissions (self , permissions , origin = None ):
649+ """Grant specific permissions to the current window.
650+ Applies to all origins if no origin is specified."""
651+ driver = self .driver
652+ if hasattr (driver , "cdp_base" ):
653+ driver = driver .cdp_base
654+ return self .loop .run_until_complete (
655+ driver .grant_permissions (permissions , origin )
656+ )
657+
658+ def grant_all_permissions (self ):
659+ """Grant all permissions to the current window for all origins."""
660+ driver = self .driver
661+ if hasattr (driver , "cdp_base" ):
662+ driver = driver .cdp_base
663+ return self .loop .run_until_complete (driver .grant_all_permissions ())
664+
648665 def get_all_cookies (self , * args , ** kwargs ):
649666 driver = self .driver
650667 if hasattr (driver , "cdp_base" ):
@@ -681,9 +698,7 @@ def clear_cookies(self):
681698 driver = self .driver
682699 if hasattr (driver , "cdp_base" ):
683700 driver = driver .cdp_base
684- return self .loop .run_until_complete (
685- driver .cookies .clear ()
686- )
701+ return self .loop .run_until_complete (driver .cookies .clear ())
687702
688703 def sleep (self , seconds ):
689704 time .sleep (seconds )
@@ -702,9 +717,7 @@ def get_active_element_css(self):
702717
703718 js_code = active_css_js .get_active_element_css
704719 js_code = js_code .replace ("return getBestSelector" , "getBestSelector" )
705- return self .loop .run_until_complete (
706- self .page .evaluate (js_code )
707- )
720+ return self .loop .run_until_complete (self .page .evaluate (js_code ))
708721
709722 def click (self , selector , timeout = None ):
710723 if not timeout :
@@ -978,17 +991,13 @@ def evaluate(self, expression):
978991 "\n " .join (exp_list [0 :- 1 ]) + "\n "
979992 + exp_list [- 1 ].strip ()[len ("return " ):]
980993 ).strip ()
981- return self .loop .run_until_complete (
982- self .page .evaluate (expression )
983- )
994+ return self .loop .run_until_complete (self .page .evaluate (expression ))
984995
985996 def js_dumps (self , obj_name ):
986997 """Similar to evaluate(), but for dictionary results."""
987998 if obj_name .startswith ("return " ):
988999 obj_name = obj_name [len ("return " ):]
989- return self .loop .run_until_complete (
990- self .page .js_dumps (obj_name )
991- )
1000+ return self .loop .run_until_complete (self .page .js_dumps (obj_name ))
9921001
9931002 def maximize (self ):
9941003 if self .get_window ()[1 ].window_state .value == "maximized" :
@@ -1309,6 +1318,8 @@ def get_element_attributes(self, selector):
13091318 )
13101319
13111320 def get_element_attribute (self , selector , attribute ):
1321+ """Find an element and return the value of an attribute.
1322+ Raises an exception if there's no such element or attribute."""
13121323 attributes = self .get_element_attributes (selector )
13131324 with suppress (Exception ):
13141325 return attributes [attribute ]
@@ -1319,10 +1330,16 @@ def get_element_attribute(self, selector, attribute):
13191330 return value
13201331
13211332 def get_attribute (self , selector , attribute ):
1333+ """Find an element and return the value of an attribute.
1334+ If the element doesn't exist: Raises an exception.
1335+ If the attribute doesn't exist: Returns None."""
13221336 return self .find_element (selector ).get_attribute (attribute )
13231337
13241338 def get_element_html (self , selector ):
1339+ """Find an element and return the outerHTML."""
13251340 selector = self .__convert_to_css_if_xpath (selector )
1341+ self .find_element (selector )
1342+ self .__add_light_pause ()
13261343 return self .loop .run_until_complete (
13271344 self .page .evaluate (
13281345 """document.querySelector('%s').outerHTML"""
0 commit comments