15
15
16
16
import pytest
17
17
from selenium .webdriver .common .by import By
18
+ from selenium .webdriver .support import expected_conditions as EC
19
+ from selenium .webdriver .support .wait import WebDriverWait
18
20
from selenium .common .exceptions import ElementNotVisibleException
21
+ from selenium .common .exceptions import InvalidElementStateException
19
22
from selenium .common .exceptions import NoAlertPresentException
20
23
21
24
import unittest
@@ -28,19 +31,29 @@ def testShouldBeAbleToOverrideTheWindowAlertMethod(self):
28
31
self .driver .execute_script (
29
32
"window.alert = function(msg) { document.getElementById('text').innerHTML = msg; }" )
30
33
self .driver .find_element (by = By .ID , value = "alert" ).click ()
34
+ try :
35
+ self .assertEqual (self .driver .find_element_by_id ('text' ).text , "cheese" )
36
+ except Exception , e :
37
+ # if we're here, likely the alert is displayed
38
+ # not dismissing it will affect other tests
39
+ try :
40
+ self ._waitForAlert ().dismiss ()
41
+ except Exception :
42
+ pass
43
+ raise e
31
44
32
45
def testShouldAllowUsersToAcceptAnAlertManually (self ):
33
46
self ._loadPage ("alerts" )
34
47
self .driver .find_element (by = By .ID , value = "alert" ).click ()
35
- alert = self .driver . switch_to_alert ()
48
+ alert = self ._waitForAlert ()
36
49
alert .accept ()
37
50
# If we can perform any action, we're good to go
38
51
self .assertEqual ("Testing Alerts" , self .driver .title )
39
52
40
53
def testShouldAllowUsersToAcceptAnAlertWithNoTextManually (self ):
41
54
self ._loadPage ("alerts" )
42
55
self .driver .find_element (By .ID ,"empty-alert" ).click ();
43
- alert = self .driver . switch_to_alert ()
56
+ alert = self ._waitForAlert ()
44
57
alert .accept ()
45
58
46
59
# If we can perform any action, we're good to go
@@ -54,7 +67,7 @@ def testShouldGetTextOfAlertOpenedInSetTimeout(self):
54
67
# This is a regression test for a bug where only the first switchTo call would throw,
55
68
# and only if it happens before the alert actually loads.
56
69
57
- alert = self .driver . switch_to_alert ()
70
+ alert = self ._waitForAlert ()
58
71
try :
59
72
self .assertEqual ("Slow" , alert .text )
60
73
finally :
@@ -64,15 +77,15 @@ def testShouldGetTextOfAlertOpenedInSetTimeout(self):
64
77
def testShouldAllowUsersToDismissAnAlertManually (self ):
65
78
self ._loadPage ("alerts" )
66
79
self .driver .find_element (by = By .ID , value = "alert" ).click ()
67
- alert = self .driver . switch_to_alert ()
80
+ alert = self ._waitForAlert ()
68
81
alert .dismiss ()
69
82
# If we can perform any action, we're good to go
70
83
self .assertEqual ("Testing Alerts" , self .driver .title )
71
84
72
85
def testShouldAllowAUserToAcceptAPrompt (self ):
73
86
self ._loadPage ("alerts" )
74
87
self .driver .find_element (by = By .ID , value = "prompt" ).click ()
75
- alert = self .driver . switch_to_alert ()
88
+ alert = self ._waitForAlert ()
76
89
alert .accept ()
77
90
78
91
# If we can perform any action, we're good to go
@@ -81,7 +94,7 @@ def testShouldAllowAUserToAcceptAPrompt(self):
81
94
def testShouldAllowAUserToDismissAPrompt (self ):
82
95
self ._loadPage ("alerts" )
83
96
self .driver .find_element (by = By .ID , value = "prompt" ).click ()
84
- alert = self .driver . switch_to_alert ()
97
+ alert = self ._waitForAlert ()
85
98
alert .dismiss ()
86
99
87
100
# If we can perform any action, we're good to go
@@ -90,7 +103,7 @@ def testShouldAllowAUserToDismissAPrompt(self):
90
103
def testShouldAllowAUserToSetTheValueOfAPrompt (self ):
91
104
self ._loadPage ("alerts" )
92
105
self .driver .find_element (by = By .ID , value = "prompt" ).click ()
93
- alert = self .driver . switch_to_alert ()
106
+ alert = self ._waitForAlert ()
94
107
alert .send_keys ("cheese" )
95
108
alert .accept ()
96
109
@@ -101,20 +114,22 @@ def testSettingTheValueOfAnAlertThrows(self):
101
114
self ._loadPage ("alerts" )
102
115
self .driver .find_element (By .ID ,"alert" ).click ();
103
116
104
- alert = self .driver . switch_to_alert ()
117
+ alert = self ._waitForAlert ()
105
118
try :
106
119
alert .send_keys ("cheese" );
107
120
self .fail ("Expected exception" );
108
121
except ElementNotVisibleException :
109
122
pass
123
+ except InvalidElementStateException :
124
+ pass
110
125
finally :
111
126
alert .accept ()
112
127
113
128
def testAlertShouldNotAllowAdditionalCommandsIfDimissed (self ):
114
129
self ._loadPage ("alerts" );
115
130
self .driver .find_element (By .ID , "alert" ).click ()
116
131
117
- alert = self .driver . switch_to_alert ()
132
+ alert = self ._waitForAlert ()
118
133
alert .dismiss ()
119
134
120
135
try :
@@ -128,7 +143,7 @@ def testShouldAllowUsersToAcceptAnAlertInAFrame(self):
128
143
self .driver .switch_to_frame ("iframeWithAlert" )
129
144
self .driver .find_element_by_id ("alertInFrame" ).click ()
130
145
131
- alert = self .driver . switch_to_alert ()
146
+ alert = self ._waitForAlert ()
132
147
alert .accept ()
133
148
134
149
self .assertEqual ("Testing Alerts" , self .driver .title )
@@ -140,7 +155,7 @@ def testShouldAllowUsersToAcceptAnAlertInANestedFrame(self):
140
155
141
156
self .driver .find_element_by_id ("alertInFrame" ).click ()
142
157
143
- alert = self .driver . switch_to_alert ()
158
+ alert = self ._waitForAlert ()
144
159
alert .accept ()
145
160
146
161
self .assertEqual ("Testing Alerts" , self .driver .title )
@@ -153,7 +168,7 @@ def testPromptShouldUseDefaultValueIfNoKeysSent(self):
153
168
self ._loadPage ("alerts" )
154
169
self .driver .find_element (By .ID , "prompt-with-default" ).click ()
155
170
156
- alert = self .driver . switch_to_alert ()
171
+ alert = self ._waitForAlert ()
157
172
alert .accept ()
158
173
159
174
txt = self .driver .find_element (By .ID , "text" ).text
@@ -162,7 +177,7 @@ def testPromptShouldUseDefaultValueIfNoKeysSent(self):
162
177
def testPromptShouldHaveNullValueIfDismissed (self ):
163
178
self ._loadPage ("alerts" )
164
179
self .driver .find_element (By .ID , "prompt-with-default" ).click ()
165
- alert = self .driver . switch_to_alert ()
180
+ alert = self ._waitForAlert ()
166
181
alert .dismiss ()
167
182
168
183
self .assertEqual ("null" , self .driver .find_element (By .ID , "text" ).text )
@@ -172,11 +187,11 @@ def testHandlesTwoAlertsFromOneInteraction(self):
172
187
173
188
self .driver .find_element (By .ID , "double-prompt" ).click ()
174
189
175
- alert1 = self .driver . switch_to_alert ()
190
+ alert1 = self ._waitForAlert ()
176
191
alert1 .send_keys ("brie" )
177
192
alert1 .accept ()
178
193
179
- alert2 = self .driver . switch_to_alert ()
194
+ alert2 = self ._waitForAlert ()
180
195
alert2 .send_keys ("cheddar" )
181
196
alert2 .accept ();
182
197
@@ -185,7 +200,7 @@ def testHandlesTwoAlertsFromOneInteraction(self):
185
200
def testShouldHandleAlertOnPageLoad (self ):
186
201
self ._loadPage ("alerts" )
187
202
self .driver .find_element (By .ID , "open-page-with-onload-alert" ).click ()
188
- alert = self .driver . switch_to_alert ()
203
+ alert = self ._waitForAlert ()
189
204
value = alert .text
190
205
alert .accept ()
191
206
@@ -194,10 +209,13 @@ def testShouldHandleAlertOnPageLoad(self):
194
209
def testShouldAllowTheUserToGetTheTextOfAnAlert (self ):
195
210
self ._loadPage ("alerts" )
196
211
self .driver .find_element (by = By .ID , value = "alert" ).click ()
197
- alert = self .driver . switch_to_alert ()
212
+ alert = self ._waitForAlert ()
198
213
value = alert .text
199
214
alert .accept ()
200
215
self .assertEqual ("cheese" , value )
216
+
217
+ def _waitForAlert (self ):
218
+ return WebDriverWait (self .driver , 3 ).until (EC .alert_is_present ())
201
219
202
220
def _pageURL (self , name ):
203
221
return "http://localhost:%d/%s.html" % (self .webserver .port , name )
@@ -206,4 +224,9 @@ def _loadSimplePage(self):
206
224
self ._loadPage ("simpleTest" )
207
225
208
226
def _loadPage (self , name ):
227
+ try :
228
+ # just in case a previous test left open an alert
229
+ self .driver .switch_to_alert ().dismiss ()
230
+ except :
231
+ pass
209
232
self .driver .get (self ._pageURL (name ))
0 commit comments