@@ -553,14 +553,68 @@ def is_text_visible(self, text, selector, by=By.CSS_SELECTOR):
553
553
time .sleep (0.01 )
554
554
if page_utils .is_xpath_selector (selector ):
555
555
by = By .XPATH
556
+ if page_utils .is_link_text_selector (selector ):
557
+ selector = page_utils .get_link_text_from_selector (selector )
558
+ by = By .LINK_TEXT
556
559
return page_actions .is_text_visible (self .driver , text , selector , by )
557
560
558
561
def find_visible_elements (self , selector , by = By .CSS_SELECTOR ):
559
562
""" Returns a list of matching WebElements that are visible. """
560
563
if page_utils .is_xpath_selector (selector ):
561
564
by = By .XPATH
565
+ if page_utils .is_link_text_selector (selector ):
566
+ selector = page_utils .get_link_text_from_selector (selector )
567
+ by = By .LINK_TEXT
562
568
return page_actions .find_visible_elements (self .driver , selector , by )
563
569
570
+ def is_element_in_frame (self , selector , by = By .CSS_SELECTOR ):
571
+ """ Returns True if the selector's element is located in an iFrame.
572
+ Otherwise returns False. """
573
+ selector , by = self ._recalculate_selector (selector , by )
574
+ if self .is_element_present (selector , by = by ):
575
+ return False
576
+ source = self .driver .page_source
577
+ soup = BeautifulSoup (source , "html.parser" )
578
+ iframe_list = soup .select ('iframe' )
579
+ for iframe in iframe_list :
580
+ iframe_identifier = None
581
+ if iframe .has_attr ('name' ) and len (iframe ['name' ]) > 0 :
582
+ iframe_identifier = iframe ['name' ]
583
+ elif iframe .has_attr ('id' ) and len (iframe ['id' ]) > 0 :
584
+ iframe_identifier = iframe ['id' ]
585
+ else :
586
+ continue
587
+ self .switch_to_frame (iframe_identifier )
588
+ if self .is_element_present (selector , by = by ):
589
+ self .switch_to_default_content ()
590
+ return True
591
+ self .switch_to_default_content ()
592
+ return False
593
+
594
+ def enter_frame_of_element (self , selector , by = By .CSS_SELECTOR ):
595
+ """ Returns the frame name of the selector's element if in an iFrame.
596
+ Also enters the iFrame if the element was inside an iFrame.
597
+ If the element is not in an iFrame, returns None. """
598
+ selector , by = self ._recalculate_selector (selector , by )
599
+ if self .is_element_present (selector , by = by ):
600
+ return None
601
+ source = self .driver .page_source
602
+ soup = BeautifulSoup (source , "html.parser" )
603
+ iframe_list = soup .select ('iframe' )
604
+ for iframe in iframe_list :
605
+ iframe_identifier = None
606
+ if iframe .has_attr ('name' ) and len (iframe ['name' ]) > 0 :
607
+ iframe_identifier = iframe ['name' ]
608
+ elif iframe .has_attr ('id' ) and len (iframe ['id' ]) > 0 :
609
+ iframe_identifier = iframe ['id' ]
610
+ else :
611
+ continue
612
+ self .switch_to_frame (iframe_identifier )
613
+ if self .is_element_present (selector , by = by ):
614
+ return iframe_identifier
615
+ self .switch_to_default_content ()
616
+ return None
617
+
564
618
def execute_script (self , script ):
565
619
return self .driver .execute_script (script )
566
620
0 commit comments