Test Results (11 tests)
⏱️ Duration: 112.17s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d3a00>
login_page = <pages.login_page.LoginPage object at 0x7fd1d40d0370>
create_page = <pages.create_page.CreatePage object at 0x7fd1d445fdf0>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d423a740>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d423ab60>
base_url = 'https://promo.com'
def test_w03_customize_video_and_render(
self, login_page, create_page, editor_page, publish_page, base_url
):
"""
W03 Customize a video and render it
Verifies sorting on the create page, searches for a summer template,
customises it with text/color/font/ratio/outro changes, publishes,
then returns to the editor to discard and re-publish.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.verify_sorting()
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:106:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._i
📸 Failure Screenshot:
⏱️ Duration: 113.01s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d3ee0>
login_page = <pages.login_page.LoginPage object at 0x7fd1d25bcdf0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d25bce80>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d25bd0f0>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d25bca00>
base_url = 'https://promo.com'
def test_w04_custom_uploaded_assets_and_render(
self, login_page, create_page, editor_page, publish_page, base_url
):
"""
W04 Add custom uploaded assets to a video and render it
Uploads custom font, watermark, logo, and audio; adds a new video clip
from the media library; adds a photo; changes transitions; verifies
favourites; then publishes.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:140:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0
📸 Failure Screenshot:
⏱️ Duration: 126.91s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d20e0>
login_page = <pages.login_page.LoginPage object at 0x7fd1d33810c0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d41b46d0>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d41b5ba0>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d41b4880>
base_url = 'https://promo.com'
def test_w05_create_video_from_uploaded_video(
self, login_page, create_page, editor_page, publish_page, base_url
):
"""
W05 Create a video from uploaded video
Uploads a video file on the create page, creates a project from it,
publishes/renders, then returns to create page and deletes the upload.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.upload_video_from_file(upload_video_path)
create_page.use_uploaded_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:175:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7fd1d40d0340>
cb = <function Channel.send.<locals>.<lambda> at 0x7fd1d35bd510>
is_internal
📸 Failure Screenshot:
⏱️ Duration: 113.43s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d1a20>
login_page = <pages.login_page.LoginPage object at 0x7fd1d07e6c20>
create_page = <pages.create_page.CreatePage object at 0x7fd1d07e6f20>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d07e6da0>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d07e6170>
base_url = 'https://promo.com'
@pytest.mark.skip_smoke
def test_w16_audio_filters_and_render_with_changed_music(
self, login_page, create_page, editor_page, publish_page, base_url
):
"""
W16 Verify audio filters and render a video with changed music
Opens the music library in the editor, tests Genre/Mood/Instrument
filters, selects a track from the library, then publishes and renders.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:216:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection obj
📸 Failure Screenshot:
⏱️ Duration: 27.31s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d16c0>
login_page = <pages.login_page.LoginPage object at 0x7fd1d4193b80>
create_page = <pages.create_page.CreatePage object at 0x7fd1d41925f0>
base_url = 'https://promo.com'
@pytest.mark.skip_smoke
def test_w23_fully_preview_video_on_create_page(
self, login_page, create_page, base_url
):
"""
W23 Fully preview a video on Create page
Searches for a Christmas template, opens the preview, verifies ratio
controls, share popup, customize button, and next/previous navigation.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("christmas")
> create_page.fully_preview_template()
tests/test_web_render.py:237:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/create_page.py:385: in fully_preview_template
self.page.locator(self.TEMPLATES_ARE_VISIBLE).wait_for(state="visible", timeout=self.T_LOAD)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7fd1d40d0340>
cb = <function Channel.send.<locals>.<lambda> at 0x7fd1d09530a0>
is_internal = False, title = None
async def wrap_api_call(
self, cb: Callable[[], Any], is_internal: bool = False, title: str = None
) -> Any:
if self._api_zone.get():
📸 Failure Screenshot:
⏱️ Duration: 111.60s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d1360>
login_page = <pages.login_page.LoginPage object at 0x7fd1d19fd2d0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d19ffd00>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d19fc700>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d19ffbb0>
dashboard_page = <pages.dashboard_page.DashboardPage object at 0x7fd1d19fd120>
base_url = 'https://promo.com'
def test_w17_edit_published_video_from_dashboard(
self, login_page, create_page, editor_page, publish_page, dashboard_page, base_url
):
"""
W17 Edit published video starting from Dashboard
Creates and renders a video, downloads it in HD, then navigates to the
published dashboard, re-opens the video in the editor, verifies the
editor is in 'published edit' mode (Save & Publish button, no ratio toolbar),
adds a new media clip, and re-publishes.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:256:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
📸 Failure Screenshot:
⏱️ Duration: 111.81s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d19c0>
login_page = <pages.login_page.LoginPage object at 0x7fd1d07fdd20>
create_page = <pages.create_page.CreatePage object at 0x7fd1d07fd4b0>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d07fd4e0>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d07fc1f0>
publisher_page = <pages.publisher_page.PublisherPage object at 0x7fd1d07fe2c0>
planner_page = <pages.planner_page.PlannerPage object at 0x7fd1d07ff370>
base_url = 'https://promo.com'
def test_w24_verify_all_players(
self, login_page, create_page, editor_page, publish_page, publisher_page, planner_page, base_url
):
"""
W24 Verify all players
Creates and renders a video, verifies the player on the publish page,
schedules to Facebook via the Publisher (verifies player in composer),
publishes the post, navigates to the Planner and verifies the player there.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:286:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
re
📸 Failure Screenshot:
⏱️ Duration: 108.85s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d1090>
login_page = <pages.login_page.LoginPage object at 0x7fd1d07e7730>
create_page = <pages.create_page.CreatePage object at 0x7fd1d07e5390>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d07e63b0>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d07e5a80>
base_url = 'https://promo.com'
def test_w30_create_video_from_photo(
self, login_page, create_page, editor_page, publish_page, base_url
):
"""
W30 Create a video from a photo
Switches the create-page library to Photos, adds the first photo result
to a new project, edits it on the timeline (zoom), publishes and verifies
the render.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for_photo()
create_page.add_first_photo_to_project()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:319:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <playwright._impl._connection.Connection object at 0x7fd1d40d0340>
cb = <function Channel.send.<locals>.<lambda> at 0x7fd1d34a1240>
is_internal = F
📸 Failure Screenshot:
⏱️ Duration: 111.50s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d0d30>
login_page = <pages.login_page.LoginPage object at 0x7fd1d09bbcd0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d09b9150>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d09bb490>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d09baec0>
base_url = 'https://promo.com', resolution = 'hd'
@pytest.mark.parametrize("resolution", ["hd", "full_hd", "streaming_full_hd"])
def test_w29_download_video_from_publish_page(
self, login_page, create_page, editor_page, publish_page, base_url, resolution
):
"""
W29 Download a video from the publish page
Login, create a short video from "summer" search, publish it, then download
in the specified resolution and verify the download event fires.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
📸 Failure Screenshot:
⏱️ Duration: 110.16s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d0bb0>
login_page = <pages.login_page.LoginPage object at 0x7fd1d09a6da0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d09a55a0>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d09a7460>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d09a76a0>
base_url = 'https://promo.com', resolution = 'full_hd'
@pytest.mark.parametrize("resolution", ["hd", "full_hd", "streaming_full_hd"])
def test_w29_download_video_from_publish_page(
self, login_page, create_page, editor_page, publish_page, base_url, resolution
):
"""
W29 Download a video from the publish page
Login, create a short video from "summer" search, publish it, then download
in the specified resolution and verify the download event fires.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
📸 Failure Screenshot:
⏱️ Duration: 114.26s
❌ Error:
self = <tests.test_web_render.TestWebRender object at 0x7fd1d40d0a00>
login_page = <pages.login_page.LoginPage object at 0x7fd1d07874c0>
create_page = <pages.create_page.CreatePage object at 0x7fd1d0787e50>
editor_page = <pages.editor_page.EditorPage object at 0x7fd1d0787430>
publish_page = <pages.publish_page.PublishPage object at 0x7fd1d07877c0>
base_url = 'https://promo.com', resolution = 'streaming_full_hd'
@pytest.mark.parametrize("resolution", ["hd", "full_hd", "streaming_full_hd"])
def test_w29_download_video_from_publish_page(
self, login_page, create_page, editor_page, publish_page, base_url, resolution
):
"""
W29 Download a video from the publish page
Login, create a short video from "summer" search, publish it, then download
in the specified resolution and verify the download event fires.
"""
login_page.login_directly(base_url, general_mail(), get_password())
create_page.navigate_to_create(base_url)
create_page.search_for("summer")
create_page.select_videos_from_type_dropdown()
create_page.customize_first_video()
> editor_page.verify_editor_loaded()
tests/test_web_render.py:341:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
pages/editor_page.py:272: in verify_editor_loaded
self.page.locator(self.RATIO_TOOLBAR).wait_for(state="visible", timeout=self.T_EDITOR)
/usr/local/lib/python3.10/dist-packages/playwright/sync_api/_generated.py:20539: in wait_for
self._sync(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_locator.py:748: in wait_for
await self._frame.wait_for_selector(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_frame.py:394: in wait_for_selector
await self._channel.send(
/usr/local/lib/python3.10/dist-packages/playwright/_impl/_connection.py:76: in send
return await self._connection.wrap_api_call(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
📸 Failure Screenshot: