@@ -167,6 +167,57 @@ def find_element(
167
167
self .__slow_mode_pause_if_set ()
168
168
return element
169
169
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
+
170
221
def find_all (self , selector , timeout = settings .SMALL_TIMEOUT ):
171
222
self .__add_light_pause ()
172
223
selector = self .__convert_to_css_if_xpath (selector )
@@ -177,26 +228,48 @@ def find_all(self, selector, timeout=settings.SMALL_TIMEOUT):
177
228
for element in elements :
178
229
element = self .__add_sync_methods (element )
179
230
updated_elements .append (element )
180
- self .__slow_mode_pause_if_set ()
181
231
return updated_elements
182
232
183
233
def find_elements_by_text (self , text , tag_name = None ):
184
234
"""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)"""
187
237
self .__add_light_pause ()
188
238
elements = self .loop .run_until_complete (
189
239
self .page .find_elements_by_text (text = text )
190
240
)
191
241
updated_elements = []
242
+ if tag_name :
243
+ tag_name = tag_name .lower ().strip ()
192
244
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
196
253
):
197
254
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 )
200
273
return updated_elements
201
274
202
275
def select (self , selector , timeout = settings .SMALL_TIMEOUT ):
@@ -244,7 +317,6 @@ def select_all(self, selector, timeout=settings.SMALL_TIMEOUT):
244
317
for element in elements :
245
318
element = self .__add_sync_methods (element )
246
319
updated_elements .append (element )
247
- self .__slow_mode_pause_if_set ()
248
320
return updated_elements
249
321
250
322
def find_elements (self , selector , timeout = settings .SMALL_TIMEOUT ):
0 commit comments