diff --git a/src/Selenium2Library/keywords/_browsermanagement.py b/src/Selenium2Library/keywords/_browsermanagement.py index 5be1cdcdb..334cd6f6b 100644 --- a/src/Selenium2Library/keywords/_browsermanagement.py +++ b/src/Selenium2Library/keywords/_browsermanagement.py @@ -173,7 +173,7 @@ def select_frame(self, locator): details about locating elements. """ self._info("Selecting frame '%s'." % locator) - element = self._element_find(locator, True, True, tag='frame') + element = self._element_find(locator, True, True, tag=['frame','iframe']) self._current_browser().switch_to_frame(element) def select_window(self, locator=None): diff --git a/src/Selenium2Library/keywords/_element.py b/src/Selenium2Library/keywords/_element.py index e107d526c..d0017ed59 100644 --- a/src/Selenium2Library/keywords/_element.py +++ b/src/Selenium2Library/keywords/_element.py @@ -508,7 +508,8 @@ def _element_find(self, locator, first_only, required, tag=None): def _frame_contains(self, locator, text): browser = self._current_browser() - element = self._element_find(locator, True, True, 'frame') + + element = self._element_find(locator, True, True, ['frame','iframe']) browser.switch_to_frame(element) self._info("Searching for text from frame '%s'." % locator) found = self._is_text_present(text) @@ -590,6 +591,7 @@ def _page_contains(self, text): return True subframes = self._element_find("tag=frame", False, False, 'frame') + subframes.extend(self._element_find("tag=iframe", False, False, 'iframe')) self._debug('Current frame has %d subframes' % len(subframes)) for frame in subframes: browser.switch_to_frame(frame) diff --git a/src/Selenium2Library/locators/elementfinder.py b/src/Selenium2Library/locators/elementfinder.py index 821d183f8..9ab365bec 100644 --- a/src/Selenium2Library/locators/elementfinder.py +++ b/src/Selenium2Library/locators/elementfinder.py @@ -76,23 +76,36 @@ def _find_by_default(self, browser, criteria, tag, constraints): return self._find_by_xpath(browser, criteria, tag, constraints) return self._find_by_key_attrs(browser, criteria, tag, constraints) - def _find_by_key_attrs(self, browser, criteria, tag, constraints): + def _find_by_key_attrs(self, browser, criteria, tags, constraints): key_attrs = self._key_attrs.get(None) - if tag is not None: - key_attrs = self._key_attrs.get(tag, key_attrs) + if tags is not None and not isinstance(tags, (list, tuple)): + key_attrs = self._key_attrs.get(tags, key_attrs) xpath_criteria = utils.escape_xpath_value(criteria) - xpath_tag = tag if tag is not None else '*' - xpath_constraints = ["@%s='%s'" % (name, constraints[name]) for name in constraints] - xpath_searchers = ["%s=%s" % (attr, xpath_criteria) for attr in key_attrs] - xpath_searchers.extend( - self._get_attrs_with_url(key_attrs, criteria, browser)) - xpath = "//%s[%s(%s)]" % ( - xpath_tag, - ' and '.join(xpath_constraints) + ' and ' if len(xpath_constraints) > 0 else '', - ' or '.join(xpath_searchers)) - - return browser.find_elements_by_xpath(xpath) + #if not tag: + # xpath_tag = '*' + #elif tag and not isinstance(tag,(list,tuple)): + # xpath_tag = tag + #elif isinstance(tag,(list,tuple)): + # xpath_tag = ' or '.join(t for t in tag) + if not isinstance(tags,(list,tuple)): tags =[tags] + + full_xpath = "" + for tag in tags: + xpath_tag = tag if tag is not None else '*' + xpath_constraints = ["@%s='%s'" % (name, constraints[name]) for name in constraints] + xpath_searchers = ["%s=%s" % (attr, xpath_criteria) for attr in key_attrs] + xpath_searchers.extend( + self._get_attrs_with_url(key_attrs, criteria, browser)) + xpath = "//%s[%s(%s)]" % ( + xpath_tag, + ' and '.join(xpath_constraints) + ' and ' if len(xpath_constraints) > 0 else '', + ' or '.join(xpath_searchers)) + if len(full_xpath) > 1: + full_xpath = "%s | %s" % (full_xpath,xpath) + else: + full_xpath = xpath + return browser.find_elements_by_xpath(full_xpath) # Private @@ -106,6 +119,8 @@ def _find_by_key_attrs(self, browser, criteria, tag, constraints): def _get_tag_and_constraints(self, tag): if tag is None: return None, {} + #we want to allow a list of tags as well + if isinstance(tag, (list,tuple)): return tag, {} tag = tag.lower() constraints = {} @@ -130,7 +145,7 @@ def _get_tag_and_constraints(self, tag): return tag, constraints def _element_matches(self, element, tag, constraints): - if not element.tag_name.lower() == tag: + if not element.tag_name.lower() in tag: return False for name in constraints: if not element.get_attribute(name) == constraints[name]: diff --git a/test/acceptance/keywords/frames.txt b/test/acceptance/keywords/frames.txt index 1d4e074d2..48b9cc723 100644 --- a/test/acceptance/keywords/frames.txt +++ b/test/acceptance/keywords/frames.txt @@ -10,6 +10,10 @@ Frame Should Contain Frame Should contain right You're looking at right. Frame Should Contain left Links +iFrame Should Contain + Select Frame right + Frame Should contain iframe_right You're looking at iframe right. + Select And Unselect Frame [Documentation] LOG 1 Selecting frame 'left'. Select Frame left @@ -17,3 +21,4 @@ Select And Unselect Frame Unselect Frame Select Frame right Current Frame Contains You're looking at foo. + diff --git a/test/resources/html/frames/frameset.html b/test/resources/html/frames/frameset.html index 81768bbbd..5a630d95b 100644 --- a/test/resources/html/frames/frameset.html +++ b/test/resources/html/frames/frameset.html @@ -1,6 +1,8 @@
- \ No newline at end of file +