test_chrome_window_handles.py (10856B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 5 import os 6 import sys 7 8 from marionette_driver import errors 9 from marionette_harness import MarionetteTestCase, WindowManagerMixin 10 11 # add this directory to the path 12 sys.path.append(os.path.dirname(__file__)) 13 14 from chrome_handler_mixin import ChromeHandlerMixin 15 16 17 class TestWindowHandles(ChromeHandlerMixin, WindowManagerMixin, MarionetteTestCase): 18 def setUp(self): 19 super(TestWindowHandles, self).setUp() 20 21 self.chrome_dialog = self.chrome_base_url + "test.xhtml" 22 23 self.marionette.set_context("chrome") 24 25 def tearDown(self): 26 self.close_all_windows() 27 self.close_all_tabs() 28 29 super(TestWindowHandles, self).tearDown() 30 31 def assert_window_handles(self): 32 try: 33 self.assertIsInstance(self.marionette.current_chrome_window_handle, str) 34 self.assertIsInstance(self.marionette.current_window_handle, str) 35 except errors.NoSuchWindowException: 36 pass 37 38 for handle in self.marionette.chrome_window_handles: 39 self.assertIsInstance(handle, str) 40 41 for handle in self.marionette.window_handles: 42 self.assertIsInstance(handle, str) 43 44 def test_chrome_window_handles_with_scopes(self): 45 new_browser = self.open_window() 46 self.assert_window_handles() 47 self.assertEqual( 48 len(self.marionette.chrome_window_handles), len(self.start_windows) + 1 49 ) 50 self.assertIn(new_browser, self.marionette.chrome_window_handles) 51 self.assertEqual( 52 self.marionette.current_chrome_window_handle, self.start_window 53 ) 54 55 new_dialog = self.open_chrome_window(self.chrome_dialog) 56 self.assert_window_handles() 57 self.assertEqual( 58 len(self.marionette.chrome_window_handles), len(self.start_windows) + 2 59 ) 60 self.assertIn(new_dialog, self.marionette.chrome_window_handles) 61 self.assertEqual( 62 self.marionette.current_chrome_window_handle, self.start_window 63 ) 64 65 chrome_window_handles_in_chrome_scope = self.marionette.chrome_window_handles 66 window_handles_in_chrome_scope = self.marionette.window_handles 67 68 with self.marionette.using_context("content"): 69 self.assertEqual( 70 self.marionette.chrome_window_handles, 71 chrome_window_handles_in_chrome_scope, 72 ) 73 self.assertEqual( 74 self.marionette.window_handles, window_handles_in_chrome_scope 75 ) 76 77 def test_chrome_window_handles_after_opening_new_chrome_window(self): 78 new_window = self.open_chrome_window(self.chrome_dialog) 79 self.assert_window_handles() 80 self.assertEqual( 81 len(self.marionette.chrome_window_handles), len(self.start_windows) + 1 82 ) 83 self.assertIn(new_window, self.marionette.chrome_window_handles) 84 self.assertEqual( 85 self.marionette.current_chrome_window_handle, self.start_window 86 ) 87 88 # Check that the new chrome window has the correct URL loaded 89 self.marionette.switch_to_window(new_window) 90 self.assert_window_handles() 91 self.assertEqual(self.marionette.current_chrome_window_handle, new_window) 92 self.assertEqual(self.marionette.get_url(), self.chrome_dialog) 93 94 # Close the chrome window, and carry on in our original window. 95 self.marionette.close_chrome_window() 96 self.assert_window_handles() 97 self.assertEqual( 98 len(self.marionette.chrome_window_handles), len(self.start_windows) 99 ) 100 self.assertNotIn(new_window, self.marionette.chrome_window_handles) 101 102 self.marionette.switch_to_window(self.start_window) 103 self.assert_window_handles() 104 self.assertEqual( 105 self.marionette.current_chrome_window_handle, self.start_window 106 ) 107 108 def test_chrome_window_handles_after_opening_new_window(self): 109 new_window = self.open_window() 110 self.assert_window_handles() 111 self.assertEqual( 112 len(self.marionette.chrome_window_handles), len(self.start_windows) + 1 113 ) 114 self.assertIn(new_window, self.marionette.chrome_window_handles) 115 self.assertEqual( 116 self.marionette.current_chrome_window_handle, self.start_window 117 ) 118 119 self.marionette.switch_to_window(new_window) 120 self.assert_window_handles() 121 self.assertEqual(self.marionette.current_chrome_window_handle, new_window) 122 123 # Close the opened window and carry on in our original window. 124 self.marionette.close() 125 self.assert_window_handles() 126 self.assertEqual( 127 len(self.marionette.chrome_window_handles), len(self.start_windows) 128 ) 129 self.assertNotIn(new_window, self.marionette.chrome_window_handles) 130 131 self.marionette.switch_to_window(self.start_window) 132 self.assert_window_handles() 133 self.assertEqual( 134 self.marionette.current_chrome_window_handle, self.start_window 135 ) 136 137 def test_chrome_window_handles_after_session_created(self): 138 new_window = self.open_chrome_window(self.chrome_dialog) 139 self.assert_window_handles() 140 self.assertEqual( 141 len(self.marionette.chrome_window_handles), len(self.start_windows) + 1 142 ) 143 self.assertIn(new_window, self.marionette.chrome_window_handles) 144 self.assertEqual( 145 self.marionette.current_chrome_window_handle, self.start_window 146 ) 147 148 chrome_window_handles = self.marionette.chrome_window_handles 149 150 self.marionette.delete_session() 151 self.marionette.start_session() 152 153 self.assert_window_handles() 154 155 # For a new session the window handles will have a new uuid as value 156 self.assertEqual( 157 len(chrome_window_handles), len(self.marionette.chrome_window_handles) 158 ) 159 for item in self.marionette.chrome_window_handles: 160 self.assertNotIn(item, chrome_window_handles) 161 162 def test_window_handles_after_opening_new_tab(self): 163 with self.marionette.using_context("content"): 164 new_tab = self.open_tab() 165 self.assert_window_handles() 166 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 167 self.assertIn(new_tab, self.marionette.window_handles) 168 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 169 170 self.marionette.switch_to_window(new_tab) 171 self.assert_window_handles() 172 self.assertEqual(self.marionette.current_window_handle, new_tab) 173 174 self.marionette.switch_to_window(self.start_tab) 175 self.assert_window_handles() 176 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 177 178 self.marionette.switch_to_window(new_tab) 179 self.marionette.close() 180 self.assert_window_handles() 181 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 182 self.assertNotIn(new_tab, self.marionette.window_handles) 183 184 self.marionette.switch_to_window(self.start_tab) 185 self.assert_window_handles() 186 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 187 188 def test_window_handles_after_opening_new_foreground_tab(self): 189 with self.marionette.using_context("content"): 190 new_tab = self.open_tab(focus=True) 191 self.assert_window_handles() 192 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 193 self.assertIn(new_tab, self.marionette.window_handles) 194 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 195 196 # We still have the default tab set as our window handle. This 197 # get_url command should be sent immediately, and not be forever-queued. 198 with self.marionette.using_context("content"): 199 self.marionette.get_url() 200 201 self.marionette.switch_to_window(new_tab) 202 self.assert_window_handles() 203 self.assertEqual(self.marionette.current_window_handle, new_tab) 204 205 self.marionette.close() 206 self.assert_window_handles() 207 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 208 self.assertNotIn(new_tab, self.marionette.window_handles) 209 210 self.marionette.switch_to_window(self.start_tab) 211 self.assert_window_handles() 212 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 213 214 def test_window_handles_after_opening_new_chrome_window(self): 215 new_window = self.open_chrome_window(self.chrome_dialog) 216 self.assert_window_handles() 217 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 218 self.assertNotIn(new_window, self.marionette.window_handles) 219 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 220 221 self.marionette.switch_to_window(new_window) 222 self.assert_window_handles() 223 self.assertEqual(self.marionette.get_url(), self.chrome_dialog) 224 225 # Check that the opened dialog is not accessible via window handles 226 with self.assertRaises(errors.NoSuchWindowException): 227 self.marionette.current_window_handle 228 with self.assertRaises(errors.NoSuchWindowException): 229 self.marionette.close() 230 231 # Close the dialog and carry on in our original tab. 232 self.marionette.close_chrome_window() 233 self.assert_window_handles() 234 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 235 236 self.marionette.switch_to_window(self.start_tab) 237 self.assert_window_handles() 238 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 239 240 def test_window_handles_after_closing_original_tab(self): 241 with self.marionette.using_context("content"): 242 new_tab = self.open_tab() 243 self.assert_window_handles() 244 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 245 self.assertIn(new_tab, self.marionette.window_handles) 246 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 247 248 self.marionette.close() 249 self.assert_window_handles() 250 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 251 self.assertIn(new_tab, self.marionette.window_handles) 252 253 self.marionette.switch_to_window(new_tab) 254 self.assert_window_handles() 255 self.assertEqual(self.marionette.current_window_handle, new_tab) 256 257 def test_window_handles_after_closing_last_window(self): 258 self.close_all_windows() 259 self.assertEqual(self.marionette.close_chrome_window(), [])