3
3
except ImportError :
4
4
from unittest import mock
5
5
6
- from selenium .webdriver .common .by import By
7
6
from selenium .webdriver .common .keys import Keys
8
7
9
- from explicit import waiter
10
-
11
- CSS = By .CSS_SELECTOR
8
+ from explicit import waiter , CSS , ID , XPATH
12
9
13
10
14
11
def test_find_element_with_defaults (driver , element ):
@@ -35,13 +32,13 @@ def test_find_element_with_non_defaults(driver, element):
35
32
36
33
driver .find_element .side_effect = [None , element ]
37
34
38
- elem = waiter .find_element (driver , mock_xpath_path , by = By . XPATH )
35
+ elem = waiter .find_element (driver , mock_xpath_path , by = XPATH )
39
36
40
37
assert driver .find_element .called
41
38
assert elem is element
42
39
assert len (driver .mock_calls ) == 2
43
- assert driver .find_element .call_args_list == [mock .call (By . XPATH , mock_xpath_path ),
44
- mock .call (By . XPATH , mock_xpath_path )]
40
+ assert driver .find_element .call_args_list == [mock .call (XPATH , mock_xpath_path ),
41
+ mock .call (XPATH , mock_xpath_path )]
45
42
46
43
47
44
def test_find_elements_with_defaults (driver , element ):
@@ -69,14 +66,14 @@ def test_find_elements_with_non_defaults(driver, element):
69
66
70
67
driver .find_elements .side_effect = [None , [element , element ]]
71
68
72
- elem_list = waiter .find_elements (driver , mock_xpath_path , by = By . XPATH )
69
+ elem_list = waiter .find_elements (driver , mock_xpath_path , by = XPATH )
73
70
74
71
assert driver .find_elements .called
75
72
assert isinstance (elem_list , list )
76
73
assert all (map (lambda x : x is element , elem_list ))
77
74
assert len (driver .mock_calls ) == 2
78
- assert driver .find_elements .call_args_list == [mock .call (By . XPATH , mock_xpath_path ),
79
- mock .call (By . XPATH , mock_xpath_path )]
75
+ assert driver .find_elements .call_args_list == [mock .call (XPATH , mock_xpath_path ),
76
+ mock .call (XPATH , mock_xpath_path )]
80
77
81
78
82
79
def test_find_write_with_defaults (driver , element ):
@@ -113,17 +110,55 @@ def test_find_write_with_non_defaults(driver, element):
113
110
driver .find_element .side_effect = [None , element ]
114
111
115
112
elem = waiter .find_write (driver , mock_id_path , mock_write_string ,
116
- by = By . ID , clear_first = False , send_enter = True )
113
+ by = ID , clear_first = False , send_enter = True )
117
114
118
115
# Element locating asserts
119
116
assert driver .find_element .called
120
117
assert elem is element
121
118
assert len (driver .mock_calls ) == 2
122
- assert driver .find_element .call_args_list == [mock .call (By . ID , mock_id_path ),
123
- mock .call (By . ID , mock_id_path )]
119
+ assert driver .find_element .call_args_list == [mock .call (ID , mock_id_path ),
120
+ mock .call (ID , mock_id_path )]
124
121
125
122
# Element writing asserts
126
123
assert not elem .clear .called
127
124
assert len (elem .send_keys .call_args_list ) == 2
128
125
assert elem .send_keys .call_args_list == [mock .call (mock_write_string ),
129
126
mock .call (Keys .ENTER )]
127
+
128
+
129
+ def test_find_one_with_defaults (driver , element ):
130
+ """ Verify the waiter can locate one of several possible elements """
131
+ side_effects = [[], [], [element , ], []]
132
+ driver .find_elements_by_css_selector .side_effect = side_effects
133
+
134
+ div1 = 'div.mock_1'
135
+ div2 = 'div.mock_2'
136
+
137
+ locators = [div1 , div2 ]
138
+ elem = waiter .find_one (driver , locators )
139
+
140
+ assert elem is element
141
+ assert driver .method_calls == [mock .call .find_elements_by_css_selector (div1 ),
142
+ mock .call .find_elements_by_css_selector (div2 ),
143
+ mock .call .find_elements_by_css_selector (div1 ),
144
+ mock .call .find_elements_by_css_selector (div2 )]
145
+
146
+
147
+ def test_find_one_with_non_defaults (driver , element ):
148
+ """ Verify the waiter can locate one of several possible elements,
149
+ using non-default function parameters
150
+ """
151
+ side_effects = [[], [], [element , ], []]
152
+ driver .find_elements_by_id .side_effect = side_effects
153
+
154
+ id_1 = 'mock_1'
155
+ id_2 = 'mock_2'
156
+
157
+ locators = [id_1 , id_2 ]
158
+ elem = waiter .find_one (driver , locators , elem_type = ID , timeout = 20 )
159
+
160
+ assert elem is element
161
+ assert driver .method_calls == [mock .call .find_elements_by_id (id_1 ),
162
+ mock .call .find_elements_by_id (id_2 ),
163
+ mock .call .find_elements_by_id (id_1 ),
164
+ mock .call .find_elements_by_id (id_2 )]
0 commit comments