@@ -175,45 +175,37 @@ def is_link_text_present(self, link_text):
175
175
The element doesn't need to be visible,
176
176
such as elements hidden inside a dropdown selection. """
177
177
self .wait_for_ready_state_complete ()
178
- source = self .driver . page_source
178
+ source = self .get_page_source ()
179
179
soup = BeautifulSoup (source , "html.parser" )
180
180
html_links = soup .find_all ('a' )
181
181
for html_link in html_links :
182
- if html_link .text == link_text :
183
- if html_link .has_attr ('href' ):
184
- return True
182
+ if html_link .text .strip () == link_text .strip ():
183
+ return True
185
184
return False
186
185
187
- def get_href_from_link_text (self , link_text ):
186
+ def get_link_text_attribute (self , link_text , attribute ):
188
187
self .wait_for_ready_state_complete ()
189
- source = self .driver . page_source
188
+ source = self .get_page_source ()
190
189
soup = BeautifulSoup (source , "html.parser" )
191
190
html_links = soup .find_all ('a' )
192
191
for html_link in html_links :
193
- if html_link .text == link_text :
194
- if html_link .has_attr ('href' ):
195
- href = html_link .get ('href' )
196
- if href .startswith ('//' ):
197
- link = "http:" + href
198
- elif href .startswith ('/' ):
199
- url = self .driver .current_url
200
- domain_url = self .get_domain_url (url )
201
- link = domain_url + href
202
- else :
203
- link = href
204
- return link
192
+ if html_link .text .strip () == link_text .strip ():
193
+ if html_link .has_attr (attribute ):
194
+ attribute_value = html_link .get (attribute )
195
+ return attribute_value
205
196
raise Exception (
206
197
'Could not parse link from link_text [%s]' % link_text )
207
198
raise Exception ("Link Text [%s] was not found!" % link_text )
208
199
209
- def wait_for_href_from_link_text (self , link_text ,
210
- timeout = settings .SMALL_TIMEOUT ):
200
+ def wait_for_link_text_present (self , link_text ,
201
+ timeout = settings .SMALL_TIMEOUT ):
211
202
start_ms = time .time () * 1000.0
212
203
stop_ms = start_ms + (timeout * 1000.0 )
213
204
for x in range (int (timeout * 5 )):
214
205
try :
215
- href = self .get_href_from_link_text (link_text )
216
- return href
206
+ if not self .is_link_text_present (link_text ):
207
+ raise Exception ("Link text [%s] not found!" % link_text )
208
+ return
217
209
except Exception :
218
210
now_ms = time .time () * 1000.0
219
211
if now_ms >= stop_ms :
@@ -233,10 +225,11 @@ def click_link_text(self, link_text, timeout=settings.SMALL_TIMEOUT):
233
225
element = self .wait_for_link_text_visible (link_text )
234
226
element .click ()
235
227
return
236
- self .open (self .get_href_from_link_text (link_text ))
228
+ self .open (self ._get_href_from_link_text (link_text ))
237
229
return
238
- self .wait_for_href_from_link_text (link_text , timeout = timeout )
239
- pre_action_url = self .driver .current_url
230
+ if not self .is_link_text_present (link_text ):
231
+ self .wait_for_link_text_present (link_text )
232
+ pre_action_url = self .get_current_url ()
240
233
try :
241
234
element = self .wait_for_link_text_visible (
242
235
link_text , timeout = 0.2 )
@@ -250,11 +243,33 @@ def click_link_text(self, link_text, timeout=settings.SMALL_TIMEOUT):
250
243
link_text , timeout = timeout )
251
244
element .click ()
252
245
except Exception :
253
- # The link text is probably hidden under a dropdown menu
254
- if not self ._click_dropdown_link_text (link_text ):
255
- element = self .wait_for_link_text_visible (
256
- link_text , timeout = settings .MINI_TIMEOUT )
257
- element .click ()
246
+ hidden_css = None
247
+ try :
248
+ href = self ._get_href_from_link_text (link_text )
249
+ link_css = '[href="%s"]' % href
250
+ if self .is_element_visible (link_css ):
251
+ self .click (link_css )
252
+ else :
253
+ hidden_css = link_css
254
+ raise Exception ("Element %s is not clickable!" % link_css )
255
+ except Exception :
256
+ try :
257
+ ng_click = self ._get_ng_click_from_link_text (link_text )
258
+ link_css = '[ng-click="%s"]' % (ng_click )
259
+ if self .is_element_visible (link_css ):
260
+ self .click (link_css )
261
+ else :
262
+ if not hidden_css :
263
+ hidden_css = link_css
264
+ raise Exception (
265
+ "Element %s is not clickable!" % link_css )
266
+ except Exception :
267
+ # The link text is probably hidden under a dropdown menu
268
+ if not self ._click_dropdown_link_text (link_text ,
269
+ hidden_css ):
270
+ element = self .wait_for_link_text_visible (
271
+ link_text , timeout = settings .MINI_TIMEOUT )
272
+ element .click ()
258
273
if settings .WAIT_FOR_RSC_ON_CLICKS :
259
274
self .wait_for_ready_state_complete ()
260
275
if self .demo_mode :
@@ -278,7 +293,7 @@ def click_partial_link_text(self, partial_link_text,
278
293
element = self .wait_for_partial_link_text (partial_link_text )
279
294
element .click ()
280
295
return
281
- source = self .driver . page_source
296
+ source = self .get_page_source ()
282
297
soup = BeautifulSoup (source , "html.parser" )
283
298
html_links = soup .fetch ('a' )
284
299
for html_link in html_links :
@@ -583,7 +598,7 @@ def is_element_in_frame(self, selector, by=By.CSS_SELECTOR):
583
598
selector , by = self ._recalculate_selector (selector , by )
584
599
if self .is_element_present (selector , by = by ):
585
600
return False
586
- source = self .driver . page_source
601
+ source = self .get_page_source ()
587
602
soup = BeautifulSoup (source , "html.parser" )
588
603
iframe_list = soup .select ('iframe' )
589
604
for iframe in iframe_list :
@@ -608,7 +623,7 @@ def enter_frame_of_element(self, selector, by=By.CSS_SELECTOR):
608
623
selector , by = self ._recalculate_selector (selector , by )
609
624
if self .is_element_present (selector , by = by ):
610
625
return None
611
- source = self .driver . page_source
626
+ source = self .get_page_source ()
612
627
soup = BeautifulSoup (source , "html.parser" )
613
628
iframe_list = soup .select ('iframe' )
614
629
for iframe in iframe_list :
@@ -1498,26 +1513,41 @@ def process_checks(self, print_only=False):
1498
1513
1499
1514
############
1500
1515
1501
- def _click_dropdown_link_text (self , link_text ):
1516
+ def _get_href_from_link_text (self , link_text ):
1517
+ href = self .get_link_text_attribute (link_text , "href" )
1518
+ if href .startswith ('//' ):
1519
+ link = "http:" + href
1520
+ elif href .startswith ('/' ):
1521
+ url = self .driver .current_url
1522
+ domain_url = self .get_domain_url (url )
1523
+ link = domain_url + href
1524
+ else :
1525
+ link = href
1526
+ return link
1527
+
1528
+ def _get_ng_click_from_link_text (self , link_text ):
1529
+ ng_click = self .get_link_text_attribute (link_text , "ng-click" )
1530
+ return ng_click
1531
+
1532
+ def _click_dropdown_link_text (self , link_text , hidden_css ):
1502
1533
""" When a link is hidden under a dropdown menu, use this. """
1503
- href = self .wait_for_href_from_link_text (link_text )
1504
- source = self .driver .page_source
1534
+ source = self .get_page_source ()
1505
1535
soup = BeautifulSoup (source , "html.parser" )
1506
1536
drop_down_list = soup .select ('[class*=dropdown]' )
1537
+ csstype = hidden_css .split ('[' )[1 ].split ('=' )[0 ]
1507
1538
for item in drop_down_list :
1508
- if link_text in item .text .split ('\n ' ) and href in item .decode ():
1539
+ if link_text in item .text .split ('\n ' ) and csstype in item .decode ():
1509
1540
dropdown_css = ""
1510
1541
for css_class in item ['class' ]:
1511
1542
dropdown_css += '.'
1512
1543
dropdown_css += css_class
1513
1544
dropdown_css = item .name + dropdown_css
1514
- link_css = '[href="%s"]' % href
1515
1545
matching_dropdowns = self .find_visible_elements (dropdown_css )
1516
1546
for dropdown in matching_dropdowns :
1517
1547
# The same class names might be used for multiple dropdowns
1518
1548
try :
1519
1549
page_actions .hover_element_and_click (
1520
- self .driver , dropdown , link_css ,
1550
+ self .driver , dropdown , hidden_css ,
1521
1551
click_by = By .CSS_SELECTOR , timeout = 0.2 )
1522
1552
return True
1523
1553
except Exception :
0 commit comments