test_window_handles.py (6696B)
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 from urllib.parse import quote 8 9 from marionette_driver import errors 10 from marionette_harness import MarionetteTestCase, WindowManagerMixin 11 12 # add this directory to the path 13 sys.path.append(os.path.dirname(__file__)) 14 15 from chrome_handler_mixin import ChromeHandlerMixin 16 17 18 def inline(doc): 19 return "data:text/html;charset=utf-8,{}".format(quote(doc)) 20 21 22 class TestWindowHandles(ChromeHandlerMixin, WindowManagerMixin, MarionetteTestCase): 23 def setUp(self): 24 super(TestWindowHandles, self).setUp() 25 26 self.chrome_dialog = self.chrome_base_url + "test.xhtml" 27 28 def tearDown(self): 29 self.close_all_windows() 30 self.close_all_tabs() 31 32 super(TestWindowHandles, self).tearDown() 33 34 def assert_window_handles(self): 35 try: 36 self.assertIsInstance(self.marionette.current_window_handle, str) 37 except errors.NoSuchWindowException: 38 pass 39 40 for handle in self.marionette.window_handles: 41 self.assertIsInstance(handle, str) 42 43 def test_window_handles_after_opening_new_tab(self): 44 new_tab = self.open_tab() 45 self.assert_window_handles() 46 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 47 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 48 49 self.marionette.switch_to_window(new_tab) 50 self.assert_window_handles() 51 self.assertEqual(self.marionette.current_window_handle, new_tab) 52 53 self.marionette.switch_to_window(self.start_tab) 54 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 55 56 self.marionette.switch_to_window(new_tab) 57 self.marionette.close() 58 self.assert_window_handles() 59 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 60 61 self.marionette.switch_to_window(self.start_tab) 62 self.assert_window_handles() 63 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 64 65 def test_window_handles_after_opening_new_browser_window(self): 66 new_tab = self.open_window() 67 self.assert_window_handles() 68 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 69 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 70 71 self.marionette.switch_to_window(new_tab) 72 self.assert_window_handles() 73 self.assertEqual(self.marionette.current_window_handle, new_tab) 74 75 # Close the opened window and carry on in our original tab. 76 self.marionette.close() 77 self.assert_window_handles() 78 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 79 80 self.marionette.switch_to_window(self.start_tab) 81 self.assert_window_handles() 82 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 83 84 def test_window_handles_after_opening_new_non_browser_window(self): 85 new_window = self.open_chrome_window(self.chrome_dialog) 86 self.assert_window_handles() 87 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 88 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 89 self.assertNotIn(new_window, self.marionette.window_handles) 90 91 self.marionette.switch_to_window(new_window) 92 self.assert_window_handles() 93 94 # Check that the opened window is not accessible via window handles 95 with self.assertRaises(errors.NoSuchWindowException): 96 self.marionette.current_window_handle 97 with self.assertRaises(errors.NoSuchWindowException): 98 self.marionette.close() 99 100 # Close the opened window and carry on in our original tab. 101 self.marionette.close_chrome_window() 102 self.assert_window_handles() 103 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 104 105 self.marionette.switch_to_window(self.start_tab) 106 self.assert_window_handles() 107 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 108 109 def test_window_handles_after_session_created(self): 110 new_window = self.open_chrome_window(self.chrome_dialog) 111 self.assert_window_handles() 112 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 113 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 114 self.assertNotIn(new_window, self.marionette.window_handles) 115 116 window_handles = self.marionette.window_handles 117 118 self.marionette.delete_session() 119 self.marionette.start_session() 120 121 self.assert_window_handles() 122 123 # For a new session the window handles will have a new uuid as value 124 self.assertEqual(len(window_handles), len(self.marionette.window_handles)) 125 for item in self.marionette.window_handles: 126 self.assertNotIn(item, window_handles) 127 128 def test_window_handles_include_unloaded_tabs(self): 129 new_tab = self.open_tab() 130 self.assert_window_handles() 131 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 132 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 133 134 self.marionette.switch_to_window(new_tab) 135 self.assert_window_handles() 136 self.assertEqual(self.marionette.current_window_handle, new_tab) 137 138 # The restart will cause the background tab to stay unloaded 139 self.marionette.restart(in_app=True) 140 141 self.assert_window_handles() 142 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 143 144 def test_window_handles_after_closing_original_tab(self): 145 new_tab = self.open_tab() 146 self.assert_window_handles() 147 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs) + 1) 148 self.assertEqual(self.marionette.current_window_handle, self.start_tab) 149 self.assertIn(new_tab, self.marionette.window_handles) 150 151 self.marionette.close() 152 self.assert_window_handles() 153 self.assertEqual(len(self.marionette.window_handles), len(self.start_tabs)) 154 self.assertNotIn(self.start_tab, self.marionette.window_handles) 155 156 self.marionette.switch_to_window(new_tab) 157 self.assert_window_handles() 158 self.assertEqual(self.marionette.current_window_handle, new_tab) 159 160 def test_window_handles_after_closing_last_tab(self): 161 self.close_all_tabs() 162 self.assertEqual(self.marionette.close(), [])