# `Playwriter.Browser.Session`
[🔗](https://github.com/nshkrdotcom/playwriter/blob/v0.1.0/lib/playwriter/browser/session.ex#L1)

Manages a browser session lifecycle.

A session owns:
- A transport connection
- A browser instance
- Multiple browser contexts
- Pages within those contexts

## Example

    {:ok, session} = Session.start_link(mode: :local, headless: true)
    {:ok, page} = Session.new_page(session)
    :ok = Session.goto(session, page, "https://example.com")
    {:ok, html} = Session.content(session, page)
    :ok = Session.close(session)

# `page_info`

```elixir
@type page_info() :: %{
  page_guid: String.t(),
  frame_guid: String.t(),
  context_guid: String.t()
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `click`

```elixir
@spec click(GenServer.server(), String.t(), String.t(), keyword()) ::
  :ok | {:error, term()}
```

Click an element.

## Options

- `:timeout` - Click timeout in ms (default: 30000)

# `close`

```elixir
@spec close(GenServer.server()) :: :ok
```

Close the entire session.

# `close_page`

```elixir
@spec close_page(GenServer.server(), String.t()) :: :ok | {:error, term()}
```

Close a page.

# `content`

```elixir
@spec content(GenServer.server(), String.t()) :: {:ok, String.t()} | {:error, term()}
```

Get page HTML content.

# `fill`

```elixir
@spec fill(GenServer.server(), String.t(), String.t(), String.t(), keyword()) ::
  :ok | {:error, term()}
```

Fill an input field.

## Options

- `:timeout` - Fill timeout in ms (default: 30000)

# `goto`

```elixir
@spec goto(GenServer.server(), String.t(), String.t(), keyword()) ::
  :ok | {:error, term()}
```

Navigate to a URL.

## Options

- `:timeout` - Navigation timeout in ms (default: 30000)
- `:wait_until` - When to consider navigation complete (:load, :domcontentloaded, :networkidle)

# `new_context`

```elixir
@spec new_context(
  GenServer.server(),
  keyword()
) :: {:ok, String.t()} | {:error, term()}
```

Create a new browser context.

## Options

- `:viewport` - Viewport dimensions `%{width: 1920, height: 1080}`
- `:user_agent` - Custom user agent string
- `:locale` - User locale (e.g., "en-US")
- `:color_scheme` - Color scheme preference (:light, :dark)

# `new_page`

```elixir
@spec new_page(
  GenServer.server(),
  keyword()
) :: {:ok, String.t()} | {:error, term()}
```

Create a new page in the default context.

Returns a page_id that can be used with other Session functions.

# `screenshot`

```elixir
@spec screenshot(GenServer.server(), String.t(), keyword()) ::
  {:ok, binary()} | {:error, term()}
```

Take a screenshot.

## Options

- `:full_page` - Capture full scrollable page (default: false)
- `:omit_background` - Omit background for transparent screenshots (default: false)

# `start_link`

```elixir
@spec start_link(keyword()) :: {:ok, pid()} | {:error, term()}
```

Start a new browser session.

## Options

- `:mode` - `:local`, `:remote`, or `:auto` (default: `:auto`)
- `:ws_endpoint` - WebSocket URL for remote mode
- `:headless` - Run browser in headless mode (default: true)
- `:browser_type` - `:chromium`, `:firefox`, or `:webkit` (default: `:chromium`)
- `:name` - Optional name for the GenServer

---

*Consult [api-reference.md](api-reference.md) for complete listing*
