Browse Source
- Merge 12 separate screenshot scripts into generate_screenshots.py - Fix inverted retry logic in server readiness check (break on success instead of on ConnectError) - Fix duplicate browser launch and viewport loss in cookie_param_models and query_param_models - Add wait_for_server() for scripts that were missing it (separate_openapi_schemas) - Support running all or individual screenshots via CLI argumentspull/15399/head
13 changed files with 233 additions and 432 deletions
@ -1,38 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("link", name="/items/").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/cookie-param-models/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/cookie_param_models/tutorial001.py"] |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -0,0 +1,233 @@ |
|||||
|
"""Generate screenshots for FastAPI documentation. |
||||
|
|
||||
|
Usage: |
||||
|
python generate_screenshots.py # Generate all screenshots |
||||
|
python generate_screenshots.py <name> # Generate a specific screenshot |
||||
|
python generate_screenshots.py --list # List available screenshot names |
||||
|
""" |
||||
|
|
||||
|
import subprocess |
||||
|
import time |
||||
|
|
||||
|
import httpx |
||||
|
from playwright.sync_api import Page, sync_playwright |
||||
|
|
||||
|
|
||||
|
def wait_for_server( |
||||
|
url: str = "http://localhost:8000/docs", *, retries: int = 10 |
||||
|
) -> None: |
||||
|
"""Wait for the server to be ready by polling the given URL.""" |
||||
|
for _ in range(retries): |
||||
|
try: |
||||
|
response = httpx.get(url) |
||||
|
if response.status_code == 200: |
||||
|
break |
||||
|
except httpx.ConnectError: |
||||
|
time.sleep(1) |
||||
|
|
||||
|
|
||||
|
# ---- Interaction steps for each screenshot ---- |
||||
|
|
||||
|
|
||||
|
def separate_openapi_schemas_image01(page: Page) -> None: |
||||
|
page.get_by_text("POST/items/Create Item").click() |
||||
|
page.get_by_role("tab", name="Schema").first.click() |
||||
|
|
||||
|
|
||||
|
def separate_openapi_schemas_image02(page: Page) -> None: |
||||
|
page.get_by_text("GET/items/Read Items").click() |
||||
|
page.get_by_role("button", name="Try it out").click() |
||||
|
page.get_by_role("button", name="Execute").click() |
||||
|
|
||||
|
|
||||
|
def separate_openapi_schemas_image03(page: Page) -> None: |
||||
|
page.get_by_text("GET/items/Read Items").click() |
||||
|
page.get_by_role("tab", name="Schema").click() |
||||
|
page.get_by_label("Schema").get_by_role("button", name="Expand all").click() |
||||
|
|
||||
|
|
||||
|
def separate_openapi_schemas_image04(page: Page) -> None: |
||||
|
page.get_by_role("button", name="Item", exact=True).click() |
||||
|
page.set_viewport_size({"width": 960, "height": 820}) |
||||
|
|
||||
|
|
||||
|
def separate_openapi_schemas_image05(page: Page) -> None: |
||||
|
page.get_by_role("button", name="Item", exact=True).click() |
||||
|
page.set_viewport_size({"width": 960, "height": 700}) |
||||
|
|
||||
|
|
||||
|
def request_form_models_image01(page: Page) -> None: |
||||
|
page.get_by_role("button", name="POST /login/ Login").click() |
||||
|
page.get_by_role("button", name="Try it out").click() |
||||
|
|
||||
|
|
||||
|
def header_param_models_image01(page: Page) -> None: |
||||
|
page.get_by_role("button", name="GET /items/ Read Items").click() |
||||
|
page.get_by_role("button", name="Try it out").click() |
||||
|
|
||||
|
|
||||
|
def json_base64_bytes_image01(page: Page) -> None: |
||||
|
page.get_by_role("button", name="POST /data Post Data").click() |
||||
|
|
||||
|
|
||||
|
def cookie_param_models_image01(page: Page) -> None: |
||||
|
page.get_by_role("link", name="/items/").click() |
||||
|
|
||||
|
|
||||
|
def query_param_models_image01(page: Page) -> None: |
||||
|
page.get_by_role("button", name="GET /items/ Read Items").click() |
||||
|
page.get_by_role("button", name="Try it out").click() |
||||
|
page.get_by_role("heading", name="Servers").click() |
||||
|
|
||||
|
|
||||
|
def sql_databases_image01(page: Page) -> None: |
||||
|
page.get_by_label("post /heroes/").click() |
||||
|
|
||||
|
|
||||
|
def sql_databases_image02(page: Page) -> None: |
||||
|
page.get_by_label("post /heroes/").click() |
||||
|
|
||||
|
|
||||
|
# ---- Screenshot configurations ---- |
||||
|
|
||||
|
SCREENSHOTS: list[dict] = [ |
||||
|
# separate_openapi_schemas |
||||
|
{ |
||||
|
"name": "separate_openapi_schemas_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/separate_openapi_schemas/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": separate_openapi_schemas_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/separate-openapi-schemas/image01.png", |
||||
|
}, |
||||
|
{ |
||||
|
"name": "separate_openapi_schemas_image02", |
||||
|
"cmd": ["fastapi", "run", "docs_src/separate_openapi_schemas/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": separate_openapi_schemas_image02, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/separate-openapi-schemas/image02.png", |
||||
|
}, |
||||
|
{ |
||||
|
"name": "separate_openapi_schemas_image03", |
||||
|
"cmd": ["fastapi", "run", "docs_src/separate_openapi_schemas/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": separate_openapi_schemas_image03, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/separate-openapi-schemas/image03.png", |
||||
|
}, |
||||
|
{ |
||||
|
"name": "separate_openapi_schemas_image04", |
||||
|
"cmd": ["fastapi", "run", "docs_src/separate_openapi_schemas/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": separate_openapi_schemas_image04, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/separate-openapi-schemas/image04.png", |
||||
|
}, |
||||
|
{ |
||||
|
"name": "separate_openapi_schemas_image05", |
||||
|
"cmd": ["fastapi", "run", "docs_src/separate_openapi_schemas/tutorial002_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": separate_openapi_schemas_image05, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/separate-openapi-schemas/image05.png", |
||||
|
}, |
||||
|
# request_form_models |
||||
|
{ |
||||
|
"name": "request_form_models_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/request_form_models/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": request_form_models_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/request-form-models/image01.png", |
||||
|
}, |
||||
|
# header_param_models |
||||
|
{ |
||||
|
"name": "header_param_models_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/header_param_models/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": header_param_models_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/header-param-models/image01.png", |
||||
|
}, |
||||
|
# json_base64_bytes |
||||
|
{ |
||||
|
"name": "json_base64_bytes_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/json_base64_bytes/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": json_base64_bytes_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/json-base64-bytes/image01.png", |
||||
|
}, |
||||
|
# cookie_param_models |
||||
|
{ |
||||
|
"name": "cookie_param_models_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/cookie_param_models/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": cookie_param_models_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/cookie-param-models/image01.png", |
||||
|
}, |
||||
|
# query_param_models |
||||
|
{ |
||||
|
"name": "query_param_models_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/query_param_models/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": query_param_models_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/query-param-models/image01.png", |
||||
|
}, |
||||
|
# sql_databases |
||||
|
{ |
||||
|
"name": "sql_databases_image01", |
||||
|
"cmd": ["fastapi", "run", "docs_src/sql_databases/tutorial001_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": sql_databases_image01, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/sql-databases/image01.png", |
||||
|
}, |
||||
|
{ |
||||
|
"name": "sql_databases_image02", |
||||
|
"cmd": ["fastapi", "run", "docs_src/sql_databases/tutorial002_py310.py"], |
||||
|
"wait_for_server": True, |
||||
|
"interact": sql_databases_image02, |
||||
|
"screenshot_path": "docs/en/docs/img/tutorial/sql-databases/image02.png", |
||||
|
}, |
||||
|
] |
||||
|
|
||||
|
|
||||
|
def generate_screenshot(config: dict) -> None: |
||||
|
"""Generate a single screenshot based on the given configuration.""" |
||||
|
process = subprocess.Popen(config["cmd"]) |
||||
|
try: |
||||
|
if config.get("wait_for_server"): |
||||
|
wait_for_server() |
||||
|
with sync_playwright() as playwright: |
||||
|
browser = playwright.chromium.launch(headless=False) |
||||
|
# Update the viewport manually |
||||
|
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
||||
|
page = context.new_page() |
||||
|
page.goto("http://localhost:8000/docs") |
||||
|
|
||||
|
# Run custom interaction steps |
||||
|
config["interact"](page) |
||||
|
|
||||
|
# Manually add the screenshot |
||||
|
page.screenshot(path=config["screenshot_path"]) |
||||
|
|
||||
|
# --------------------- |
||||
|
context.close() |
||||
|
browser.close() |
||||
|
finally: |
||||
|
process.terminate() |
||||
|
|
||||
|
|
||||
|
if __name__ == "__main__": |
||||
|
import sys |
||||
|
|
||||
|
if "--list" in sys.argv: |
||||
|
for config in SCREENSHOTS: |
||||
|
print(config["name"]) |
||||
|
sys.exit(0) |
||||
|
|
||||
|
name = sys.argv[1] if len(sys.argv) > 1 else None |
||||
|
failed: list[str] = [] |
||||
|
for config in SCREENSHOTS: |
||||
|
if name is None or config["name"] == name: |
||||
|
try: |
||||
|
generate_screenshot(config) |
||||
|
except Exception as e: |
||||
|
print(f"ERROR: Failed to generate '{config['name']}': {e}") |
||||
|
failed.append(config["name"]) |
||||
|
if failed: |
||||
|
print(f"\nFailed screenshots: {', '.join(failed)}") |
||||
|
sys.exit(1) |
||||
@ -1,39 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="GET /items/ Read Items").click() |
|
||||
page.get_by_role("button", name="Try it out").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/header-param-models/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/header_param_models/tutorial001.py"] |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,38 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="POST /data Post Data").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/json-base64-bytes/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/json_base64_bytes/tutorial001_py310.py"] |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,40 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="GET /items/ Read Items").click() |
|
||||
page.get_by_role("button", name="Try it out").click() |
|
||||
page.get_by_role("heading", name="Servers").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/query-param-models/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/query_param_models/tutorial001.py"] |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,39 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="POST /login/ Login").click() |
|
||||
page.get_by_role("button", name="Try it out").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/request-form-models/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/request_form_models/tutorial001.py"] |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,32 +0,0 @@ |
|||||
import subprocess |
|
||||
|
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_text("POST/items/Create Item").click() |
|
||||
page.get_by_role("tab", name="Schema").first.click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot( |
|
||||
path="docs/en/docs/img/tutorial/separate-openapi-schemas/image01.png" |
|
||||
) |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["uvicorn", "docs_src.separate_openapi_schemas.tutorial001:app"] |
|
||||
) |
|
||||
try: |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,33 +0,0 @@ |
|||||
import subprocess |
|
||||
|
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_text("GET/items/Read Items").click() |
|
||||
page.get_by_role("button", name="Try it out").click() |
|
||||
page.get_by_role("button", name="Execute").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot( |
|
||||
path="docs/en/docs/img/tutorial/separate-openapi-schemas/image02.png" |
|
||||
) |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["uvicorn", "docs_src.separate_openapi_schemas.tutorial001:app"] |
|
||||
) |
|
||||
try: |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,33 +0,0 @@ |
|||||
import subprocess |
|
||||
|
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_text("GET/items/Read Items").click() |
|
||||
page.get_by_role("tab", name="Schema").click() |
|
||||
page.get_by_label("Schema").get_by_role("button", name="Expand all").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot( |
|
||||
path="docs/en/docs/img/tutorial/separate-openapi-schemas/image03.png" |
|
||||
) |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["uvicorn", "docs_src.separate_openapi_schemas.tutorial001:app"] |
|
||||
) |
|
||||
try: |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,32 +0,0 @@ |
|||||
import subprocess |
|
||||
|
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="Item-Input").click() |
|
||||
page.get_by_role("button", name="Item-Output").click() |
|
||||
page.set_viewport_size({"width": 960, "height": 820}) |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot( |
|
||||
path="docs/en/docs/img/tutorial/separate-openapi-schemas/image04.png" |
|
||||
) |
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["uvicorn", "docs_src.separate_openapi_schemas.tutorial001:app"] |
|
||||
) |
|
||||
try: |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,32 +0,0 @@ |
|||||
import subprocess |
|
||||
|
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_role("button", name="Item", exact=True).click() |
|
||||
page.set_viewport_size({"width": 960, "height": 700}) |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot( |
|
||||
path="docs/en/docs/img/tutorial/separate-openapi-schemas/image05.png" |
|
||||
) |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["uvicorn", "docs_src.separate_openapi_schemas.tutorial002:app"] |
|
||||
) |
|
||||
try: |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,38 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_label("post /heroes/").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/sql-databases/image01.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/sql_databases/tutorial001.py"], |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
@ -1,38 +0,0 @@ |
|||||
import subprocess |
|
||||
import time |
|
||||
|
|
||||
import httpx |
|
||||
from playwright.sync_api import Playwright, sync_playwright |
|
||||
|
|
||||
|
|
||||
# Run playwright codegen to generate the code below, copy paste the sections in run() |
|
||||
def run(playwright: Playwright) -> None: |
|
||||
browser = playwright.chromium.launch(headless=False) |
|
||||
# Update the viewport manually |
|
||||
context = browser.new_context(viewport={"width": 960, "height": 1080}) |
|
||||
page = context.new_page() |
|
||||
page.goto("http://localhost:8000/docs") |
|
||||
page.get_by_label("post /heroes/").click() |
|
||||
# Manually add the screenshot |
|
||||
page.screenshot(path="docs/en/docs/img/tutorial/sql-databases/image02.png") |
|
||||
|
|
||||
# --------------------- |
|
||||
context.close() |
|
||||
browser.close() |
|
||||
|
|
||||
|
|
||||
process = subprocess.Popen( |
|
||||
["fastapi", "run", "docs_src/sql_databases/tutorial002.py"], |
|
||||
) |
|
||||
try: |
|
||||
for _ in range(10): |
|
||||
try: |
|
||||
response = httpx.get("http://localhost:8000/docs") |
|
||||
if response.status_code == 200: |
|
||||
break |
|
||||
except httpx.ConnectError: |
|
||||
time.sleep(1) |
|
||||
with sync_playwright() as playwright: |
|
||||
run(playwright) |
|
||||
finally: |
|
||||
process.terminate() |
|
||||
Loading…
Reference in new issue