web-navigation-strategies
This tool provides decision trees and site-specific selectors to assist in planning and executing multi-page navigation using Playwright MCP.
Install
mkdir -p .claude/skills/web-navigation-strategies && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/3892" && unzip -o skill.zip -d .claude/skills/web-navigation-strategies && rm skill.zipInstalls to .claude/skills/web-navigation-strategies
Activation
This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.
Strategic navigation patterns and selector guides for thorough web exploration using Playwright MCP. Provides decision trees, navigation strategies, and site-specific selectors for reading multiple pages systematically. Use when planning how to navigate websites, determining reading depth, or finding the right selectors for Playwright MCP commands.Key capabilities
- →Plan multi-page web navigation strategies
- →Identify optimal CSS selectors for scraping
- →Create navigation decision trees
- →Execute Playwright MCP commands
How it works
The skill provides a framework for choosing navigation patterns like pagination or infinite scroll based on the depth of information required.
Inputs & outputs
When to use web-navigation-strategies
- →Design a site crawling strategy
- →Identify optimal CSS selectors for navigation
- →Plan systematic multi-page scraping
- →Create navigation decision trees
About this skill
Web Navigation Strategies for Playwright MCP
Strategic guide for systematic web exploration using Playwright MCP tools. This skill provides navigation patterns, not executable code.
Reading Depth Decision Framework
1. Analyze User Intent
Query Analysis Decision Tree:
├── Keywords: "간단히, 요약, 훑어, quick, summary, overview"
│ → **QUICK MODE**
│ → Extract: Titles + First paragraphs only
│ → Pages: 30-50 (fast scan)
│
├── Keywords: "자세히, 상세, 모든, 댓글, detailed, comprehensive, everything"
│ → **DEEP MODE**
│ → Extract: Full content + Comments + Metadata + Related links
│ → Pages: 5-10 (thorough read)
│
└── No specific keywords
→ **STANDARD MODE**
→ Extract: Main content + Basic metadata
→ Pages: 15-20 (balanced)
2. Execute Based on Depth
Quick Mode Strategy
// Get titles and summaries only
mcp_playwright.navigate(url)
links = mcp_playwright.query_selector_all('h2 a, h3 a')
for (link in links.slice(0, 50)) {
mcp_playwright.click(link)
title = mcp_playwright.get_text('h1')
summary = mcp_playwright.get_text('p:first-of-type')
mcp_playwright.go_back()
}
Standard Mode Strategy
// Get full main content
mcp_playwright.navigate(url)
links = mcp_playwright.query_selector_all('article a')
for (link in links.slice(0, 20)) {
mcp_playwright.click(link)
mcp_playwright.wait_for_load_state('networkidle')
content = mcp_playwright.get_text('main, article, .content')
mcp_playwright.go_back()
}
Deep Mode Strategy
// Get everything including discussions
mcp_playwright.navigate(url)
links = mcp_playwright.query_selector_all('article a')
for (link in links.slice(0, 10)) {
mcp_playwright.click(link)
mcp_playwright.wait_for_load_state('networkidle')
// Main content
content = mcp_playwright.get_text('article, main')
// Comments
comments = mcp_playwright.query_selector_all('.comment')
for (comment in comments) {
comment_text = mcp_playwright.get_text(comment)
}
// Metadata
author = mcp_playwright.get_text('.author, .writer')
date = mcp_playwright.get_text('time, .date')
// Related links
related = mcp_playwright.query_selector_all('.related a')
mcp_playwright.go_back()
}
Core Navigation Patterns
Pattern 1: List-Detail Navigation
Use for: Blog indexes, search results, news listings
Step-by-Step Process:
1. Navigate to list page
2. Collect all article links
3. For each link:
a. Click link
b. Wait for page load
c. Extract content
d. Navigate back
e. Continue with next
MCP Commands:
// Navigate to list
mcp_playwright.navigate('https://blog.com/posts')
// Get all article links
article_links = mcp_playwright.query_selector_all('article a[href]')
// Process each
for (link in article_links) {
// Enter detail page
mcp_playwright.click(link)
mcp_playwright.wait_for_load_state('networkidle')
// Extract content
text = mcp_playwright.get_text('article')
// Return to list
mcp_playwright.go_back()
mcp_playwright.wait_for_load_state('networkidle')
}
Pattern 2: Pagination Traversal
Use for: Multi-page results, forums, archives
Process:
1. Process current page
2. Find "Next" button
3. Click and repeat
4. Stop when no more pages
MCP Commands:
while (true) {
// Process current page
articles = mcp_playwright.query_selector_all('article')
for (article in articles) {
// Extract content
}
// Check for next page
next_button = mcp_playwright.query_selector('a.next, [rel="next"]')
if (!next_button) break
// Go to next page
mcp_playwright.click(next_button)
mcp_playwright.wait_for_load_state('networkidle')
}
Pattern 3: Infinite Scroll
Use for: Social media, modern blogs, dynamic content
// Scroll and load pattern
current_height = 0
while (true) {
// Get current height
new_height = mcp_playwright.evaluate('document.body.scrollHeight')
if (new_height == current_height) break
// Scroll to bottom
mcp_playwright.evaluate('window.scrollTo(0, document.body.scrollHeight)')
mcp_playwright.wait_for_timeout(2000) // Wait for content load
current_height = new_height
}
// Then extract all loaded content
all_articles = mcp_playwright.query_selector_all('article')
Site-Specific Selector Patterns
Korean Portals
Naver (네이버)
// Search results
list_selector: '.blog_list li'
link_selector: '.api_txt_lines.total_tit'
content_selector: '.se-main-container'
comment_selector: '.u_cbox_contents'
// Blog specific
blog_content: '#postViewArea, .se-main-container'
blog_title: '.se-title-text, .pcol1'
Daum (다음)
// Search results
list_selector: '.list_info'
link_selector: '.f_link_b, .tit_main'
content_selector: '.article_view'
// Tistory blogs
tistory_content: '.entry-content, .article-view'
tistory_comments: '.comment-list'
Brunch
article_list: '.wrap_article_list li'
article_link: 'a.link_post'
article_content: '.wrap_body'
Global Sites
Medium
article_list: 'article'
article_link: 'h2 a, h3 a'
article_content: 'section.pw-post-body'
clap_count: '[aria-label*="clap"]'
post_list: '[data-testid="post-container"]'
post_content: '[data-click-id="text"]'
comments: '.Comment'
upvotes: '[aria-label*="upvote"]'
Generic Patterns
// Works on most blogs
article_containers: 'article, .post, .entry, .blog-post'
title_selectors: 'h1, .title, .post-title, .entry-title'
content_selectors: 'main, .content, .post-content, .entry-content'
comment_selectors: '.comments, .comment-list, #comments'
author_selectors: '.author, .by-author, .writer, [rel="author"]'
date_selectors: 'time, .date, .published, .post-date'
Intelligent Navigation Decisions
When to Use Each Pattern
| Scenario | Pattern | Depth | Example |
|---|---|---|---|
| "뉴스 헤드라인 훑어봐" | List-Detail | Quick | 50 titles |
| "블로그 글 10개 읽어줘" | List-Detail | Standard | Full content |
| "포럼 댓글까지 분석해" | List-Detail | Deep | With comments |
| "모든 페이지 다 봐" | Pagination | Standard | All pages |
| "인스타 피드 쭉 봐" | Infinite Scroll | Quick | Social media |
Selector Priority Strategy
1. Try specific selector first
→ '.se-main-container' (Naver specific)
2. Fallback to semantic HTML
→ 'article', 'main'
3. Try common class patterns
→ '.content', '.post-content'
4. Last resort: get all text
→ 'body' (then clean up)
MCP Command Reference
Essential Commands
// Navigation
mcp_playwright.navigate(url)
mcp_playwright.go_back()
mcp_playwright.go_forward()
mcp_playwright.reload()
// Element Selection
mcp_playwright.query_selector(selector) // First match
mcp_playwright.query_selector_all(selector) // All matches
// Interaction
mcp_playwright.click(element_or_selector)
mcp_playwright.type(selector, text)
mcp_playwright.scroll_to(x, y)
// Content Extraction
mcp_playwright.get_text(selector)
mcp_playwright.get_attribute(selector, attribute)
mcp_playwright.get_url()
mcp_playwright.get_title()
// Waiting
mcp_playwright.wait_for_selector(selector)
mcp_playwright.wait_for_load_state('networkidle')
mcp_playwright.wait_for_timeout(milliseconds)
// JavaScript Execution
mcp_playwright.evaluate(javascript_code)
Practical Examples
Example 1: Quick News Scan
// User: "네이버 뉴스 제목만 빠르게 훑어줘"
mcp_playwright.navigate('https://news.naver.com')
headlines = mcp_playwright.query_selector_all('.news_tit')
for (headline in headlines.slice(0, 30)) {
title = mcp_playwright.get_text(headline)
// Store title
}
Example 2: Blog Deep Dive
// User: "이 블로그 최신글 5개 댓글까지 자세히 봐줘"
mcp_playwright.navigate('https://blog.example.com')
posts = mcp_playwright.query_selector_all('.post-link')
for (post in posts.slice(0, 5)) {
mcp_playwright.click(post)
// Get everything
title = mcp_playwright.get_text('h1')
content = mcp_playwright.get_text('article')
author = mcp_playwright.get_text('.author')
date = mcp_playwright.get_text('.date')
// Get all comments
comments = mcp_playwright.query_selector_all('.comment')
for (comment in comments) {
text = mcp_playwright.get_text(comment)
}
mcp_playwright.go_back()
}
Example 3: Forum Thread Analysis
// User: "레딧 스레드 전체 토론 분석해줘"
mcp_playwright.navigate(reddit_url)
// Main post
main_post = mcp_playwright.get_text('[data-click-id="text"]')
upvotes = mcp_playwright.get_text('[aria-label*="upvote"]')
// All comments with nested replies
all_comments = mcp_playwright.query_selector_all('.Comment')
for (comment in all_comments) {
text = mcp_playwright.get_text(comment)
// Parse nested structure
}
Error Handling Strategies
Common Issues and Solutions
-
Selector Not Found
// Try multiple selectors content = mcp_playwright.query_selector('article') || mcp_playwright.query_selector('main') || mcp_playwright.query_selector('.content') || mcp_playwright.query_selector('body') -
Dynamic Content Not Loaded
// Wait strategies mcp_playwright.wait_for_load_state('networkidle') mcp_playwright.wait_for_selector('.content', timeout=10000) mcp_playwright.wait_for_timeout(2000) // Last resort -
Navigation Failed
try { mcp_playwright.go_back() } catch { // Fallback: navigate directly mcp_playwright.navigate(list_page_url) }
Best Practices
DO ✅
- Wait for content to load before extraction
- Use specific selectors when possible
- Handle pagination and infinite scroll
- Extract metadata (author, da
Content truncated.
When not to use it
- →When the target site does not support Playwright automation
Prerequisites
Limitations
- →Selectors vary by website structure
- →Requires manual selector identification for new sites
How it compares
It offers a strategic planning layer for web exploration rather than just executing raw automation scripts.
Compared to similar skills
web-navigation-strategies side by side with the closest alternatives in the catalog.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| web-navigation-strategies (this skill) | 1 | 5mo | No flags | Advanced |
| reddit-fetch | 9 | 2mo | Review | Beginner |
| brightdata-web-mcp | 9 | 6mo | Review | Intermediate |
| firecrawl-scrape | 5 | 7mo | Review | Beginner |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by krafton-ai
View all by krafton-ai →You might also like
reddit-fetch
ykdojo
Fetch content from Reddit using Gemini CLI when WebFetch is blocked. Use when accessing Reddit URLs, researching topics on Reddit, or when Reddit returns 403/blocked errors.
brightdata-web-mcp
patchy631
Search the web, scrape websites, extract structured data from URLs, and automate browsers using Bright Data's Web MCP. Use when fetching live web content, bypassing blocks/CAPTCHAs, getting product data from Amazon/eBay, social media posts, or when standard requests fail.
firecrawl-scrape
parcadei
Scrape web pages and extract content via Firecrawl MCP
tavily-web
davila7
Web search, content extraction, crawling, and research capabilities using Tavily API
webclaw
0xmassi
Web extraction engine with antibot bypass. Scrape, crawl, extract, summarize, search, map, diff, monitor, research, and analyze any URL — including Cloudflare-protected sites. Use when you need reliable web content, the built-in web_fetch fails, or you need structured data extraction from web pages.
batch-research
miantiao-me
批量数据采集技能,负责分批并发调度 researcher agent 抓取所有数据源。