From 1d98d96be1c3cf57892514edabf0734a38f559a3 Mon Sep 17 00:00:00 2001 From: Henrik Skupin Date: Mon, 5 Nov 2018 18:30:27 +0000 Subject: [PATCH] [wdspec] Assert for expected screenshot dimensions. Depends on D10627 Differential Revision: https://phabricator.services.mozilla.com/D10628 bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1503804 gecko-commit: 076d32d1343fa0203bbf58209a45c73f2c878d97 gecko-integration-branch: autoland gecko-reviewers: ato --- webdriver/tests/get_element_rect/__init__.py | 11 +---- webdriver/tests/get_element_rect/get.py | 5 +-- .../tests/get_element_rect/user_prompts.py | 5 +-- webdriver/tests/support/asserts.py | 1 + webdriver/tests/support/fixtures.py | 1 - webdriver/tests/support/helpers.py | 43 ++++++++++++------- webdriver/tests/support/image.py | 1 + .../tests/take_element_screenshot/__init__.py | 12 ++++++ .../take_element_screenshot/screenshot.py | 23 ++++++---- webdriver/tests/take_screenshot/__init__.py | 6 +++ webdriver/tests/take_screenshot/screenshot.py | 6 ++- 11 files changed, 72 insertions(+), 42 deletions(-) diff --git a/webdriver/tests/get_element_rect/__init__.py b/webdriver/tests/get_element_rect/__init__.py index abf1a913675171..8b137891791fe9 100644 --- a/webdriver/tests/get_element_rect/__init__.py +++ b/webdriver/tests/get_element_rect/__init__.py @@ -1,10 +1 @@ -def retrieve_element_rect(session, element): - return session.execute_script(""" - let rect = arguments[0].getBoundingClientRect(); - return { - x: rect.left + window.pageXOffset, - y: rect.top + window.pageYOffset, - width: rect.width, - height: rect.height, - }; - """, args=(element,)) + diff --git a/webdriver/tests/get_element_rect/get.py b/webdriver/tests/get_element_rect/get.py index 433e2f6bf8b428..e3744c4bce574b 100644 --- a/webdriver/tests/get_element_rect/get.py +++ b/webdriver/tests/get_element_rect/get.py @@ -1,8 +1,7 @@ from tests.support.asserts import assert_error, assert_success +from tests.support.helpers import element_rect from tests.support.inline import inline -from . import retrieve_element_rect - def get_element_rect(session, element_id): return session.transport.send( @@ -38,4 +37,4 @@ def test_basic(session): element = session.find.css("input", all=False) result = get_element_rect(session, element.id) - assert_success(result, retrieve_element_rect(session, element)) + assert_success(result, element_rect(session, element)) diff --git a/webdriver/tests/get_element_rect/user_prompts.py b/webdriver/tests/get_element_rect/user_prompts.py index ec1047bd3893d5..c51866cb8758ad 100644 --- a/webdriver/tests/get_element_rect/user_prompts.py +++ b/webdriver/tests/get_element_rect/user_prompts.py @@ -3,10 +3,9 @@ import pytest from tests.support.asserts import assert_error, assert_success, assert_dialog_handled +from tests.support.helpers import element_rect from tests.support.inline import inline -from . import retrieve_element_rect - def get_element_rect(session, element_id): return session.transport.send( @@ -27,7 +26,7 @@ def check_user_prompt_closed_without_exception(dialog_type, retval): create_dialog(dialog_type, text=dialog_type) response = get_element_rect(session, element.id) - assert_success(response, retrieve_element_rect(session, element)) + assert_success(response, element_rect(session, element)) assert_dialog_handled(session, expected_text=dialog_type, expected_retval=retval) diff --git a/webdriver/tests/support/asserts.py b/webdriver/tests/support/asserts.py index 1dea6ce6877926..67711987d4b7cf 100644 --- a/webdriver/tests/support/asserts.py +++ b/webdriver/tests/support/asserts.py @@ -1,5 +1,6 @@ import base64 import imghdr +import struct from webdriver import Element, NoSuchAlertException, WebDriverException diff --git a/webdriver/tests/support/fixtures.py b/webdriver/tests/support/fixtures.py index d16883256aca4f..f662040e4066f1 100644 --- a/webdriver/tests/support/fixtures.py +++ b/webdriver/tests/support/fixtures.py @@ -231,4 +231,3 @@ def closed_window(session, create_window): yield new_handle session.window_handle = original_handle - diff --git a/webdriver/tests/support/helpers.py b/webdriver/tests/support/helpers.py index dd733809fd5a11..6c62d756259b66 100644 --- a/webdriver/tests/support/helpers.py +++ b/webdriver/tests/support/helpers.py @@ -105,6 +105,34 @@ def clear_all_cookies(session): session.transport.send("DELETE", "session/%s/cookie" % session.session_id) +def document_dimensions(session): + return tuple(session.execute_script(""" + let {width, height} = document.documentElement.getBoundingClientRect(); + return [width, height]; + """)) + + +def document_hidden(session): + """Polls for the document to become hidden.""" + def hidden(session): + return session.execute_script("return document.hidden") + return Poll(session, timeout=3, raises=None).until(hidden) + + +def element_rect(session, element): + return session.execute_script(""" + let element = arguments[0]; + let {height, left, top, width} = element.getBoundingClientRect(); + + return { + x: left + window.pageXOffset, + y: top + window.pageYOffset, + width: width, + height: height, + }; + """, args=(element,)) + + def is_element_in_viewport(session, element): """Check if element is outside of the viewport""" return session.execute_script(""" @@ -121,13 +149,6 @@ def is_element_in_viewport(session, element): """, args=(element,)) -def document_hidden(session): - """Polls for the document to become hidden.""" - def hidden(session): - return session.execute_script("return document.hidden") - return Poll(session, timeout=3, raises=None).until(hidden) - - def is_fullscreen(session): # At the time of writing, WebKit does not conform to the # Fullscreen API specification. @@ -137,11 +158,3 @@ def is_fullscreen(session): return session.execute_script(""" return !!(window.fullScreen || document.webkitIsFullScreen) """) - - -def document_dimensions(session): - return tuple(session.execute_script(""" - let {devicePixelRatio} = window; - let {width, height} = document.documentElement.getBoundingClientRect(); - return [width * devicePixelRatio, height * devicePixelRatio]; - """)) diff --git a/webdriver/tests/support/image.py b/webdriver/tests/support/image.py index 1eb3a187a43b86..81dd933943f78b 100644 --- a/webdriver/tests/support/image.py +++ b/webdriver/tests/support/image.py @@ -1,4 +1,5 @@ import base64 +import math import struct from tests.support.asserts import assert_png diff --git a/webdriver/tests/take_element_screenshot/__init__.py b/webdriver/tests/take_element_screenshot/__init__.py index e69de29bb2d1d6..d289ee3b912001 100644 --- a/webdriver/tests/take_element_screenshot/__init__.py +++ b/webdriver/tests/take_element_screenshot/__init__.py @@ -0,0 +1,12 @@ +def element_rect(session, element): + return session.execute_script(""" + let {devicePixelRatio} = window; + let rect = arguments[0].getBoundingClientRect(); + + return { + x: Math.floor((rect.left + window.pageXOffset) * devicePixelRatio), + y: Math.floor((rect.top + window.pageYOffset) * devicePixelRatio), + width: Math.floor(rect.width * devicePixelRatio), + height: Math.floor(rect.height * devicePixelRatio), + }; + """, args=(element,)) diff --git a/webdriver/tests/take_element_screenshot/screenshot.py b/webdriver/tests/take_element_screenshot/screenshot.py index ddddfef48961c4..35a1ffe75f042b 100644 --- a/webdriver/tests/take_element_screenshot/screenshot.py +++ b/webdriver/tests/take_element_screenshot/screenshot.py @@ -1,6 +1,9 @@ from tests.support.asserts import assert_error, assert_png, assert_success +from tests.support.image import png_dimensions from tests.support.inline import inline +from . import element_rect + def take_element_screenshot(session, element_id): return session.transport.send( @@ -17,20 +20,22 @@ def test_no_browsing_context(session, closed_window): assert_error(response, "no such window") -def test_screenshot(session): +def test_stale(session): session.url = inline("") element = session.find.css("input", all=False) + session.refresh() - response = take_element_screenshot(session, element.id) - value = assert_success(response) - - assert_png(value) + result = take_element_screenshot(session, element.id) + assert_error(result, "stale element reference") -def test_stale(session): +def test_format_and_dimensions(session): session.url = inline("") element = session.find.css("input", all=False) - session.refresh() + rect = element_rect(session, element) - result = take_element_screenshot(session, element.id) - assert_error(result, "stale element reference") + response = take_element_screenshot(session, element.id) + value = assert_success(response) + + assert_png(value) + assert png_dimensions(value) == (rect["width"], rect["height"]) diff --git a/webdriver/tests/take_screenshot/__init__.py b/webdriver/tests/take_screenshot/__init__.py index e69de29bb2d1d6..d38c8a0f79f81d 100644 --- a/webdriver/tests/take_screenshot/__init__.py +++ b/webdriver/tests/take_screenshot/__init__.py @@ -0,0 +1,6 @@ +def document_dimensions(session): + return tuple(session.execute_script(""" + let {devicePixelRatio} = window; + let {width, height} = document.documentElement.getBoundingClientRect(); + return [Math.floor(width * devicePixelRatio), Math.floor(height * devicePixelRatio)]; + """)) diff --git a/webdriver/tests/take_screenshot/screenshot.py b/webdriver/tests/take_screenshot/screenshot.py index e591d5d5a8f68e..07879530120dfb 100644 --- a/webdriver/tests/take_screenshot/screenshot.py +++ b/webdriver/tests/take_screenshot/screenshot.py @@ -1,6 +1,9 @@ from tests.support.asserts import assert_error, assert_png, assert_success +from tests.support.image import png_dimensions from tests.support.inline import inline +from . import document_dimensions + def take_screenshot(session): return session.transport.send( @@ -12,10 +15,11 @@ def test_no_browsing_context(session, closed_window): assert_error(response, "no such window") -def test_screenshot(session): +def test_format_and_dimensions(session): session.url = inline("") response = take_screenshot(session) value = assert_success(response) assert_png(value) + assert png_dimensions(value) == document_dimensions(session)