205 lines
5.1 KiB
Markdown
205 lines
5.1 KiB
Markdown
|
|
# Session Management
|
||
|
|
|
||
|
|
Browser sessions for state persistence and parallel browsing.
|
||
|
|
|
||
|
|
**Related**: [authentication.md](authentication.md) for login patterns, [SKILL.md](../SKILL.md) for quick start.
|
||
|
|
|
||
|
|
## Contents
|
||
|
|
|
||
|
|
- [How Sessions Work](#how-sessions-work)
|
||
|
|
- [Starting a Session](#starting-a-session)
|
||
|
|
- [Using Session IDs](#using-session-ids)
|
||
|
|
- [Session State](#session-state)
|
||
|
|
- [Parallel Sessions](#parallel-sessions)
|
||
|
|
- [Session Cleanup](#session-cleanup)
|
||
|
|
- [Best Practices](#best-practices)
|
||
|
|
|
||
|
|
## How Sessions Work
|
||
|
|
|
||
|
|
Each session maintains an isolated browser context with:
|
||
|
|
- Cookies
|
||
|
|
- LocalStorage / SessionStorage
|
||
|
|
- Browser history
|
||
|
|
- Page state
|
||
|
|
- Video recording (if enabled)
|
||
|
|
|
||
|
|
Sessions persist across function calls, allowing multi-step workflows.
|
||
|
|
|
||
|
|
## Starting a Session
|
||
|
|
|
||
|
|
Use `--session new` to create a fresh session:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
RESULT=$(infsh app run agent-browser --function open --session new --input '{
|
||
|
|
"url": "https://example.com"
|
||
|
|
}')
|
||
|
|
SESSION_ID=$(echo $RESULT | jq -r '.session_id')
|
||
|
|
echo "Session: $SESSION_ID"
|
||
|
|
```
|
||
|
|
|
||
|
|
## Using Session IDs
|
||
|
|
|
||
|
|
All subsequent calls use the session ID:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Navigate
|
||
|
|
infsh app run agent-browser --function open --session $SESSION_ID --input '{
|
||
|
|
"url": "https://example.com/page2"
|
||
|
|
}'
|
||
|
|
|
||
|
|
# Interact
|
||
|
|
infsh app run agent-browser --function interact --session $SESSION_ID --input '{
|
||
|
|
"action": "click", "ref": "@e1"
|
||
|
|
}'
|
||
|
|
|
||
|
|
# Screenshot
|
||
|
|
infsh app run agent-browser --function screenshot --session $SESSION_ID --input '{}'
|
||
|
|
|
||
|
|
# Close
|
||
|
|
infsh app run agent-browser --function close --session $SESSION_ID --input '{}'
|
||
|
|
```
|
||
|
|
|
||
|
|
## Session State
|
||
|
|
|
||
|
|
### What Persists
|
||
|
|
|
||
|
|
Within a session, these persist across calls:
|
||
|
|
- Cookies (login state, preferences)
|
||
|
|
- LocalStorage and SessionStorage
|
||
|
|
- IndexedDB data
|
||
|
|
- Browser history (for back/forward)
|
||
|
|
- Current page and DOM state
|
||
|
|
- Video recording buffer
|
||
|
|
|
||
|
|
### What Doesn't Persist
|
||
|
|
|
||
|
|
- Sessions don't persist across server restarts
|
||
|
|
- No automatic session recovery
|
||
|
|
- Video is only available until close is called
|
||
|
|
|
||
|
|
## Parallel Sessions
|
||
|
|
|
||
|
|
Run multiple independent sessions simultaneously:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
# Scrape multiple sites in parallel
|
||
|
|
|
||
|
|
# Start sessions
|
||
|
|
RESULT1=$(infsh app run agent-browser --function open --session new --input '{
|
||
|
|
"url": "https://site1.com"
|
||
|
|
}')
|
||
|
|
SESSION1=$(echo $RESULT1 | jq -r '.session_id')
|
||
|
|
|
||
|
|
RESULT2=$(infsh app run agent-browser --function open --session new --input '{
|
||
|
|
"url": "https://site2.com"
|
||
|
|
}')
|
||
|
|
SESSION2=$(echo $RESULT2 | jq -r '.session_id')
|
||
|
|
|
||
|
|
# Work with each session independently
|
||
|
|
infsh app run agent-browser --function screenshot --session $SESSION1 --input '{}' &
|
||
|
|
infsh app run agent-browser --function screenshot --session $SESSION2 --input '{}' &
|
||
|
|
wait
|
||
|
|
|
||
|
|
# Clean up both
|
||
|
|
infsh app run agent-browser --function close --session $SESSION1 --input '{}'
|
||
|
|
infsh app run agent-browser --function close --session $SESSION2 --input '{}'
|
||
|
|
```
|
||
|
|
|
||
|
|
### Use Cases for Parallel Sessions
|
||
|
|
|
||
|
|
1. **A/B Testing** - Compare different pages or user experiences
|
||
|
|
2. **Multi-site scraping** - Gather data from multiple sources
|
||
|
|
3. **Load testing** - Simulate multiple users
|
||
|
|
4. **Cross-region testing** - Use different proxies per session
|
||
|
|
|
||
|
|
## Session Cleanup
|
||
|
|
|
||
|
|
Always close sessions when done:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
infsh app run agent-browser --function close --session $SESSION_ID --input '{}'
|
||
|
|
```
|
||
|
|
|
||
|
|
**Why close matters:**
|
||
|
|
- Releases server resources
|
||
|
|
- Returns video recording (if enabled)
|
||
|
|
- Prevents resource leaks
|
||
|
|
|
||
|
|
### Error Handling
|
||
|
|
|
||
|
|
```bash
|
||
|
|
#!/bin/bash
|
||
|
|
set -e
|
||
|
|
|
||
|
|
cleanup() {
|
||
|
|
infsh app run agent-browser --function close --session $SESSION_ID --input '{}' 2>/dev/null || true
|
||
|
|
}
|
||
|
|
trap cleanup EXIT
|
||
|
|
|
||
|
|
SESSION_ID=$(infsh app run agent-browser --function open --session new --input '{
|
||
|
|
"url": "https://example.com"
|
||
|
|
}' | jq -r '.session_id')
|
||
|
|
|
||
|
|
# ... your automation ...
|
||
|
|
# cleanup runs automatically on exit
|
||
|
|
```
|
||
|
|
|
||
|
|
## Best Practices
|
||
|
|
|
||
|
|
### 1. Store Session IDs
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Store for reuse
|
||
|
|
SESSION_ID=$(... | jq -r '.session_id')
|
||
|
|
infsh ... --session $SESSION_ID ...
|
||
|
|
|
||
|
|
# Bad: Parse every time
|
||
|
|
infsh ... --session $(... | jq -r '.session_id') ...
|
||
|
|
```
|
||
|
|
|
||
|
|
### 2. Close Sessions Promptly
|
||
|
|
|
||
|
|
Don't leave sessions open longer than needed. Server resources are limited.
|
||
|
|
|
||
|
|
### 3. Use Meaningful Variable Names
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Clear purpose
|
||
|
|
LOGIN_SESSION=$(...)
|
||
|
|
SCRAPE_SESSION=$(...)
|
||
|
|
|
||
|
|
# Bad: Generic names
|
||
|
|
S1=$(...)
|
||
|
|
S2=$(...)
|
||
|
|
```
|
||
|
|
|
||
|
|
### 4. Handle Session Expiry
|
||
|
|
|
||
|
|
Sessions may expire after extended inactivity:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Check if session is still valid
|
||
|
|
RESULT=$(infsh app run agent-browser --function snapshot --session $SESSION_ID --input '{}' 2>&1)
|
||
|
|
if echo "$RESULT" | grep -q "session not found"; then
|
||
|
|
echo "Session expired, starting new one"
|
||
|
|
SESSION_ID=$(infsh app run agent-browser --function open --session new --input '{
|
||
|
|
"url": "https://example.com"
|
||
|
|
}' | jq -r '.session_id')
|
||
|
|
fi
|
||
|
|
```
|
||
|
|
|
||
|
|
### 5. One Task Per Session
|
||
|
|
|
||
|
|
For clarity, use one session per logical task:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Good: Separate sessions for separate tasks
|
||
|
|
LOGIN_SESSION=$(...) # Handle login
|
||
|
|
SCRAPE_SESSION=$(...) # Handle scraping
|
||
|
|
|
||
|
|
# Okay for related tasks: One session for a workflow
|
||
|
|
SESSION=$(...)
|
||
|
|
# login -> navigate -> extract -> close
|
||
|
|
```
|