|
15 | 15 | # specific language governing permissions and limitations |
16 | 16 | # under the License. |
17 | 17 |
|
18 | | -import pytest |
19 | | - |
20 | | -from selenium.webdriver.common.bidi.emulation import Emulation, GeolocationCoordinates |
| 18 | +from selenium.webdriver.common.bidi.emulation import Emulation, GeolocationCoordinates, GeolocationPositionError |
21 | 19 | from selenium.webdriver.common.window import WindowTypes |
22 | 20 |
|
23 | 21 |
|
24 | | -def get_browser_geolocation(driver): |
25 | | - # TODO: use the permissions module to grant geolocation permission when its implemented |
26 | | - # currently it needs to be granted manually in the browser GUI window, so CI will fail |
27 | | - |
28 | | - return driver.execute_async_script(""" |
29 | | - const callback = arguments[arguments.length - 1]; |
30 | | - navigator.geolocation.getCurrentPosition( |
31 | | - position => { |
32 | | - const coords = position.coords; |
33 | | - callback({ |
34 | | - latitude: coords.latitude, |
35 | | - longitude: coords.longitude, |
36 | | - accuracy: coords.accuracy, |
37 | | - altitude: coords.altitude, |
38 | | - altitudeAccuracy: coords.altitudeAccuracy, |
39 | | - heading: coords.heading, |
40 | | - speed: coords.speed, |
41 | | - timestamp: position.timestamp |
42 | | - }); |
43 | | - }, |
44 | | - error => { |
45 | | - callback({ error: error.message }); |
46 | | - } |
47 | | - ); |
48 | | - """) |
49 | | - |
50 | | - |
51 | | -def test_emulation_initialized(driver): |
52 | | - """Test that the emulation module is initialized properly.""" |
53 | | - assert driver.emulation is not None |
54 | | - assert isinstance(driver.emulation, Emulation) |
55 | | - |
56 | | - |
57 | | -def test_set_geolocation_override_with_coordinates_in_context(driver, pages): |
58 | | - """Test setting geolocation override with coordinates.""" |
59 | | - context_id = driver.current_window_handle |
60 | | - pages.load("blank.html") |
61 | | - coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
62 | | - |
63 | | - driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context_id]) |
64 | | - |
65 | | - result = get_browser_geolocation(driver) |
66 | | - |
67 | | - assert "error" not in result, f"Geolocation error: {result.get('error')}" |
68 | | - assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
69 | | - assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
70 | | - assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
71 | | - |
72 | | - |
73 | | -def test_set_geolocation_override_with_coordinates_in_user_context(driver, pages): |
74 | | - """Test setting geolocation override with coordinates in a user context.""" |
75 | | - # Create a user context |
76 | | - user_context = driver.browser.create_user_context() |
77 | | - |
78 | | - context_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context) |
79 | | - |
80 | | - driver.switch_to.window(context_id) |
81 | | - pages.load("blank.html") |
82 | | - |
83 | | - coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
84 | | - |
85 | | - driver.emulation.set_geolocation_override(coordinates=coords, user_contexts=[user_context]) |
86 | | - |
87 | | - result = get_browser_geolocation(driver) |
88 | | - |
89 | | - assert "error" not in result, f"Geolocation error: {result.get('error')}" |
90 | | - assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
91 | | - assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
92 | | - assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
93 | | - |
94 | | - driver.browsing_context.close(context_id) |
95 | | - driver.browser.remove_user_context(user_context) |
| 22 | +# def get_browser_geolocation(driver): |
| 23 | +# # TODO: use the permissions module to grant geolocation permission when its implemented |
| 24 | +# # currently it needs to be granted manually in the browser GUI window, so CI will fail |
| 25 | +# |
| 26 | +# return driver.execute_async_script(""" |
| 27 | +# const callback = arguments[arguments.length - 1]; |
| 28 | +# navigator.geolocation.getCurrentPosition( |
| 29 | +# position => { |
| 30 | +# const coords = position.coords; |
| 31 | +# callback({ |
| 32 | +# latitude: coords.latitude, |
| 33 | +# longitude: coords.longitude, |
| 34 | +# accuracy: coords.accuracy, |
| 35 | +# altitude: coords.altitude, |
| 36 | +# altitudeAccuracy: coords.altitudeAccuracy, |
| 37 | +# heading: coords.heading, |
| 38 | +# speed: coords.speed, |
| 39 | +# timestamp: position.timestamp |
| 40 | +# }); |
| 41 | +# }, |
| 42 | +# error => { |
| 43 | +# callback({ error: error.message }); |
| 44 | +# } |
| 45 | +# ); |
| 46 | +# """) |
| 47 | +# |
| 48 | +# |
| 49 | +# def test_emulation_initialized(driver): |
| 50 | +# """Test that the emulation module is initialized properly.""" |
| 51 | +# assert driver.emulation is not None |
| 52 | +# assert isinstance(driver.emulation, Emulation) |
| 53 | +# |
| 54 | +# |
| 55 | +# def test_set_geolocation_override_with_coordinates_in_context(driver, pages): |
| 56 | +# """Test setting geolocation override with coordinates.""" |
| 57 | +# context_id = driver.current_window_handle |
| 58 | +# pages.load("blank.html") |
| 59 | +# coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
| 60 | +# |
| 61 | +# driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context_id]) |
| 62 | +# |
| 63 | +# result = get_browser_geolocation(driver) |
| 64 | +# |
| 65 | +# assert "error" not in result, f"Geolocation error: {result.get('error')}" |
| 66 | +# assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
| 67 | +# assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
| 68 | +# assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
| 69 | +# |
| 70 | +# |
| 71 | +# def test_set_geolocation_override_with_coordinates_in_user_context(driver, pages): |
| 72 | +# """Test setting geolocation override with coordinates in a user context.""" |
| 73 | +# # Create a user context |
| 74 | +# user_context = driver.browser.create_user_context() |
| 75 | +# |
| 76 | +# context_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context) |
| 77 | +# |
| 78 | +# driver.switch_to.window(context_id) |
| 79 | +# pages.load("blank.html") |
| 80 | +# |
| 81 | +# coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
| 82 | +# |
| 83 | +# driver.emulation.set_geolocation_override(coordinates=coords, user_contexts=[user_context]) |
| 84 | +# |
| 85 | +# result = get_browser_geolocation(driver) |
| 86 | +# |
| 87 | +# assert "error" not in result, f"Geolocation error: {result.get('error')}" |
| 88 | +# assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
| 89 | +# assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
| 90 | +# assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
| 91 | +# |
| 92 | +# driver.browsing_context.close(context_id) |
| 93 | +# driver.browser.remove_user_context(user_context) |
| 94 | +# |
| 95 | +# |
| 96 | +# def test_set_geolocation_override_all_coords(driver, pages): |
| 97 | +# """Test setting geolocation override with coordinates.""" |
| 98 | +# context_id = driver.current_window_handle |
| 99 | +# pages.load("blank.html") |
| 100 | +# coords = GeolocationCoordinates( |
| 101 | +# 45.5, -122.4194, accuracy=10.0, altitude=100.2, altitude_accuracy=5.0, heading=183.2, speed=10.0 |
| 102 | +# ) |
| 103 | +# |
| 104 | +# driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context_id]) |
| 105 | +# |
| 106 | +# result = get_browser_geolocation(driver) |
| 107 | +# |
| 108 | +# assert "error" not in result, f"Geolocation error: {result.get('error')}" |
| 109 | +# assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
| 110 | +# assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
| 111 | +# assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
| 112 | +# assert abs(result["altitude"] - coords.altitude) < 0.0001, f"Altitude mismatch: {result['altitude']}" |
| 113 | +# assert abs(result["altitudeAccuracy"] - coords.altitude_accuracy) < 0.1, ( |
| 114 | +# f"Altitude accuracy mismatch: {result['altitudeAccuracy']}" |
| 115 | +# ) |
| 116 | +# assert abs(result["heading"] - coords.heading) < 0.1, f"Heading mismatch: {result['heading']}" |
| 117 | +# assert abs(result["speed"] - coords.speed) < 0.1, f"Speed mismatch: {result['speed']}" |
| 118 | +# |
| 119 | +# driver.browsing_context.close(context_id) |
| 120 | +# |
| 121 | +# |
| 122 | +# def test_set_geolocation_override_with_multiple_contexts(driver, pages): |
| 123 | +# """Test setting geolocation override with multiple browsing contexts.""" |
| 124 | +# # Create two browsing contexts |
| 125 | +# context1_id = driver.browsing_context.create(type=WindowTypes.TAB) |
| 126 | +# context2_id = driver.browsing_context.create(type=WindowTypes.TAB) |
| 127 | +# |
| 128 | +# coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
| 129 | +# |
| 130 | +# driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context1_id, context2_id]) |
| 131 | +# |
| 132 | +# # Test first context |
| 133 | +# driver.switch_to.window(context1_id) |
| 134 | +# pages.load("blank.html") |
| 135 | +# result1 = get_browser_geolocation(driver) |
| 136 | +# |
| 137 | +# assert "error" not in result1, f"Geolocation error in context1: {result1.get('error')}" |
| 138 | +# assert abs(result1["latitude"] - coords.latitude) < 0.0001, f"Context1 latitude mismatch: {result1['latitude']}" |
| 139 | +# assert abs(result1["longitude"] - coords.longitude) < 0.0001, f"Context1 longitude mismatch: {result1['longitude']}" |
| 140 | +# assert abs(result1["accuracy"] - coords.accuracy) < 1.0, f"Context1 accuracy mismatch: {result1['accuracy']}" |
| 141 | +# |
| 142 | +# # Test second context |
| 143 | +# driver.switch_to.window(context2_id) |
| 144 | +# pages.load("blank.html") |
| 145 | +# result2 = get_browser_geolocation(driver) |
| 146 | +# |
| 147 | +# assert "error" not in result2, f"Geolocation error in context2: {result2.get('error')}" |
| 148 | +# assert abs(result2["latitude"] - coords.latitude) < 0.0001, f"Context2 latitude mismatch: {result2['latitude']}" |
| 149 | +# assert abs(result2["longitude"] - coords.longitude) < 0.0001, f"Context2 longitude mismatch: {result2['longitude']}" |
| 150 | +# assert abs(result2["accuracy"] - coords.accuracy) < 1.0, f"Context2 accuracy mismatch: {result2['accuracy']}" |
| 151 | +# |
| 152 | +# driver.browsing_context.close(context1_id) |
| 153 | +# driver.browsing_context.close(context2_id) |
| 154 | +# |
| 155 | +# |
| 156 | +# def test_set_geolocation_override_with_multiple_user_contexts(driver, pages): |
| 157 | +# """Test setting geolocation override with multiple user contexts.""" |
| 158 | +# # Create two user contexts |
| 159 | +# user_context1 = driver.browser.create_user_context() |
| 160 | +# user_context2 = driver.browser.create_user_context() |
| 161 | +# |
| 162 | +# context1_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context1) |
| 163 | +# context2_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context2) |
| 164 | +# |
| 165 | +# coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
| 166 | +# |
| 167 | +# driver.emulation.set_geolocation_override(coordinates=coords, user_contexts=[user_context1, user_context2]) |
| 168 | +# |
| 169 | +# # Test first user context |
| 170 | +# driver.switch_to.window(context1_id) |
| 171 | +# pages.load("blank.html") |
| 172 | +# result1 = get_browser_geolocation(driver) |
| 173 | +# |
| 174 | +# assert "error" not in result1, f"Geolocation error in user_context1: {result1.get('error')}" |
| 175 | +# assert abs(result1["latitude"] - coords.latitude) < 0.0001, ( |
| 176 | +# f"User context1 latitude mismatch: {result1['latitude']}" |
| 177 | +# ) |
| 178 | +# assert abs(result1["longitude"] - coords.longitude) < 0.0001, ( |
| 179 | +# f"User context1 longitude mismatch: {result1['longitude']}" |
| 180 | +# ) |
| 181 | +# assert abs(result1["accuracy"] - coords.accuracy) < 1.0, f"User context1 accuracy mismatch: {result1['accuracy']}" |
| 182 | +# |
| 183 | +# # Test second user context |
| 184 | +# driver.switch_to.window(context2_id) |
| 185 | +# pages.load("blank.html") |
| 186 | +# result2 = get_browser_geolocation(driver) |
| 187 | +# |
| 188 | +# assert "error" not in result2, f"Geolocation error in user_context2: {result2.get('error')}" |
| 189 | +# assert abs(result2["latitude"] - coords.latitude) < 0.0001, ( |
| 190 | +# f"User context2 latitude mismatch: {result2['latitude']}" |
| 191 | +# ) |
| 192 | +# assert abs(result2["longitude"] - coords.longitude) < 0.0001, ( |
| 193 | +# f"User context2 longitude mismatch: {result2['longitude']}" |
| 194 | +# ) |
| 195 | +# assert abs(result2["accuracy"] - coords.accuracy) < 1.0, f"User context2 accuracy mismatch: {result2['accuracy']}" |
| 196 | +# |
| 197 | +# driver.browsing_context.close(context1_id) |
| 198 | +# driver.browsing_context.close(context2_id) |
| 199 | +# driver.browser.remove_user_context(user_context1) |
| 200 | +# driver.browser.remove_user_context(user_context2) |
96 | 201 |
|
97 | 202 |
|
98 | | -def test_set_geolocation_override_all_coords(driver, pages): |
99 | | - """Test setting geolocation override with coordinates.""" |
| 203 | +# the error param returns "invalid argument: Invalid input in "coordinates" error, might be bug from the spec/browser |
| 204 | +def test_set_geolocation_override_with_error(driver): |
| 205 | + """Test setting geolocation override with error.""" |
100 | 206 | context_id = driver.current_window_handle |
101 | | - pages.load("blank.html") |
102 | | - coords = GeolocationCoordinates( |
103 | | - 45.5, -122.4194, accuracy=10.0, altitude=100.2, altitude_accuracy=5.0, heading=183.2, speed=10.0 |
104 | | - ) |
105 | | - |
106 | | - driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context_id]) |
107 | | - |
108 | | - result = get_browser_geolocation(driver) |
109 | | - |
110 | | - assert "error" not in result, f"Geolocation error: {result.get('error')}" |
111 | | - assert abs(result["latitude"] - coords.latitude) < 0.0001, f"Latitude mismatch: {result['latitude']}" |
112 | | - assert abs(result["longitude"] - coords.longitude) < 0.0001, f"Longitude mismatch: {result['longitude']}" |
113 | | - assert abs(result["accuracy"] - coords.accuracy) < 1.0, f"Accuracy mismatch: {result['accuracy']}" |
114 | | - assert abs(result["altitude"] - coords.altitude) < 0.0001, f"Altitude mismatch: {result['altitude']}" |
115 | | - assert abs(result["altitudeAccuracy"] - coords.altitude_accuracy) < 0.1, ( |
116 | | - f"Altitude accuracy mismatch: {result['altitudeAccuracy']}" |
117 | | - ) |
118 | | - assert abs(result["heading"] - coords.heading) < 0.1, f"Heading mismatch: {result['heading']}" |
119 | | - assert abs(result["speed"] - coords.speed) < 0.1, f"Speed mismatch: {result['speed']}" |
120 | | - |
121 | | - driver.browsing_context.close(context_id) |
122 | | - |
123 | 207 |
|
124 | | -def test_set_geolocation_override_with_multiple_contexts(driver, pages): |
125 | | - """Test setting geolocation override with multiple browsing contexts.""" |
126 | | - # Create two browsing contexts |
127 | | - context1_id = driver.browsing_context.create(type=WindowTypes.TAB) |
128 | | - context2_id = driver.browsing_context.create(type=WindowTypes.TAB) |
| 208 | + error = GeolocationPositionError() |
129 | 209 |
|
130 | | - coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
131 | | - |
132 | | - driver.emulation.set_geolocation_override(coordinates=coords, contexts=[context1_id, context2_id]) |
133 | | - |
134 | | - # Test first context |
135 | | - driver.switch_to.window(context1_id) |
136 | | - pages.load("blank.html") |
137 | | - result1 = get_browser_geolocation(driver) |
138 | | - |
139 | | - assert "error" not in result1, f"Geolocation error in context1: {result1.get('error')}" |
140 | | - assert abs(result1["latitude"] - coords.latitude) < 0.0001, f"Context1 latitude mismatch: {result1['latitude']}" |
141 | | - assert abs(result1["longitude"] - coords.longitude) < 0.0001, f"Context1 longitude mismatch: {result1['longitude']}" |
142 | | - assert abs(result1["accuracy"] - coords.accuracy) < 1.0, f"Context1 accuracy mismatch: {result1['accuracy']}" |
143 | | - |
144 | | - # Test second context |
145 | | - driver.switch_to.window(context2_id) |
146 | | - pages.load("blank.html") |
147 | | - result2 = get_browser_geolocation(driver) |
148 | | - |
149 | | - assert "error" not in result2, f"Geolocation error in context2: {result2.get('error')}" |
150 | | - assert abs(result2["latitude"] - coords.latitude) < 0.0001, f"Context2 latitude mismatch: {result2['latitude']}" |
151 | | - assert abs(result2["longitude"] - coords.longitude) < 0.0001, f"Context2 longitude mismatch: {result2['longitude']}" |
152 | | - assert abs(result2["accuracy"] - coords.accuracy) < 1.0, f"Context2 accuracy mismatch: {result2['accuracy']}" |
153 | | - |
154 | | - driver.browsing_context.close(context1_id) |
155 | | - driver.browsing_context.close(context2_id) |
156 | | - |
157 | | - |
158 | | -def test_set_geolocation_override_with_multiple_user_contexts(driver, pages): |
159 | | - """Test setting geolocation override with multiple user contexts.""" |
160 | | - # Create two user contexts |
161 | | - user_context1 = driver.browser.create_user_context() |
162 | | - user_context2 = driver.browser.create_user_context() |
163 | | - |
164 | | - context1_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context1) |
165 | | - context2_id = driver.browsing_context.create(type=WindowTypes.TAB, user_context=user_context2) |
166 | | - |
167 | | - coords = GeolocationCoordinates(45.5, -122.4194, accuracy=10.0) |
168 | | - |
169 | | - driver.emulation.set_geolocation_override(coordinates=coords, user_contexts=[user_context1, user_context2]) |
170 | | - |
171 | | - # Test first user context |
172 | | - driver.switch_to.window(context1_id) |
173 | | - pages.load("blank.html") |
174 | | - result1 = get_browser_geolocation(driver) |
175 | | - |
176 | | - assert "error" not in result1, f"Geolocation error in user_context1: {result1.get('error')}" |
177 | | - assert abs(result1["latitude"] - coords.latitude) < 0.0001, ( |
178 | | - f"User context1 latitude mismatch: {result1['latitude']}" |
179 | | - ) |
180 | | - assert abs(result1["longitude"] - coords.longitude) < 0.0001, ( |
181 | | - f"User context1 longitude mismatch: {result1['longitude']}" |
182 | | - ) |
183 | | - assert abs(result1["accuracy"] - coords.accuracy) < 1.0, f"User context1 accuracy mismatch: {result1['accuracy']}" |
184 | | - |
185 | | - # Test second user context |
186 | | - driver.switch_to.window(context2_id) |
187 | | - pages.load("blank.html") |
188 | | - result2 = get_browser_geolocation(driver) |
189 | | - |
190 | | - assert "error" not in result2, f"Geolocation error in user_context2: {result2.get('error')}" |
191 | | - assert abs(result2["latitude"] - coords.latitude) < 0.0001, ( |
192 | | - f"User context2 latitude mismatch: {result2['latitude']}" |
193 | | - ) |
194 | | - assert abs(result2["longitude"] - coords.longitude) < 0.0001, ( |
195 | | - f"User context2 longitude mismatch: {result2['longitude']}" |
196 | | - ) |
197 | | - assert abs(result2["accuracy"] - coords.accuracy) < 1.0, f"User context2 accuracy mismatch: {result2['accuracy']}" |
198 | | - |
199 | | - driver.browsing_context.close(context1_id) |
200 | | - driver.browsing_context.close(context2_id) |
201 | | - driver.browser.remove_user_context(user_context1) |
202 | | - driver.browser.remove_user_context(user_context2) |
203 | | - |
204 | | - |
205 | | -# the error param returns "invalid argument: Invalid input in "coordinates" error, might be bug from the spec/browser |
206 | | -# @pytest.mark.xfail_edge |
207 | | -# def test_set_geolocation_override_with_error(driver): |
208 | | -# """Test setting geolocation override with error.""" |
209 | | -# context_id = driver.current_window_handle |
210 | | -# |
211 | | -# error = GeolocationPositionError() |
212 | | -# |
213 | | -# driver.emulation.set_geolocation_override(error=error, contexts=[context_id]) |
| 210 | + driver.emulation.set_geolocation_override(error=error, contexts=[context_id]) |
0 commit comments