Skip to content

Commit 1707ddf

Browse files
committed
Mostly iFrame processing with new methods
1 parent c4e1378 commit 1707ddf

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

seleniumbase/fixtures/base_case.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,14 +553,68 @@ def is_text_visible(self, text, selector, by=By.CSS_SELECTOR):
553553
time.sleep(0.01)
554554
if page_utils.is_xpath_selector(selector):
555555
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
556559
return page_actions.is_text_visible(self.driver, text, selector, by)
557560

558561
def find_visible_elements(self, selector, by=By.CSS_SELECTOR):
559562
""" Returns a list of matching WebElements that are visible. """
560563
if page_utils.is_xpath_selector(selector):
561564
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
562568
return page_actions.find_visible_elements(self.driver, selector, by)
563569

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+
564618
def execute_script(self, script):
565619
return self.driver.execute_script(script)
566620

0 commit comments

Comments
 (0)