| # META: timeout=long |
| |
| import pytest |
| |
| from webdriver.transport import Response |
| |
| from tests.support.asserts import assert_error, assert_success |
| from tests.support.helpers import (available_screen_size, document_hidden, |
| is_fullscreen, screen_size) |
| |
| |
| def set_window_rect(session, rect): |
| return session.transport.send( |
| "POST", "session/{session_id}/window/rect".format(**vars(session)), |
| rect) |
| |
| |
| def test_null_parameter_value(session, http): |
| path = "/session/{session_id}/window/rect".format(**vars(session)) |
| with http.post(path, None) as response: |
| assert_error(Response.from_http(response), "invalid argument") |
| |
| |
| def test_no_top_browsing_context(session, closed_window): |
| response = set_window_rect(session, {}) |
| assert_error(response, "no such window") |
| |
| |
| def test_no_browsing_context(session, closed_frame): |
| response = set_window_rect(session, {"width": 750, "height": 700}) |
| value = assert_success(response) |
| assert value["width"] == 750 |
| assert value["height"] == 700 |
| |
| |
| @pytest.mark.parametrize("rect", [ |
| {"width": "a"}, |
| {"height": "b"}, |
| {"width": "a", "height": "b"}, |
| {"x": "a"}, |
| {"y": "b"}, |
| {"x": "a", "y": "b"}, |
| {"width": "a", "height": "b", "x": "a", "y": "b"}, |
| |
| {"width": True}, |
| {"height": False}, |
| {"width": True, "height": False}, |
| {"x": True}, |
| {"y": False}, |
| {"x": True, "y": False}, |
| {"width": True, "height": False, "x": True, "y": False}, |
| |
| {"width": []}, |
| {"height": []}, |
| {"width": [], "height": []}, |
| {"x": []}, |
| {"y": []}, |
| {"x": [], "y": []}, |
| {"width": [], "height": [], "x": [], "y": []}, |
| |
| {"height": {}}, |
| {"width": {}}, |
| {"height": {}, "width": {}}, |
| {"x": {}}, |
| {"y": {}}, |
| {"x": {}, "y": {}}, |
| {"width": {}, "height": {}, "x": {}, "y": {}}, |
| ]) |
| def test_invalid_types(session, rect): |
| response = set_window_rect(session, rect) |
| assert_error(response, "invalid argument") |
| |
| |
| @pytest.mark.parametrize("rect", [ |
| {"width": -1}, |
| {"height": -2}, |
| {"width": -1, "height": -2}, |
| ]) |
| def test_out_of_bounds(session, rect): |
| response = set_window_rect(session, rect) |
| assert_error(response, "invalid argument") |
| |
| |
| def test_width_height_floats(session): |
| response = set_window_rect(session, {"width": 750.5, "height": 700}) |
| value = assert_success(response) |
| assert value["width"] == 750 |
| assert value["height"] == 700 |
| |
| response = set_window_rect(session, {"width": 750, "height": 700.5}) |
| value = assert_success(response) |
| assert value["width"] == 750 |
| assert value["height"] == 700 |
| |
| |
| def test_x_y_floats(session): |
| response = set_window_rect(session, {"x": 0.5, "y": 420}) |
| value = assert_success(response) |
| assert value["x"] == 0 |
| assert value["y"] == 420 |
| |
| response = set_window_rect(session, {"x": 100, "y": 450.5}) |
| value = assert_success(response) |
| assert value["x"] == 100 |
| assert value["y"] == 450 |
| |
| |
| @pytest.mark.parametrize("rect", [ |
| {}, |
| |
| {"width": None}, |
| {"height": None}, |
| {"width": None, "height": None}, |
| |
| {"x": None}, |
| {"y": None}, |
| {"x": None, "y": None}, |
| |
| {"width": None, "x": None}, |
| {"width": None, "y": None}, |
| {"height": None, "x": None}, |
| {"height": None, "Y": None}, |
| |
| {"width": None, "height": None, "x": None, "y": None}, |
| |
| {"width": 200}, |
| {"height": 200}, |
| {"x": 200}, |
| {"y": 200}, |
| {"width": 200, "x": 200}, |
| {"height": 200, "x": 200}, |
| {"width": 200, "y": 200}, |
| {"height": 200, "y": 200}, |
| ]) |
| def test_no_change(session, rect): |
| original = session.window.rect |
| response = set_window_rect(session, rect) |
| assert_success(response, original) |
| |
| |
| def test_fully_exit_fullscreen(session): |
| session.window.fullscreen() |
| assert is_fullscreen(session) |
| |
| response = set_window_rect(session, {"width": 600, "height": 400}) |
| value = assert_success(response) |
| assert value["width"] == 600 |
| assert value["height"] == 400 |
| |
| assert not is_fullscreen(session) |
| |
| |
| def test_restore_from_minimized(session): |
| session.window.minimize() |
| assert document_hidden(session) |
| |
| response = set_window_rect(session, {"width": 750, "height": 700}) |
| value = assert_success(response) |
| assert value["width"] == 750 |
| assert value["height"] == 700 |
| |
| assert not document_hidden(session) |
| |
| |
| def test_restore_from_maximized(session): |
| original_size = session.window.size |
| session.window.maximize() |
| assert session.window.size != original_size |
| |
| response = set_window_rect(session, {"width": 750, "height": 700}) |
| value = assert_success(response) |
| assert value["width"] == 750 |
| assert value["height"] == 700 |
| |
| |
| def test_height_width(session): |
| # The window position might be auto-adjusted by the browser |
| # if it exceeds the lower right corner. As such ensure that |
| # there is enough space left so no window move will occur. |
| session.window.position = (50, 50) |
| |
| original = session.window.rect |
| screen_width, screen_height = screen_size(session) |
| |
| response = set_window_rect(session, { |
| "width": screen_width - 100, |
| "height": screen_height - 100 |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"], |
| "width": screen_width - 100, |
| "height": screen_height - 100, |
| }) |
| |
| |
| def test_height_width_smaller_than_minimum_browser_size(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, {"width": 10, "height": 10}) |
| rect = assert_success(response) |
| assert rect["width"] < original["width"] |
| assert rect["width"] > 10 |
| assert rect["height"] < original["height"] |
| assert rect["height"] > 10 |
| |
| |
| def test_height_width_larger_than_max(session): |
| screen_width, screen_height = screen_size(session) |
| avail_width, avail_height = available_screen_size(session) |
| |
| response = set_window_rect(session, { |
| "width": screen_width + 100, |
| "height": screen_height + 100 |
| }) |
| rect = assert_success(response) |
| assert rect["width"] >= avail_width |
| assert rect["height"] >= avail_height |
| |
| |
| def test_height_width_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"], |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| |
| |
| def test_height_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "width": original["width"] + 10, |
| "height": original["height"] |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"], |
| "width": original["width"] + 10, |
| "height": original["height"] |
| }) |
| |
| |
| def test_width_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "width": original["width"], |
| "height": original["height"] + 10 |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"], |
| "width": original["width"], |
| "height": original["height"] + 10 |
| }) |
| |
| |
| def test_x_y(session): |
| original = session.window.rect |
| response = set_window_rect(session, { |
| "x": original["x"] + 10, |
| "y": original["y"] + 10 |
| }) |
| assert_success(response, { |
| "x": original["x"] + 10, |
| "y": original["y"] + 10, |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| |
| |
| def test_negative_x_y(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, {"x": - 8, "y": - 8}) |
| |
| os = session.capabilities["platformName"] |
| # certain WMs prohibit windows from being moved off-screen |
| if os == "linux": |
| rect = assert_success(response) |
| assert rect["x"] <= 0 |
| assert rect["y"] <= 0 |
| assert rect["width"] == original["width"] |
| assert rect["height"] == original["height"] |
| |
| # On macOS, windows can only be moved off the screen on the |
| # horizontal axis. The system menu bar also blocks windows from |
| # being moved to (0,0). |
| elif os == "mac": |
| value = assert_success(response) |
| |
| # `screen.availTop` is not standardized but all browsers we care |
| # about on MacOS implement the CSSOM View mode `Screen` interface. |
| avail_top = session.execute_script("return window.screen.availTop;") |
| |
| assert value == {"x": -8, |
| "y": avail_top, |
| "width": original["width"], |
| "height": original["height"]} |
| |
| # It turns out that Windows is the only platform on which the |
| # window can be reliably positioned off-screen. |
| elif os == "windows": |
| assert_success(response, {"x": -8, |
| "y": -8, |
| "width": original["width"], |
| "height": original["height"]}) |
| |
| |
| def test_x_y_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "x": original["x"], |
| "y": original["y"] |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"], |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| |
| |
| def test_x_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "x": original["x"], |
| "y": original["y"] + 10 |
| }) |
| assert_success(response, { |
| "x": original["x"], |
| "y": original["y"] + 10, |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| |
| |
| def test_y_as_current(session): |
| original = session.window.rect |
| |
| response = set_window_rect(session, { |
| "x": original["x"] + 10, |
| "y": original["y"] |
| }) |
| assert_success(response, { |
| "x": original["x"] + 10, |
| "y": original["y"], |
| "width": original["width"], |
| "height": original["height"] |
| }) |
| |
| |
| """ |
| TODO(ato): |
| |
| Disable test because the while statements are wrong. |
| To fix this properly we need to write an explicit wait utility. |
| |
| def test_resize_by_script(session): |
| # setting the window size by JS is asynchronous |
| # so we poll waiting for the results |
| |
| size0 = session.window.size |
| |
| session.execute_script("window.resizeTo(700, 800)") |
| size1 = session.window.size |
| while size0 == size1: |
| size1 = session.window.size |
| assert size1 == (700, 800) |
| |
| session.execute_script("window.resizeTo(800, 900)") |
| size2 = session.window.size |
| while size1 == size2: |
| size2 = session.window.size |
| assert size2 == (800, 900) |
| assert size2 == {"width": 200, "height": 100} |
| """ |
| |
| |
| def test_payload(session): |
| response = set_window_rect(session, {"x": 400, "y": 400}) |
| |
| assert response.status == 200 |
| assert isinstance(response.body["value"], dict) |
| value = response.body["value"] |
| assert "width" in value |
| assert "height" in value |
| assert "x" in value |
| assert "y" in value |
| assert isinstance(value["width"], int) |
| assert isinstance(value["height"], int) |
| assert isinstance(value["x"], int) |
| assert isinstance(value["y"], int) |