- wholesale 패키지 연동 (SooinSession, GeoYoungSession) - Flask Blueprint 분리 (sooin_api.py, geoyoung_api.py) - order_context 스키마 확장 (wholesaler_id, internal_code 등) - 수인약품 개별 취소 기능 (cancel_item, restore_item) - 문서 추가: WHOLESALE_API_INTEGRATION.md - 테스트 스크립트들
84 lines
2.8 KiB
Python
84 lines
2.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""지오영 검색 → 장바구니 추가 테스트"""
|
|
|
|
import requests
|
|
from bs4 import BeautifulSoup
|
|
import asyncio
|
|
from playwright.async_api import async_playwright
|
|
import time
|
|
import re
|
|
|
|
async def get_cookies():
|
|
async with async_playwright() as p:
|
|
browser = await p.chromium.launch(headless=True)
|
|
page = await browser.new_page()
|
|
|
|
await page.goto('https://gwn.geoweb.kr/Member/Login')
|
|
await page.fill('input[type="text"]', '7390')
|
|
await page.fill('input[type="password"]', 'trajet6640')
|
|
await page.click('button, input[type="submit"]')
|
|
await page.wait_for_load_state('networkidle')
|
|
|
|
cookies = await page.context.cookies()
|
|
await browser.close()
|
|
return cookies
|
|
|
|
def test():
|
|
print("1. 로그인...")
|
|
cookies = asyncio.run(get_cookies())
|
|
|
|
session = requests.Session()
|
|
for c in cookies:
|
|
session.cookies.set(c['name'], c['value'])
|
|
|
|
session.headers.update({
|
|
'User-Agent': 'Mozilla/5.0',
|
|
'X-Requested-With': 'XMLHttpRequest'
|
|
})
|
|
|
|
# 2. 검색
|
|
print("\n2. 제품 검색 (661700390 - 콩코르정)...")
|
|
search_resp = session.post('https://gwn.geoweb.kr/Home/PartialSearchProduct', data={
|
|
'srchText': '661700390'
|
|
})
|
|
|
|
soup = BeautifulSoup(search_resp.text, 'html.parser')
|
|
|
|
# 제품 코드 찾기 - data 속성이나 hidden input에서
|
|
rows = soup.find_all('tr')
|
|
print(f" 테이블 행: {len(rows)}개")
|
|
|
|
# HTML 구조 분석
|
|
for row in rows[:2]:
|
|
tds = row.find_all('td')
|
|
if tds:
|
|
print(f" TD 개수: {len(tds)}")
|
|
for i, td in enumerate(tds[:8]):
|
|
text = td.get_text(strip=True)[:30]
|
|
onclick = td.get('onclick', '')[:50]
|
|
data_attrs = {k:v for k,v in td.attrs.items() if k.startswith('data')}
|
|
print(f" [{i}] {text} | onclick={onclick} | data={data_attrs}")
|
|
|
|
# onclick에서 제품 코드 추출
|
|
onclick_pattern = re.findall(r"onclick=['\"]([^'\"]+)['\"]", search_resp.text)
|
|
for oc in onclick_pattern[:3]:
|
|
print(f" onclick: {oc[:100]}")
|
|
|
|
# SelectProduct 함수 호출에서 인덱스 확인
|
|
select_pattern = re.findall(r'SelectProduct\s*\(\s*(\d+)', search_resp.text)
|
|
print(f" SelectProduct 인덱스: {select_pattern[:3]}")
|
|
|
|
# div-product-detail에서 제품 코드 찾기
|
|
product_divs = soup.find_all('div', class_='div-product-detail')
|
|
print(f" product-detail divs: {len(product_divs)}")
|
|
|
|
for div in product_divs[:2]:
|
|
lis = div.find_all('li')
|
|
if lis:
|
|
print(f" li 개수: {len(lis)}")
|
|
for i, li in enumerate(lis[:5]):
|
|
print(f" [{i}] {li.get_text(strip=True)[:50]}")
|
|
|
|
if __name__ == "__main__":
|
|
test()
|