123 lines
4.7 KiB
Python
123 lines
4.7 KiB
Python
from playwright.sync_api import sync_playwright
|
|
import sys, os, random
|
|
import time
|
|
|
|
def change_group(selected_group_index: int):
|
|
|
|
# Playwright 시작 및 브라우저 실행
|
|
playwright = sync_playwright().start()
|
|
|
|
base_path = get_base_dir()
|
|
browser_path = os.path.join(base_path, 'browsers', 'chromium-1140', 'chrome-win','chrome.exe')
|
|
extension_path = os.path.join(base_path, 'browsers', 'extensions', '1.1.100_0')
|
|
user_data_dir = os.path.join(base_path, 'browsers', 'user_data')
|
|
|
|
# User agent 설정
|
|
user_agent = random.choice([
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.0.0",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:108.0) Gecko/20100101 Firefox/108.0",
|
|
"Mozilla/5.0 (Macintosh; Intel Mac OS X 12_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.0 Safari/605.1.15",
|
|
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 OPR/85.0.0.0",
|
|
])
|
|
|
|
# 브라우저 시작 및 설정
|
|
browser = playwright.chromium.launch_persistent_context(
|
|
user_data_dir,
|
|
headless=False,
|
|
permissions=["geolocation", "notifications"],
|
|
geolocation={"latitude": 37.5665, "longitude": 126.9780},
|
|
locale="ko-KR",
|
|
args=[
|
|
'--disable-popup-blocking',
|
|
f'--disable-extensions-except={extension_path}',
|
|
f'--load-extension={extension_path}',
|
|
'--start-maximized',
|
|
'--window-size=1920,1080'
|
|
],
|
|
executable_path=browser_path,
|
|
user_agent=user_agent
|
|
)
|
|
|
|
# 기본 페이지가 없을 수 있으므로 새로운 페이지 생성
|
|
page = browser.new_page()
|
|
|
|
# 로그인 페이지로 이동 (URL을 실제 로그인 페이지로 변경)
|
|
page.goto('https://percenty.co.kr/signin')
|
|
|
|
# 로그인 수행
|
|
admin_toggle = page.locator('button[role="switch"]')
|
|
if admin_toggle.get_attribute("aria-checked") == "true":
|
|
admin_toggle.click() # 관리자 모드에서 직원 모드로 전환
|
|
|
|
page.fill('input[placeholder="이메일 주소 입력"]', 'leensoo1nt@gmail.com')
|
|
page.fill('input[placeholder="직원 아이디 입력"]', 'uploader')
|
|
page.fill('input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]', 'uploader')
|
|
page.click('button:has-text("직원 로그인 하기")')
|
|
|
|
page.wait_for_selector('div[role="dialog"]', timeout=3000, state='visible')
|
|
close_button = page.query_selector("div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default")
|
|
if close_button:
|
|
close_button.click()
|
|
|
|
# 상품 수정 페이지로 이동
|
|
page.wait_for_load_state("networkidle")
|
|
page.click('span.ant-menu-title-content:has-text("신규 상품 등록")')
|
|
|
|
time.sleep(0.5)
|
|
|
|
|
|
page.evaluate("""
|
|
const dropdown = document.querySelector('input#rc_select_1');
|
|
if (dropdown) {
|
|
dropdown.scrollIntoView();
|
|
}
|
|
""")
|
|
|
|
print("해당요소 스크롤")
|
|
|
|
# 그룹 드롭박스 열기
|
|
group_dropdown_css = "div.ant-select-selector"
|
|
page.wait_for_selector(group_dropdown_css)
|
|
print("드롭박스 상위 요소 대기")
|
|
|
|
# 드롭박스 열기
|
|
group_dropdown_click_css = "div.ant-select-selector:nth-child(1)"
|
|
page.click(group_dropdown_click_css)
|
|
print("드롭박스 클릭")
|
|
|
|
# 드롭다운 열림 상태 확인
|
|
dropdown_openstatus_css = "div.ant-select-dropdown:not(.ant-select-dropdown-hidden)"
|
|
page.wait_for_selector(dropdown_openstatus_css)
|
|
print("드롭다운 열림 확인")
|
|
|
|
# 옵션 선택
|
|
group_index_css = f"div.ant-select-item.ant-select-item-option:nth-child({selected_group_index + 1})"
|
|
page.wait_for_selector(group_index_css)
|
|
page.click(group_index_css)
|
|
print(f"[{selected_group_index+1}]번 그룹 선택 완료")
|
|
|
|
# 변경된 그룹 이름 가져오기
|
|
selected_group_name_css = "div#root div:nth-child(4) > div > div > span.ant-select-selection-item"
|
|
selected_group_name = page.inner_text(selected_group_name_css)
|
|
|
|
print(f"변경된 그룹 이름: {selected_group_name}")
|
|
|
|
time.sleep(1)
|
|
|
|
# 브라우저 닫기
|
|
browser.close()
|
|
|
|
def get_base_dir():
|
|
if getattr(sys, 'frozen', False): # 패키징된 경우
|
|
base_dir = os.path.dirname(sys.executable)
|
|
internal_dir = os.path.join(base_dir, '_internal')
|
|
if os.path.exists(internal_dir):
|
|
return internal_dir
|
|
else:
|
|
base_dir = os.path.dirname(os.path.abspath(__file__))
|
|
return base_dir
|
|
|
|
# 실행 예제 (2번째 그룹 선택)
|
|
change_group(selected_group_index=2)
|