@@ -167,6 +167,57 @@ def find_element(
167167        self .__slow_mode_pause_if_set ()
168168        return  element 
169169
170+     def  find_element_by_text (
171+         self , text , tag_name = None , timeout = settings .SMALL_TIMEOUT 
172+     ):
173+         """Returns an element by matching text. 
174+         Optionally, provide a tag_name to narrow down the search to an 
175+         element with the given tag. (Eg: a, button, div, script, span)""" 
176+         self .__add_light_pause ()
177+         time_now  =  time .time ()
178+         self .assert_text (text , timeout = timeout )
179+         spent  =  int (time .time () -  time_now )
180+         remaining  =  1  +  timeout  -  spent 
181+         if  tag_name :
182+             self .assert_element (tag_name , timeout = remaining )
183+         elements  =  self .loop .run_until_complete (
184+             self .page .find_elements_by_text (text = text )
185+         )
186+         if  tag_name :
187+             tag_name  =  tag_name .lower ().strip ()
188+         for  element  in  elements :
189+             if  element  and  not  tag_name :
190+                 element  =  self .__add_sync_methods (element )
191+                 return  self .__add_sync_methods (element )
192+             elif  (
193+                 element 
194+                 and  tag_name  in  element .tag_name .lower ()
195+                 and  text .strip () in  element .text 
196+             ):
197+                 element  =  self .__add_sync_methods (element )
198+                 return  self .__add_sync_methods (element )
199+             elif  (
200+                 element .parent 
201+                 and  tag_name  in  element .parent .tag_name .lower ()
202+                 and  text .strip () in  element .parent .text 
203+             ):
204+                 element  =  self .__add_sync_methods (element .parent )
205+                 return  self .__add_sync_methods (element )
206+             elif  (
207+                 element .parent .parent 
208+                 and  tag_name  in  element .parent .parent .tag_name .lower ()
209+                 and  text .strip () in  element .parent .parent .text 
210+             ):
211+                 element  =  self .__add_sync_methods (element .parent .parent )
212+                 return  self .__add_sync_methods (element )
213+         plural  =  "s" 
214+         if  timeout  ==  1 :
215+             plural  =  "" 
216+         raise  Exception (
217+             "Text {%s} with tag {%s} was not found after %s second%s!" 
218+             %  (text , tag_name , timeout , plural )
219+         )
220+ 
170221    def  find_all (self , selector , timeout = settings .SMALL_TIMEOUT ):
171222        self .__add_light_pause ()
172223        selector  =  self .__convert_to_css_if_xpath (selector )
@@ -177,26 +228,48 @@ def find_all(self, selector, timeout=settings.SMALL_TIMEOUT):
177228        for  element  in  elements :
178229            element  =  self .__add_sync_methods (element )
179230            updated_elements .append (element )
180-         self .__slow_mode_pause_if_set ()
181231        return  updated_elements 
182232
183233    def  find_elements_by_text (self , text , tag_name = None ):
184234        """Returns a list of elements by matching text. 
185-         Optionally, provide a tag_name to narrow down the search 
186-         to only  elements with the given tag. (Eg: a, div, script, span)""" 
235+         Optionally, provide a tag_name to narrow down the search to only  
236+         elements with the given tag. (Eg: a, button , div, script, span)""" 
187237        self .__add_light_pause ()
188238        elements  =  self .loop .run_until_complete (
189239            self .page .find_elements_by_text (text = text )
190240        )
191241        updated_elements  =  []
242+         if  tag_name :
243+             tag_name  =  tag_name .lower ().strip ()
192244        for  element  in  elements :
193-             if  (
194-                 not  tag_name 
195-                 or  tag_name .lower ().strip () in  element .tag_name .lower ().strip ()
245+             if  element  and  not  tag_name :
246+                 element  =  self .__add_sync_methods (element )
247+                 if  element  not  in   updated_elements :
248+                     updated_elements .append (element )
249+             elif  (
250+                 element 
251+                 and  tag_name  in  element .tag_name .lower ()
252+                 and  text .strip () in  element .text 
196253            ):
197254                element  =  self .__add_sync_methods (element )
198-                 updated_elements .append (element )
199-         self .__slow_mode_pause_if_set ()
255+                 if  element  not  in   updated_elements :
256+                     updated_elements .append (element )
257+             elif  (
258+                 element .parent 
259+                 and  tag_name  in  element .parent .tag_name .lower ()
260+                 and  text .strip () in  element .parent .text 
261+             ):
262+                 element  =  self .__add_sync_methods (element .parent )
263+                 if  element  not  in   updated_elements :
264+                     updated_elements .append (element )
265+             elif  (
266+                 element .parent .parent 
267+                 and  tag_name  in  element .parent .parent .tag_name .lower ()
268+                 and  text .strip () in  element .parent .parent .text 
269+             ):
270+                 element  =  self .__add_sync_methods (element .parent .parent )
271+                 if  element  not  in   updated_elements :
272+                     updated_elements .append (element )
200273        return  updated_elements 
201274
202275    def  select (self , selector , timeout = settings .SMALL_TIMEOUT ):
@@ -244,7 +317,6 @@ def select_all(self, selector, timeout=settings.SMALL_TIMEOUT):
244317        for  element  in  elements :
245318            element  =  self .__add_sync_methods (element )
246319            updated_elements .append (element )
247-         self .__slow_mode_pause_if_set ()
248320        return  updated_elements 
249321
250322    def  find_elements (self , selector , timeout = settings .SMALL_TIMEOUT ):
0 commit comments