1
+ import asyncio
1
2
from base64 import b64encode
2
3
from pathlib import Path
3
4
4
- from selenium .webdriver .common .keys import Keys
5
-
6
5
import idom
7
- from tests . tooling . browser import send_keys
6
+ from idom . testing import DisplayFixture , poll
8
7
9
8
10
9
HERE = Path (__file__ ).parent
@@ -14,7 +13,7 @@ def test_multiview_repr():
14
13
assert str (idom .widgets .MultiViewMount ({})) == "MultiViewMount({})"
15
14
16
15
17
- def test_hostwap_update_on_change (driver , display ):
16
+ async def test_hostwap_update_on_change (display : DisplayFixture ):
18
17
"""Ensure shared hotswapping works
19
18
20
19
This basically means that previously rendered views of a hotswap component get updated
@@ -48,15 +47,15 @@ async def on_click(event):
48
47
49
48
return idom .html .div (incr , hotswap_view )
50
49
51
- display (ButtonSwapsDivs )
50
+ page = await display . show (ButtonSwapsDivs )
52
51
53
- client_incr_button = driver . find_element ( "id" , " incr-button" )
52
+ client_incr_button = await page . wait_for_selector ( "# incr-button" )
54
53
55
- driver . find_element ( "id" , " hotswap-1" )
56
- client_incr_button .click ()
57
- driver . find_element ( "id" , " hotswap-2" )
58
- client_incr_button .click ()
59
- driver . find_element ( "id" , " hotswap-3" )
54
+ await page . wait_for_selector ( "# hotswap-1" )
55
+ await client_incr_button .click ()
56
+ await page . wait_for_selector ( "# hotswap-2" )
57
+ await client_incr_button .click ()
58
+ await page . wait_for_selector ( "# hotswap-3" )
60
59
61
60
62
61
IMAGE_SRC_BYTES = b"""
@@ -67,43 +66,48 @@ async def on_click(event):
67
66
BASE64_IMAGE_SRC = b64encode (IMAGE_SRC_BYTES ).decode ()
68
67
69
68
70
- def test_image_from_string (driver , display ):
69
+ async def test_image_from_string (display : DisplayFixture ):
71
70
src = IMAGE_SRC_BYTES .decode ()
72
- display (lambda : idom .widgets .image ("svg" , src , {"id" : "a-circle-1" }))
73
- client_img = driver .find_element ("id" , "a-circle-1" )
74
- assert BASE64_IMAGE_SRC in client_img .get_attribute ("src" )
71
+ page = await display .show (
72
+ lambda : idom .widgets .image ("svg" , src , {"id" : "a-circle-1" })
73
+ )
74
+ client_img = await page .wait_for_selector ("#a-circle-1" )
75
+ assert BASE64_IMAGE_SRC in (await client_img .get_attribute ("src" ))
75
76
76
77
77
- def test_image_from_bytes (driver , display ):
78
+ async def test_image_from_bytes (display : DisplayFixture ):
78
79
src = IMAGE_SRC_BYTES
79
- display (lambda : idom .widgets .image ("svg" , src , {"id" : "a-circle-1" }))
80
- client_img = driver .find_element ("id" , "a-circle-1" )
81
- assert BASE64_IMAGE_SRC in client_img .get_attribute ("src" )
80
+ page = await display .show (
81
+ lambda : idom .widgets .image ("svg" , src , {"id" : "a-circle-1" })
82
+ )
83
+ client_img = await page .wait_for_selector ("#a-circle-1" )
84
+ assert BASE64_IMAGE_SRC in (await client_img .get_attribute ("src" ))
82
85
83
86
84
- def test_use_linked_inputs (driver , driver_wait , display ):
87
+ async def test_use_linked_inputs (display : DisplayFixture ):
85
88
@idom .component
86
89
def SomeComponent ():
87
90
i_1 , i_2 = idom .widgets .use_linked_inputs ([{"id" : "i_1" }, {"id" : "i_2" }])
88
91
return idom .html .div (i_1 , i_2 )
89
92
90
- display (SomeComponent )
93
+ page = await display . show (SomeComponent )
91
94
92
- input_1 = driver . find_element ( "id" , " i_1" )
93
- input_2 = driver . find_element ( "id" , " i_2" )
95
+ input_1 = await page . wait_for_selector ( "# i_1" )
96
+ input_2 = await page . wait_for_selector ( "# i_2" )
94
97
95
- send_keys ( input_1 , "hello" )
98
+ await input_1 . type ( "hello" , delay = 20 )
96
99
97
- driver_wait . until ( lambda d : input_1 .get_attribute ( " value" ) == "hello" )
98
- driver_wait . until ( lambda d : input_2 .get_attribute ( " value" ) == "hello" )
100
+ assert ( await input_1 .evaluate ( "e => e. value" )) == "hello"
101
+ assert ( await input_2 .evaluate ( "e => e. value" )) == "hello"
99
102
100
- send_keys (input_2 , " world" )
103
+ await input_2 .focus ()
104
+ await input_2 .type (" world" , delay = 20 )
101
105
102
- driver_wait . until ( lambda d : input_1 .get_attribute ( " value" ) == "hello world" )
103
- driver_wait . until ( lambda d : input_2 .get_attribute ( " value" ) == "hello world" )
106
+ assert ( await input_1 .evaluate ( "e => e. value" )) == "hello world"
107
+ assert ( await input_2 .evaluate ( "e => e. value" )) == "hello world"
104
108
105
109
106
- def test_use_linked_inputs_on_change (driver , driver_wait , display ):
110
+ async def test_use_linked_inputs_on_change (display : DisplayFixture ):
107
111
value = idom .Ref (None )
108
112
109
113
@idom .component
@@ -114,21 +118,24 @@ def SomeComponent():
114
118
)
115
119
return idom .html .div (i_1 , i_2 )
116
120
117
- display (SomeComponent )
121
+ page = await display .show (SomeComponent )
122
+
123
+ input_1 = await page .wait_for_selector ("#i_1" )
124
+ input_2 = await page .wait_for_selector ("#i_2" )
118
125
119
- input_1 = driver .find_element ("id" , "i_1" )
120
- input_2 = driver .find_element ("id" , "i_2" )
126
+ await input_1 .type ("hello" , delay = 20 )
121
127
122
- send_keys ( input_1 , "hello" )
128
+ poll_value = poll ( lambda : value . current )
123
129
124
- driver_wait . until ( lambda d : value . current == "hello" )
130
+ poll_value . eq ( "hello" )
125
131
126
- send_keys (input_2 , " world" )
132
+ await input_2 .focus ()
133
+ await input_2 .type (" world" , delay = 20 )
127
134
128
- driver_wait . until ( lambda d : value . current == "hello world" )
135
+ poll_value . eq ( "hello world" )
129
136
130
137
131
- def test_use_linked_inputs_on_change_with_cast (driver , driver_wait , display ):
138
+ async def test_use_linked_inputs_on_change_with_cast (display : DisplayFixture ):
132
139
value = idom .Ref (None )
133
140
134
141
@idom .component
@@ -138,21 +145,24 @@ def SomeComponent():
138
145
)
139
146
return idom .html .div (i_1 , i_2 )
140
147
141
- display (SomeComponent )
148
+ page = await display . show (SomeComponent )
142
149
143
- input_1 = driver . find_element ( "id" , " i_1" )
144
- input_2 = driver . find_element ( "id" , " i_2" )
150
+ input_1 = await page . wait_for_selector ( "# i_1" )
151
+ input_2 = await page . wait_for_selector ( "# i_2" )
145
152
146
- send_keys ( input_1 , "1" )
153
+ await input_1 . type ( "1" )
147
154
148
- driver_wait . until (lambda d : value .current == 1 )
155
+ poll_value = poll (lambda : value .current )
149
156
150
- send_keys ( input_2 , "2" )
157
+ poll_value . eq ( 1 )
151
158
152
- driver_wait .until (lambda d : value .current == 12 )
159
+ await input_2 .focus ()
160
+ await input_2 .type ("2" )
153
161
162
+ poll_value .eq (12 )
154
163
155
- def test_use_linked_inputs_ignore_empty (driver , driver_wait , display ):
164
+
165
+ async def test_use_linked_inputs_ignore_empty (display : DisplayFixture ):
156
166
value = idom .Ref (None )
157
167
158
168
@idom .component
@@ -164,19 +174,22 @@ def SomeComponent():
164
174
)
165
175
return idom .html .div (i_1 , i_2 )
166
176
167
- display (SomeComponent )
177
+ page = await display .show (SomeComponent )
178
+
179
+ input_1 = await page .wait_for_selector ("#i_1" )
180
+ input_2 = await page .wait_for_selector ("#i_2" )
168
181
169
- input_1 = driver .find_element ("id" , "i_1" )
170
- input_2 = driver .find_element ("id" , "i_2" )
182
+ await input_1 .type ("1" )
171
183
172
- send_keys ( input_1 , "1" )
184
+ poll_value = poll ( lambda : value . current )
173
185
174
- driver_wait . until ( lambda d : value . current == "1" )
186
+ poll_value . eq ( "1" )
175
187
176
- send_keys (input_2 , Keys .BACKSPACE )
188
+ await input_2 .focus ()
189
+ await input_2 .press ("Backspace" )
177
190
178
- assert value . current == "1"
191
+ poll_value . eq ( "1" )
179
192
180
- send_keys ( input_1 , "2" )
193
+ await input_1 . type ( "2" )
181
194
182
- driver_wait . until ( lambda d : value . current == "2" )
195
+ poll_value . eq ( "2" )
0 commit comments