라이브 데모: AI와 대화하고 한 번에 완성된 스크립트 생성하기
이 장에서는 "자연어로 요구사항을 말하는 것"부터 "실행 준비가 완료된 스크립트를 얻는 것"까지의 전체 과정을 실제 사례와 함께 단계별로 보여드립니다.
데모 시나리오
비즈니스 배경: 당신은 20개의 아마존 셀러 계정을 보유하고 있으며, 매일 각 계정의 "Pending(결제 대기)" 주문 수를 확인하여 팀을 위한 엑셀 보고서를 작성해야 합니다.
전통적인 방식: 각 계정에 일일이 하나씩 로그인하고, 주문 수를 기록한 뒤 엑셀에 채워 넣습니다. 이 작업은 약 2시간이 소요됩니다.
AI + Mbbrowser 방식: 요구사항을 설명하면 AI가 스크립트를 생성하고, 스크립트가 나머지 작업을 처리합니다. 설정 시간을 포함하여 총 15분 정도 소요됩니다.
1단계: 준비 작업 (5분)
NOTE
이전 장들을 통해 다음 설정이 완료되었다고 가정합니다:
- ✅ Cursor 또는 Antigravity가 설치됨.
- ✅ Mbbrowser Rules 패키지가 Cursor에 로드됨.
- ✅ Mbbrowser ApiServer가 시작됨 (
http://127.0.0.1:8186). - ✅ 아마존 계정들이 이미 Mbbrowser 환경 내에서 로그인되어 있음 (쿠키 저장됨).
sessions.txt 파일 준비
프로젝트 폴더에 sessions.txt를 만들고 작업하려는 모든 환경 ID를 입력합니다:
a1b2c3d4e5f6789012345678901234ab
b2c3d4e5f67890123456789012345bcd
c3d4e5f678901234567890123456cde
... (한 줄에 하나의 Session_ID, 총 20줄)2단계: Cursor에서 요구사항 입력 (30초)
Ctrl + L을 눌러 Cursor Chat을 열고 다음 내용을 입력합니다:
Mbbrowser sessions.txt 파일에 20개의 계정 Session_ID가 한 줄에 하나씩 들어있어.
이 계정들은 이미 Mbbrowser 환경에서 아마존에 로그인되어 있는 상태야.
다음 기능을 가진 Python 스크립트를 생성해 줘:
1. sessions.txt에서 모든 Session_ID를 읽어온다.
2. 모든 환경을 일괄 실행한다 (최대 10개 동시 실행).
3. 각 환경이 Playwright에 연결된 후:
a. 페이지 로딩을 기다린다 (환경은 보통 마지막으로 닫혔던 페이지에 머물러 있음).
b. https://www.amazon.com/gp/orders-v2/list (아마존 셀러 주문 페이지)로 이동한다.
c. .a-row.shipment 요소가 나타날 때까지 기다린다 (주문 목록 로딩 완료 신호).
d. 페이지 내의 .shipment-status-buyerPending 요소 개수를 센다 (이것이 "Pending" 주문임).
e. Session_ID의 앞 8자리 + Pending 주문 수를 결과에 기록한다.
4. 모든 작업이 끝나면 모든 환경을 종료한다.
5. 결과를 amazon_orders_[오늘 날짜].xlsx에 저장한다.
컬럼 구성: 환경 ID (앞 8자리), Pending 주문 수, 확인 시간, 상태.
예외가 발생하면 errors/ 폴더에 스크린샷을 저장하고 결과 표에 "확인 실패"라고 기록해 줘.3단계: AI 코드 생성 (약 30초)
요청을 받으면 Cursor의 AI가 전체 코드를 생성합니다. 생성된 결과는 다음과 같은 모습일 것입니다:
"""
Mbbrowser + 아마존 주문 확인 스크립트
모든 환경의 결제 대기(Pending) 주문 수를 자동으로 확인합니다.
"""
import threading
import datetime
from pathlib import Path
from concurrent.futures import ThreadPoolExecutor, as_completed
import requests
import openpyxl
from playwright.sync_api import sync_playwright, TimeoutError as PWTimeout
# ==============================
# 설정 (필요에 따라 수정)
# ==============================
APISERVER = "http://127.0.0.1:8186"
SESSIONS_FILE = "sessions.txt"
MAX_WORKERS = 10 # 최대 동시 실행 수
ERRORS_DIR = Path("errors")
ERRORS_DIR.mkdir(exist_ok=True)
results_lock = threading.Lock()
results = []
# ==============================
# APIServer 래퍼 함수
# ==============================
def start_env(session_id: str) -> dict | None:
try:
resp = requests.post(
f"{APISERVER}/api/v1/browser/start",
json={"Session_ID": [session_id], "isHeadless": False},
timeout=30
)
data = resp.json()
if data["code"] == 0:
return data["data"]["listid"][0]
except Exception as e:
print(f"[{session_id[:8]}] APIServer 오류: {e}")
return None
def stop_env(session_id: str):
try:
requests.post(
f"{APISERVER}/api/v1/browser/stop",
json={"Session_ID": session_id},
timeout=10
)
except Exception:
pass
# ==============================
# 개별 계정 작업 단위
# ==============================
def check_orders(session_id: str):
now = datetime.datetime.now().strftime("%H:%M:%S")
env_short = session_id[:8]
env_data = start_env(session_id)
if not env_data:
with results_lock:
results.append({
"env_id": env_short,
"pending_orders": "N/A",
"check_time": now,
"status": "환경 실행 실패"
})
return
port = env_data.get("browser_CDP_Port")
ws = f"ws://127.0.0.1:{port}/json/version"
pw = sync_playwright().start()
try:
browser = pw.chromium.connect_over_cdp(ws)
context = browser.contexts[0]
page = context.pages[0] if context.pages else context.new_page()
# 아마존 주문 페이지로 이동
page.goto(
"https://www.amazon.com/gp/orders-v2/list",
wait_until="domcontentloaded",
timeout=20000
)
# 주문 목록 로딩 대기
page.wait_for_selector(".a-row.shipment", timeout=15000)
# Pending 주문 수 카운트
pending = page.locator(".shipment-status-buyerPending").count()
print(f"[{env_short}] ✅ Pending 주문 수: {pending}")
with results_lock:
results.append({
"env_id": env_short,
"pending_orders": pending,
"check_time": now,
"status": "성공"
})
browser.close()
except PWTimeout:
page.screenshot(path=str(ERRORS_DIR / f"{env_short}_timeout.png"))
with results_lock:
results.append({
"env_id": env_short,
"pending_orders": "N/A",
"check_time": now,
"status": "페이지 타임아웃"
})
except Exception as e:
try:
page.screenshot(path=str(ERRORS_DIR / f"{env_short}_error.png"))
except Exception:
pass
with results_lock:
results.append({
"env_id": env_short,
"pending_orders": "N/A",
"check_time": now,
"status": f"예외 발생: {str(e)[:50]}"
})
finally:
try:
pw.stop()
except Exception:
pass
stop_env(session_id)
# ==============================
# 메인 프로그램
# ==============================
def main():
# Session_ID 목록 읽기
session_ids = [
line.strip()
for line in Path(SESSIONS_FILE).read_text().splitlines()
if line.strip()
]
print(f"📋 총 {len(session_ids)}개 계정, 최대 동시 실행 {MAX_WORKERS}")
# 동시 실행 처리
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as pool:
futures = {pool.submit(check_orders, sid): sid for sid in session_ids}
for future in as_completed(futures):
sid = futures[future]
try:
future.result()
except Exception as e:
print(f"[{sid[:8]}] 처리되지 않은 예외: {e}")
# 엑셀 보고서 저장
today = datetime.date.today().strftime("%Y%m%d")
filename = f"amazon_orders_{today}.xlsx"
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "주문 확인 결과"
ws.append(["환경 ID (앞 8자리)", "Pending 주문 수", "확인 시간", "상태"])
for r in results:
ws.append([r["env_id"], r["pending_orders"], r["check_time"], r["status"]])
wb.save(filename)
# 요약 보고
success = sum(1 for r in results if r["status"] == "성공")
print(f"\n{'='*40}")
print(f"✅ 성공: {success} / {len(results)}")
print(f"📄 보고서 저장 완료: {filename}")
print(f"❌ 오류 스크린샷 저장: errors/ 폴더")
if __name__ == "__main__":
main()4단계: 의존성 설치 및 실행 (2분)
코드 생성 후, AI는 보통 필요한 의존성 설치 방법을 안내합니다:
pip install playwright requests openpyxl그 다음 바로 실행하면 됩니다:
python check_amazon_orders.py예상 출력 결과
📋 총 20개 계정, 최대 동시 실행 10
[a1b2c3d4] ✅ Pending 주문 수: 3
[b2c3d4e5] ✅ Pending 주문 수: 0
[c3d4e5f6] ✅ Pending 주문 수: 7
...
========================================
✅ 성공: 18 / 20
📄 보고서 저장 완료: amazon_orders_20260226.xlsx
❌ 오류 스크린샷 저장: errors/ 폴더자주 발생하는 문제 및 AI 수정 팁
"스크립트는 실행되는데 주문 요소를 찾지 못해요"
해당 코드를 선택하고 Ctrl + K를 누릅니다. 다음과 같이 입력하세요:
아마존 페이지의 선택자가 변경된 것 같아. 실제 주문 행 선택자는 .order-info이고, 보류 상태 선택자는 .order-status-pending이야. 코드를 업데이트해 줘."주문 상세 정보도 수집하는 기능을 추가해 줘"
Chat에서 대화를 이어갑니다:
위 코드에 기반해서, 주문 수량을 수집한 후 각 보류 주문의 주문 ID(.a-fixed-right-grid-col .a-link-normal)와 예상 배송일(.expected-ship-date)도 함께 수집해서 엑셀에 기록해 줘."동시 실행이 너무 빨라서 팅겨요; 속도 조절이 필요해"
ThreadPoolExecutor를 사용할 때, 너무 많은 환경이 한꺼번에 열려 메모리 문제가 발생하지 않도록 각 새로운 작업이 시작되기 전에 3초간 대기하는 로직을 추가해 줘.요약: AI 스크립트 작성을 위한 모범 사례
[ 준비 단계 ]
1. Rules 패키지 주입 → AI가 모든 Mbbrowser 인터페이스를 이해함.
2. ApiServer가 시작되었는지 확인.
[ 요구사항 설명 ]
구체적일수록 좋습니다:
✅ "https://xxx에 접속해서 #main-content 요소가 나올 때까지 기다린 후, .order-btn을 클릭하고 성공 팝업이 뜰 때까지 대기해 줘."
❌ "주문 관리를 도와줘."
[ 생성 ]
보통 80%는 즉시 사용 가능합니다. 사소한 문제는 추가 대화를 통해 수정하세요.
[ 반복 최적화 ]
"이 코드에 기반해서 xx 기능을 추가해 줘" → AI가 코드를 다시 쓰지 않고 변경 사항만 추가합니다.IMPORTANT
중요 알림: AI가 생성한 코드에는 때때로 사소한 오류가 있을 수 있습니다. 광범위하게 배포하기 전에 항상 1~2개의 테스트 계정에서 먼저 테스트를 실행하세요. 검증된 후에만 전체 계정으로 확대하세요.
TIP
🎉 축하합니다! 이제 AI 모델을 사용하여 Mbbrowser 자동화 스크립트를 생성하는 전체 방법을 마스터하셨습니다.
문제가 발생했나요? 해당 단원을 다시 참조해 보세요:
- 인터페이스가 맞지 않나요? → Mbbrowser Rules 패키지에서 ApiServer 사용법을 확인하세요.
- 스크립트 아이디어가 떠오르지 않나요? → Skills 패키지에서 시나리오별 템플릿을 찾아보세요.
