4
4
import dash_html_components as html
5
5
import dash_core_components as dcc
6
6
from .IntegrationTests import IntegrationTests
7
- from .utils import assert_clean_console , invincible , wait_for
7
+ from .utils import assert_clean_console , wait_for
8
8
from multiprocessing import Value
9
9
import time
10
10
import re
14
14
15
15
class Tests (IntegrationTests ):
16
16
def setUp (self ):
17
- def wait_for_element_by_id (id ):
18
- wait_for (lambda : None is not invincible (
19
- lambda : self .driver .find_element_by_id (id )
20
- ))
21
- return self .driver .find_element_by_id (id )
22
- self .wait_for_element_by_id = wait_for_element_by_id
17
+ pass
18
+
19
+ def wait_for_element_by_css_selector (self , selector ):
20
+ start_time = time .time ()
21
+ while time .time () < start_time + 20 :
22
+ try :
23
+ return self .driver .find_element_by_css_selector (selector )
24
+ except Exception as e :
25
+ pass
26
+ time .sleep (0.25 )
27
+ raise e
28
+
29
+ def wait_for_text_to_equal (self , selector , assertion_text ):
30
+ start_time = time .time ()
31
+ while time .time () < start_time + 20 :
32
+ el = self .wait_for_element_by_css_selector (selector )
33
+ try :
34
+ return self .assertEqual (el .text , assertion_text )
35
+ except Exception as e :
36
+ pass
37
+ time .sleep (0.25 )
38
+ raise e
23
39
24
40
def request_queue_assertions (
25
41
self , check_rejected = True , expected_length = None ):
@@ -85,7 +101,7 @@ def test_initial_state(self):
85
101
86
102
self .startServer (app )
87
103
88
- el = self .wait_for_element_by_id ( ' _dash-app-content' )
104
+ el = self .wait_for_element_by_css_selector ( '# _dash-app-content' )
89
105
90
106
# TODO - Make less fragile with http://lxml.de/lxmlhtml.html#html-diff
91
107
rendered_dom = '''
@@ -440,17 +456,15 @@ def update_output(value):
440
456
441
457
self .startServer (app )
442
458
443
- output1 = self .wait_for_element_by_id ('output-1' )
444
- wait_for (lambda : output1 .text == 'initial value' )
459
+ self .wait_for_text_to_equal ('#output-1' , 'initial value' )
445
460
self .percy_snapshot (name = 'simple-callback-1' )
446
461
447
- input1 = self .wait_for_element_by_id ( ' input' )
462
+ input1 = self .wait_for_element_by_css_selector ( '# input' )
448
463
input1 .clear ()
449
464
450
465
input1 .send_keys ('hello world' )
451
466
452
- output1 = lambda : self .wait_for_element_by_id ('output-1' )
453
- wait_for (lambda : output1 ().text == 'hello world' )
467
+ self .wait_for_text_to_equal ('#output-1' , 'hello world' )
454
468
self .percy_snapshot (name = 'simple-callback-2' )
455
469
456
470
self .assertEqual (
@@ -558,11 +572,9 @@ def update_input(value):
558
572
# editing the input should modify the sub output
559
573
sub_input = self .driver .find_element_by_id ('sub-input-1' )
560
574
sub_input .send_keys ('a' )
561
- wait_for (
562
- lambda : (
563
- self .driver .find_element_by_id ('sub-output-1' ).text
564
- ) == 'sub input initial valuea'
565
- )
575
+ self .wait_for_text_to_equal (
576
+ '#sub-output-1' ,
577
+ 'sub input initial valuea' )
566
578
567
579
self .assertEqual (call_count .value , 2 )
568
580
@@ -727,14 +739,7 @@ def generic_chapter_assertions(chapter):
727
739
else :
728
740
value = chapters [chapter ]['{}-controls' .format (chapter )].value
729
741
# check the actual values
730
- wait_for (
731
- lambda : (
732
- self .driver .find_element_by_id (
733
- '{}-label' .format (chapter )
734
- ).text
735
- == value
736
- )
737
- )
742
+ self .wait_for_text_to_equal ('#{}-label' .format (chapter ), value )
738
743
wait_for (
739
744
lambda : (
740
745
self .driver .execute_script (
@@ -880,10 +885,7 @@ def chapter3_assertions():
880
885
(self .driver .find_elements_by_css_selector (
881
886
'input[type="radio"]'
882
887
)[3 ]).click ()
883
- wait_for (lambda : (
884
- self .driver .find_element_by_id ('body' ).text ==
885
- 'Just a string'
886
- ))
888
+ self .wait_for_text_to_equal ('#body' , 'Just a string' )
887
889
self .percy_snapshot (name = 'chapter-4' )
888
890
889
891
# each element should exist in the dom
@@ -954,8 +956,7 @@ def update_output_2(value):
954
956
955
957
self .startServer (app )
956
958
957
- el = self .wait_for_element_by_id ('output-1' )
958
- wait_for (lambda : el .text == 'initial value' )
959
+ self .wait_for_text_to_equal ('#output-1' , 'initial value' )
959
960
self .percy_snapshot (name = 'dependencies' )
960
961
time .sleep (1.0 )
961
962
self .assertEqual (output_1_call_count .value , 1 )
@@ -964,8 +965,7 @@ def update_output_2(value):
964
965
input = self .driver .find_element_by_id ('input' )
965
966
966
967
input .send_keys ('a' )
967
- wait_for (lambda : self .driver .find_element_by_id ('output-1' ).text
968
- == 'initial valuea' )
968
+ self .wait_for_text_to_equal ('#output-1' , 'initial valuea' )
969
969
time .sleep (1.0 )
970
970
self .assertEqual (output_1_call_count .value , 2 )
971
971
self .assertEqual (output_2_call_count .value , 0 )
@@ -1497,7 +1497,7 @@ def dynamic_output(*args):
1497
1497
1498
1498
self .startServer (app )
1499
1499
1500
- self .wait_for_element_by_id ( ' display-content' ).click ()
1500
+ self .wait_for_element_by_css_selector ( '# display-content' ).click ()
1501
1501
1502
1502
time .sleep (5 )
1503
1503
@@ -1526,7 +1526,7 @@ def update_output(n_clicks):
1526
1526
return n_clicks
1527
1527
1528
1528
self .startServer (app )
1529
- button = self .wait_for_element_by_id ( ' input' )
1529
+ button = self .wait_for_element_by_css_selector ( '# input' )
1530
1530
button .click ()
1531
1531
button .click ()
1532
1532
time .sleep (8 )
@@ -1579,7 +1579,7 @@ def dropdown_2(value, session_id):
1579
1579
1580
1580
self .startServer (app )
1581
1581
1582
- self .wait_for_element_by_id ( ' session-id' )
1582
+ self .wait_for_element_by_css_selector ( '# session-id' )
1583
1583
time .sleep (2 )
1584
1584
self .assertEqual (call_counts ['dropdown_1' ].value , 1 )
1585
1585
self .assertEqual (call_counts ['dropdown_2' ].value , 1 )
@@ -1612,8 +1612,8 @@ def test_callbacks_triggered_on_generated_output(self):
1612
1612
html .Div (id = 'tab-output' )
1613
1613
])
1614
1614
1615
-
1616
- @ app . callback ( Output ( 'tab-output' , 'children' ), [Input ('tabs' , 'value' )])
1615
+ @ app . callback ( Output ( 'tab-output' , 'children' ),
1616
+ [Input ('tabs' , 'value' )])
1617
1617
def display_content (value ):
1618
1618
return html .Div ([
1619
1619
html .Div (id = 'tab-{}-output' .format (value ))
@@ -1631,27 +1631,22 @@ def display_tab2_output(value):
1631
1631
call_counts ['tab2' ].value += 1
1632
1632
return 'You have selected "{}"' .format (value )
1633
1633
1634
-
1635
1634
self .startServer (app )
1636
- self .wait_for_element_by_id ( ' tab-output' )
1635
+ self .wait_for_element_by_css_selector ( '# tab-output' )
1637
1636
time .sleep (2 )
1638
1637
1639
1638
self .assertEqual (call_counts ['tab1' ].value , 1 )
1640
1639
self .assertEqual (call_counts ['tab2' ].value , 0 )
1641
- wait_for (lambda : (
1642
- self .driver .find_element_by_id ('tab-output' ).text ==
1643
- 'You have selected "1"'
1644
- ))
1640
+ self .wait_for_text_to_equal ('#tab-output' , 'You have selected "a"' )
1641
+ self .wait_for_text_to_equal ('#tab-1-output' , 'You have selected "a"' )
1645
1642
1646
1643
(self .driver .find_elements_by_css_selector (
1647
1644
'input[type="radio"]'
1648
1645
)[1 ]).click ()
1649
1646
time .sleep (2 )
1650
1647
1651
- wait_for (lambda : (
1652
- self .driver .find_element_by_id ('tab-output' ).text ==
1653
- 'You have selected "2"'
1654
- ))
1648
+ self .wait_for_text_to_equal ('#tab-output' , 'You have selected "a"' )
1649
+ self .wait_for_text_to_equal ('#tab-2-output' , 'You have selected "a"' )
1655
1650
self .assertEqual (call_counts ['tab1' ].value , 1 )
1656
1651
self .assertEqual (call_counts ['tab2' ].value , 1 )
1657
1652
0 commit comments