Skip to content

Commit a6a39e4

Browse files
committed
updating alert tests to 'wait' for alert to appear. iOS alerts appear asynchronously.
1 parent 3f5ee5c commit a6a39e4

File tree

1 file changed

+40
-17
lines changed

1 file changed

+40
-17
lines changed

py/test/selenium/webdriver/common/alerts_tests.py

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,10 @@
1515

1616
import pytest
1717
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
1820
from selenium.common.exceptions import ElementNotVisibleException
21+
from selenium.common.exceptions import InvalidElementStateException
1922
from selenium.common.exceptions import NoAlertPresentException
2023

2124
import unittest
@@ -28,19 +31,29 @@ def testShouldBeAbleToOverrideTheWindowAlertMethod(self):
2831
self.driver.execute_script(
2932
"window.alert = function(msg) { document.getElementById('text').innerHTML = msg; }")
3033
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
3144

3245
def testShouldAllowUsersToAcceptAnAlertManually(self):
3346
self._loadPage("alerts")
3447
self.driver.find_element(by=By.ID, value="alert").click()
35-
alert = self.driver.switch_to_alert()
48+
alert = self._waitForAlert()
3649
alert.accept()
3750
# If we can perform any action, we're good to go
3851
self.assertEqual("Testing Alerts", self.driver.title)
3952

4053
def testShouldAllowUsersToAcceptAnAlertWithNoTextManually(self):
4154
self._loadPage("alerts")
4255
self.driver.find_element(By.ID,"empty-alert").click();
43-
alert = self.driver.switch_to_alert()
56+
alert = self._waitForAlert()
4457
alert.accept()
4558

4659
# If we can perform any action, we're good to go
@@ -54,7 +67,7 @@ def testShouldGetTextOfAlertOpenedInSetTimeout(self):
5467
# This is a regression test for a bug where only the first switchTo call would throw,
5568
# and only if it happens before the alert actually loads.
5669

57-
alert = self.driver.switch_to_alert()
70+
alert = self._waitForAlert()
5871
try:
5972
self.assertEqual("Slow", alert.text)
6073
finally:
@@ -64,15 +77,15 @@ def testShouldGetTextOfAlertOpenedInSetTimeout(self):
6477
def testShouldAllowUsersToDismissAnAlertManually(self):
6578
self._loadPage("alerts")
6679
self.driver.find_element(by=By.ID, value="alert").click()
67-
alert = self.driver.switch_to_alert()
80+
alert = self._waitForAlert()
6881
alert.dismiss()
6982
# If we can perform any action, we're good to go
7083
self.assertEqual("Testing Alerts", self.driver.title)
7184

7285
def testShouldAllowAUserToAcceptAPrompt(self):
7386
self._loadPage("alerts")
7487
self.driver.find_element(by=By.ID, value="prompt").click()
75-
alert = self.driver.switch_to_alert()
88+
alert = self._waitForAlert()
7689
alert.accept()
7790

7891
# If we can perform any action, we're good to go
@@ -81,7 +94,7 @@ def testShouldAllowAUserToAcceptAPrompt(self):
8194
def testShouldAllowAUserToDismissAPrompt(self):
8295
self._loadPage("alerts")
8396
self.driver.find_element(by=By.ID, value="prompt").click()
84-
alert = self.driver.switch_to_alert()
97+
alert = self._waitForAlert()
8598
alert.dismiss()
8699

87100
# If we can perform any action, we're good to go
@@ -90,7 +103,7 @@ def testShouldAllowAUserToDismissAPrompt(self):
90103
def testShouldAllowAUserToSetTheValueOfAPrompt(self):
91104
self._loadPage("alerts")
92105
self.driver.find_element(by=By.ID, value="prompt").click()
93-
alert = self.driver.switch_to_alert()
106+
alert = self._waitForAlert()
94107
alert.send_keys("cheese")
95108
alert.accept()
96109

@@ -101,20 +114,22 @@ def testSettingTheValueOfAnAlertThrows(self):
101114
self._loadPage("alerts")
102115
self.driver.find_element(By.ID,"alert").click();
103116

