Skip to content

Commit

Permalink
fix element.find_by_text to do a contextual search for text
Browse files Browse the repository at this point in the history
closes #612
  • Loading branch information
andrewsmedina committed Aug 26, 2018
1 parent f243287 commit 1cfd050
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 9 deletions.
7 changes: 2 additions & 5 deletions splinter/driver/lxmldriver.py
Expand Up @@ -326,9 +326,6 @@ def cookies(self):
return self._cookie_manager


re_extract_inner_html = re.compile(r"^<[^<>]+>(.*)</[^<>]+>$")


class LxmlElement(ElementAPI):
def __init__(self, element, parent):
self._element = element
Expand Down Expand Up @@ -358,7 +355,7 @@ def find_by_value(self, value):
return ElementList([self.__class__(element, self) for element in elements])

def find_by_text(self, text):
return self.find_by_xpath('//*[text()="%s"]' % text)
return self.find_by_xpath('./*[text()="%s"]' % text)

def find_by_id(self, id):
elements = self._element.cssselect("#%s" % id)
Expand All @@ -378,7 +375,7 @@ def outer_html(self):

@property
def html(self):
return re_extract_inner_html.match(self.outer_html).group(1)
return re.match(r"^<[^<>]+>(.*)</[^<>]+>$", self.outer_html, re.MULTILINE | re.DOTALL).group(1)

def has_class(self, class_name):
return len(self._element.find_class(class_name)) > 0
Expand Down
2 changes: 1 addition & 1 deletion splinter/driver/webdriver/__init__.py
Expand Up @@ -687,7 +687,7 @@ def find_by_value(self, value):
return self.find_by_css(selector, original_find="value", original_query=value)

def find_by_text(self, text):
selector = '//*[text()="%s"]' % text
selector = './*[text()="%s"]' % text
return self.find_by_xpath(selector, original_find="text", original_query=text)

def find_by_id(self, id):
Expand Down
2 changes: 1 addition & 1 deletion splinter/driver/zopetestbrowser.py
Expand Up @@ -355,7 +355,7 @@ def find_by_value(self, value):
return ElementList([self.__class__(element, self) for element in elements])

def find_by_text(self, text):
return self.find_by_xpath('//*[text()="%s"]' % text)
return self.find_by_xpath('./*[text()="%s"]' % text)

def find_by_id(self, id):
elements = self._element.cssselect("#%s" % id)
Expand Down
7 changes: 5 additions & 2 deletions tests/find_elements.py
Expand Up @@ -206,6 +206,9 @@ def test_find_by_value_in_element_context(self):
self.assertIsInstance(decendent.first, ElementAPI)

def test_finding_by_text_in_element_context(self):
body = self.browser.find_by_tag("body")
element = body.find_by_text("Complex")
inside = self.browser.find_by_id("inside")
element = inside.find_by_text("Complex")

self.assertEqual(len(element), 1)
self.assertEqual(element["class"], "inside")
self.assertEqual(element.value, "Complex")
1 change: 1 addition & 0 deletions tests/static/index.html
Expand Up @@ -169,6 +169,7 @@ <h1 id="firstheader">Example Last Header</h1>
<iframe id="iframemodal" src="/iframe"></iframe>
<div id="inside">
<h2>inside</h2>
<span class="inside">Complex</span>
<form>
<input id="visible" name="upload" type="text" value="crazy diamond" />
</form>
Expand Down

0 comments on commit 1cfd050

Please sign in to comment.