defmodule PlaywrightTest.Case do
@moduledoc """
Use `PlaywrightTest.Case` in an ExUnit test module to start a Playwright
server and put it into the test context.
## Examples
defmodule Web.DriverTransportTest do
use ExUnit.Case
use PlaywrightTest.Case,
headless: false,
transport: :driver
describe "features" do
test "goes to a page", %{browser: browser} do
page =
browser
|> Playwright.Browser.new_page()
text =
page
|> Playwright.Page.goto("https://playwright.dev")
|> Playwright.Page.text_content(".navbar__title")
assert text == "Playwright"
Playwright.Page.close(page)
end
end
end
defmodule Web.WebSocketTransportTest do
use ExUnit.Case
use PlaywrightTest.Case,
transport: :websocket
end
"""
defmacro __using__(options \\ %{}) do
quote do
alias Playwright.Runner.Config
setup_all do
inline_options = unquote(options) |> Enum.into(%{})
launch_options = Map.merge(Config.launch_options(), inline_options)
runner_options = Map.merge(Config.playwright_test(), inline_options)
Application.put_env(:playwright, LaunchOptions, launch_options)
{:ok, _} = Application.ensure_all_started(:playwright)
case runner_options.transport do
:driver ->
{connection, browser} = Playwright.BrowserType.launch()
[
connection: connection,
browser: browser,
transport: :driver
]
:websocket ->
options = Config.connect_options()
{connection, browser} = Playwright.BrowserType.connect(options.ws_endpoint)
[
connection: connection,
browser: browser,
transport: :websocket
]
end
end
setup %{browser: browser} do
page = Playwright.Browser.new_page(browser)
on_exit(:ok, fn ->
Playwright.Page.close(page)
end)
[page: page]
end
end
end
end