104-
alert = self.driver.switch_to_alert()
117+
alert = self._waitForAlert()
105118
try:
106119
alert.send_keys("cheese");
107120
self.fail("Expected exception");
108121
except ElementNotVisibleException:
109122
pass
123+
except InvalidElementStateException:
124+
pass
110125
finally:
111126
alert.accept()
112127

113128
def testAlertShouldNotAllowAdditionalCommandsIfDimissed(self):
114129
self._loadPage("alerts");
115130
self.driver.find_element(By.ID, "alert").click()
116131

117-
alert = self.driver.switch_to_alert()
132+
alert = self._waitForAlert()
118133
alert.dismiss()
119134

120135
try:
@@ -128,7 +143,7 @@ def testShouldAllowUsersToAcceptAnAlertInAFrame(self):
128143
self.driver.switch_to_frame("iframeWithAlert")
129144
self.driver.find_element_by_id("alertInFrame").click()
130145

131-
alert = self.driver.switch_to_alert()
146+
alert = self._waitForAlert()
132147
alert.accept()
133148

134149
self.assertEqual("Testing Alerts", self.driver.title)
@@ -140,7 +155,7 @@ def testShouldAllowUsersToAcceptAnAlertInANestedFrame(self):
140155

141156
self.driver.find_element_by_id("alertInFrame").click()
142157

143-
alert = self.driver.switch_to_alert()
158+
alert = self._waitForAlert()
144159
alert.accept()
145160

146161
self.assertEqual("Testing Alerts", self.driver.title)
@@ -153,7 +168,7 @@ def testPromptShouldUseDefaultValueIfNoKeysSent(self):
153168
self._loadPage("alerts")
154169
self.driver.find_element(By.ID, "prompt-with-default").click()
155170

156-
alert = self.driver.switch_to_alert()
171+
alert = self._waitForAlert()
157172
alert.accept()
158173

159174
txt = self.driver.find_element(By.ID, "text").text
@@ -162,7 +177,7 @@ def testPromptShouldUseDefaultValueIfNoKeysSent(self):
162177
def testPromptShouldHaveNullValueIfDismissed(self):
163178
self._loadPage("alerts")
164179
self.driver.find_element(By.ID, "prompt-with-default").click()
165-
alert = self.driver.switch_to_alert()
180+
alert = self._waitForAlert()
166181
alert.dismiss()
167182

168183
self.assertEqual("null", self.driver.find_element(By.ID, "text").text)
@@ -172,11 +187,11 @@ def testHandlesTwoAlertsFromOneInteraction(self):
172187

173188
self.driver.find_element(By.ID, "double-prompt").click()
174189

175-
alert1 = self.driver.switch_to_alert()
190+
alert1 = self._waitForAlert()
176191
alert1.send_keys("brie")
177192
alert1.accept()
178193

179-
alert2 = self.driver.switch_to_alert()
194+
alert2 = self._waitForAlert()
180195
alert2.send_keys("cheddar")
181196
alert2.accept();
182197

@@ -185,7 +200,7 @@ def testHandlesTwoAlertsFromOneInteraction(self):
185200
def testShouldHandleAlertOnPageLoad(self):
186201
self._loadPage("alerts")
187202
self.driver.find_element(By.ID, "open-page-with-onload-alert").click()
188-
alert = self.driver.switch_to_alert()
203+
alert = self._waitForAlert()
189204
value = alert.text
190205
alert.accept()
191206

@@ -194,10 +209,13 @@ def testShouldHandleAlertOnPageLoad(self):
194209
def testShouldAllowTheUserToGetTheTextOfAnAlert(self):
195210
self._loadPage("alerts")
196211
self.driver.find_element(by=By.ID, value="alert").click()
197-
alert = self.driver.switch_to_alert()
212+
alert = self._waitForAlert()
198213
value = alert.text
199214
alert.accept()
200215
self.assertEqual("cheese", value)
216+
217+
def _waitForAlert(self):
218+
return WebDriverWait(self.driver, 3).until(EC.alert_is_present())
201219

202220
def _pageURL(self, name):
203221
return "http://localhost:%d/%s.html" % (self.webserver.port, name)
@@ -206,4 +224,9 @@ def _loadSimplePage(self):
206224
self._loadPage("simpleTest")
207225

208226
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
209232
self.driver.get(self._pageURL(name))

0 commit comments

Comments
 (0)