From 1cfd05086a5ccb1c3297072e2bc0e713e71b2156 Mon Sep 17 00:00:00 2001 From: Andrews Medina Date: Sat, 25 Aug 2018 23:04:18 -0300 Subject: [PATCH] fix element.find_by_text to do a contextual search for text closes #612 --- splinter/driver/lxmldriver.py | 7 ++----- splinter/driver/webdriver/__init__.py | 2 +- splinter/driver/zopetestbrowser.py | 2 +- tests/find_elements.py | 7 +++++-- tests/static/index.html | 1 + 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/splinter/driver/lxmldriver.py b/splinter/driver/lxmldriver.py index b7a9f81e3..acf028cb9 100644 --- a/splinter/driver/lxmldriver.py +++ b/splinter/driver/lxmldriver.py @@ -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 @@ -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) @@ -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 diff --git a/splinter/driver/webdriver/__init__.py b/splinter/driver/webdriver/__init__.py index 5bed81300..5a11c3969 100644 --- a/splinter/driver/webdriver/__init__.py +++ b/splinter/driver/webdriver/__init__.py @@ -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): diff --git a/splinter/driver/zopetestbrowser.py b/splinter/driver/zopetestbrowser.py index 1507f6d24..a2926ac99 100644 --- a/splinter/driver/zopetestbrowser.py +++ b/splinter/driver/zopetestbrowser.py @@ -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) diff --git a/tests/find_elements.py b/tests/find_elements.py index aa4c9d6ec..612278ecd 100644 --- a/tests/find_elements.py +++ b/tests/find_elements.py @@ -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") diff --git a/tests/static/index.html b/tests/static/index.html index d2126c22f..b3951475b 100644 --- a/tests/static/index.html +++ b/tests/static/index.html @@ -169,6 +169,7 @@

Example Last Header

inside

+ Complex