blob: 23382288a3d87b6788c2809fd5335bffc2260e70 [file] [log] [blame]
# 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)