@@ -645,6 +645,23 @@ def tile_windows(self, windows=None, max_columns=0):
645
645
driver .tile_windows (windows , max_columns )
646
646
)
647
647
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
+
648
665
def get_all_cookies (self , * args , ** kwargs ):
649
666
driver = self .driver
650
667
if hasattr (driver , "cdp_base" ):
@@ -681,9 +698,7 @@ def clear_cookies(self):
681
698
driver = self .driver
682
699
if hasattr (driver , "cdp_base" ):
683
700
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 ())
687
702
688
703
def sleep (self , seconds ):
689
704
time .sleep (seconds )
@@ -702,9 +717,7 @@ def get_active_element_css(self):
702
717
703
718
js_code = active_css_js .get_active_element_css
704
719
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 ))
708
721
709
722
def click (self , selector , timeout = None ):
710
723
if not timeout :
@@ -978,17 +991,13 @@ def evaluate(self, expression):
978
991
"\n " .join (exp_list [0 :- 1 ]) + "\n "
979
992
+ exp_list [- 1 ].strip ()[len ("return " ):]
980
993
).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 ))
984
995
985
996
def js_dumps (self , obj_name ):
986
997
"""Similar to evaluate(), but for dictionary results."""
987
998
if obj_name .startswith ("return " ):
988
999
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 ))
992
1001
993
1002
def maximize (self ):
994
1003
if self .get_window ()[1 ].window_state .value == "maximized" :
@@ -1309,6 +1318,8 @@ def get_element_attributes(self, selector):
1309
1318
)
1310
1319
1311
1320
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."""
1312
1323
attributes = self .get_element_attributes (selector )
1313
1324
with suppress (Exception ):
1314
1325
return attributes [attribute ]
@@ -1319,10 +1330,16 @@ def get_element_attribute(self, selector, attribute):
1319
1330
return value
1320
1331
1321
1332
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."""
1322
1336
return self .find_element (selector ).get_attribute (attribute )
1323
1337
1324
1338
def get_element_html (self , selector ):
1339
+ """Find an element and return the outerHTML."""
1325
1340
selector = self .__convert_to_css_if_xpath (selector )
1341
+ self .find_element (selector )
1342
+ self .__add_light_pause ()
1326
1343
return self .loop .run_until_complete (
1327
1344
self .page .evaluate (
1328
1345
"""document.querySelector('%s').outerHTML"""
0 commit comments