Skip to content

Commit

Permalink
expose new_context & new_page as context managers from BrowserManager
Browse files Browse the repository at this point in the history
This will ensure that resources are opened/closed properly
  • Loading branch information
shtlrs authored and supakeen committed Jun 27, 2024
1 parent 21c722a commit 2afbbe9
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 33 deletions.
35 changes: 28 additions & 7 deletions test/e2e/playwright/browser_manager.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,38 @@
import contextlib
import logging
from test.e2e.env_config import is_headless

from playwright.sync_api import Page, Playwright
from typing import Optional
from playwright.sync_api import BrowserContext, Page, Playwright

log = logging.getLogger(__name__)


class BrowserManager:
def __init__(self, playwright: Playwright) -> None:
self.playwright = playwright

def create_new_context(self, headless=is_headless()) -> Page:
@classmethod
@contextlib.contextmanager
def new_context(cls, playwright: Playwright, headless: Optional[bool] = None) -> BrowserContext:
log.info("creating new browser context")
browser = self.playwright.chromium.launch(headless=headless)
headless = headless if headless is not None else is_headless()
browser = playwright.chromium.launch(headless=headless)
context = browser.new_context()
return context.new_page()
try:
yield context
except Exception as e:
log.exception(e)
finally:
context.close()

@classmethod
@contextlib.contextmanager
def new_page(cls, playwright: Playwright, headless: Optional[bool] = None) -> Page:
headless = headless if headless is not None else is_headless()
with cls.new_context(playwright=playwright, headless=headless) as context:
page = context.new_page()
try:
yield page
except Exception as e:
log.exception(e)
finally:
page.close()

34 changes: 17 additions & 17 deletions test/e2e/testscenarios/test_copy_paste.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,23 @@
@pytest.mark.e2e
def test_copy_paste(playwright: Playwright, request):
# This test needs to be run in a headed mode for the clipboard to work correctly
page = BrowserManager(playwright).create_new_context(headless=False)
try:
create_paste_page = CreatePastePage(page)
create_paste_page.open()
first_pasted_text = create_paste_page.paste_random_text(paste_number=0)
create_paste_page.click_add_another_file_button()
second_pasted_text = create_paste_page.paste_random_text(paste_number=1)
create_paste_page.click_submit()
with BrowserManager.new_page(playwright, headless=False) as page:
try:
create_paste_page = CreatePastePage(page)
create_paste_page.open()
first_pasted_text = create_paste_page.paste_random_text(paste_number=0)
create_paste_page.click_add_another_file_button()
second_pasted_text = create_paste_page.paste_random_text(paste_number=1)
create_paste_page.click_submit()

view_paste_page = ViewPastePage(page)
view_paste_page.should_be_opened()
view_paste_page = ViewPastePage(page)
view_paste_page.should_be_opened()

view_paste_page.click_copy_button(related_paste_number=0)
verify_clipboard_contents(first_pasted_text)
view_paste_page.click_copy_button(related_paste_number=0)
verify_clipboard_contents(first_pasted_text)

view_paste_page.click_copy_button(related_paste_number=1)
verify_clipboard_contents(second_pasted_text)
except Exception:
make_screenshot(request.node, page)
raise
view_paste_page.click_copy_button(related_paste_number=1)
verify_clipboard_contents(second_pasted_text)
except Exception:
make_screenshot(request.node, page)
raise
16 changes: 7 additions & 9 deletions test/e2e/testscenarios/test_create_paste.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
from test.e2e.conftest import create_paste_page
from test.e2e.pageobjects.create_paste_page import CreatePastePage
from test.e2e.pageobjects.view_paste_page import ViewPastePage
from test.e2e.playwright.browser_manager import BrowserManager

import pytest
from playwright.sync_api import Page, Playwright
from playwright.sync_api import Page


@pytest.mark.e2e
def test_create_single_paste(
page: Page, playwright: Playwright, create_paste_page: CreatePastePage
page: Page, create_paste_page: CreatePastePage
):
create_paste_page.should_have_title("Create new paste")

Expand All @@ -21,12 +20,12 @@ def test_create_single_paste(
view_paste_page.should_have_pasted_text(pasted_text)

paste_url = view_paste_page.current_url()
reopen_created_paste(playwright, paste_url)
reopen_created_paste(page, paste_url)


@pytest.mark.e2e
def test_create_multi_paste(
page: Page, playwright: Playwright, create_paste_page: CreatePastePage
page: Page, create_paste_page: CreatePastePage
):
first_pasted_text = create_paste_page.paste_random_text(paste_number=0)
create_paste_page.click_add_another_file_button()
Expand All @@ -45,11 +44,10 @@ def test_create_multi_paste(
view_paste_page.should_have_pasted_text(third_pasted_text, paste_number=2)

paste_url = view_paste_page.current_url()
reopen_created_paste(playwright, paste_url)
reopen_created_paste(page, paste_url)


def reopen_created_paste(playwright, paste_url):
new_page = BrowserManager(playwright).create_new_context()
new_view_paste_page = ViewPastePage(new_page)
def reopen_created_paste(page: Page, paste_url: str):
new_view_paste_page = ViewPastePage(page)
new_view_paste_page.open(paste_url)
new_view_paste_page.should_be_opened()

0 comments on commit 2afbbe9

Please sign in to comment.