120 lines
5.3 KiB
Python
120 lines
5.3 KiB
Python
import re
|
|
from playwright.async_api import TimeoutError
|
|
from typing import List
|
|
import logging
|
|
|
|
|
|
class TagsHandler:
|
|
def __init__(self, locator_manager, browser_controller, logger, toggle_states):
|
|
self.locator_manager = locator_manager
|
|
self.browser_controller = browser_controller
|
|
self.page = self.browser_controller.page
|
|
self.logger = logger
|
|
self.toggle_states = toggle_states
|
|
|
|
# Locator들을 미리 로드하여 초기화
|
|
self.tags_input_locator = self.locator_manager.get_locator('TagsLocators', 'tags_input_locator')
|
|
self.tags_input_button_locator = self.locator_manager.get_locator('TagsLocators', 'tags_input_Button_locator')
|
|
self.delete_warning_tags_button_locator = self.locator_manager.get_locator('TagsLocators', 'delete_warning_tags_button_locator')
|
|
|
|
def update_page(self, page1):
|
|
self.page = page1
|
|
self.logger.log(f"page 객체 업데이트 : {page1}", level=logging.DEBUG)
|
|
|
|
async def process_tags(self, title_infos={}):
|
|
"""
|
|
태그 입력, 입력 버튼 클릭, 경고 키워드 삭제를 처리하는 메서드.
|
|
"""
|
|
self.logger.log(f"process_tags - title_infos : {title_infos}", level=logging.DEBUG)
|
|
|
|
try:
|
|
# 태그 키워드 리스트 추출
|
|
keyword_tags = title_infos.get("keyword_tags", [])
|
|
if not keyword_tags:
|
|
self.logger.log("키워드 태그가 비어 있습니다.", level=logging.WARNING)
|
|
return
|
|
self.logger.log(f"keyword_tags List : {keyword_tags}", level=logging.DEBUG)
|
|
|
|
# 태그 입력
|
|
await self.enter_tags(keyword_tags)
|
|
|
|
# 입력 버튼 클릭
|
|
await self.click_input_button()
|
|
|
|
# 경고 키워드 삭제
|
|
await self.delete_warning_tags()
|
|
|
|
except TimeoutError as te:
|
|
self.logger.log(f"태그 처리 중 타임아웃 오류 발생: {te}", level=logging.ERROR, exc_info=True)
|
|
except Exception as e:
|
|
self.logger.log(f"태그 처리 중 예외 발생: {e}", level=logging.ERROR, exc_info=True)
|
|
|
|
async def enter_tags(self, tags_list: List[str], exclude_list: List[str] = None):
|
|
"""
|
|
태그 입력칸에 키워드 태그를 입력.
|
|
주어진 리스트의 콤마로 구분된 문자열을 개별 태그로 분리하여 입력.
|
|
제외리스트에 있는 단어는 제외.
|
|
"""
|
|
try:
|
|
# 기본 제외리스트 설정
|
|
if exclude_list is None:
|
|
exclude_list = ['오늘출발', '오늘발송', '당일배송', '오늘도착'] # 제외할 기본 단어
|
|
|
|
self.logger.log(f"태그 입력: {tags_list}", level=logging.DEBUG)
|
|
self.logger.log(f"제외 리스트: {exclude_list}", level=logging.DEBUG)
|
|
|
|
# 태그 분리 및 정리
|
|
all_tags = []
|
|
for tags in tags_list:
|
|
all_tags.extend(tags.split(",")) # 콤마로 분리하여 추가
|
|
all_tags = [tag.strip() for tag in all_tags] # 공백 제거
|
|
|
|
# 제외 리스트에 있는 단어 제거
|
|
filtered_tags = [tag for tag in all_tags if tag not in exclude_list]
|
|
|
|
# 중복 제거
|
|
unique_tags = list(set(filtered_tags))
|
|
self.logger.log(f"정리된 태그 리스트: {unique_tags}", level=logging.DEBUG)
|
|
|
|
# 최종 태그를 하나의 문자열로 변환
|
|
tags_str = ", ".join(unique_tags)
|
|
|
|
# 태그 입력
|
|
tags_input = await self.page.query_selector(self.tags_input_locator)
|
|
if tags_input is None:
|
|
raise Exception("태그 입력칸을 찾을 수 없습니다.")
|
|
|
|
await tags_input.fill(tags_str) # 정리된 태그 입력
|
|
self.logger.log(f"태그 입력 완료: {tags_str}", level=logging.INFO)
|
|
|
|
except Exception as e:
|
|
self.logger.log(f"태그 입력 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
|
|
|
|
async def click_input_button(self):
|
|
"""태그 입력 버튼 클릭."""
|
|
try:
|
|
self.logger.log("태그 입력 버튼 클릭 시도", level=logging.DEBUG)
|
|
input_button = await self.page.query_selector(self.tags_input_button_locator)
|
|
if input_button is None:
|
|
raise Exception("태그 입력 버튼을 찾을 수 없습니다.")
|
|
|
|
await input_button.click()
|
|
self.logger.log("태그 입력 버튼 클릭 완료", level=logging.INFO)
|
|
|
|
except Exception as e:
|
|
self.logger.log(f"태그 입력 버튼 클릭 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
|
|
|
|
async def delete_warning_tags(self):
|
|
"""경고 키워드 삭제 버튼 클릭."""
|
|
try:
|
|
self.logger.log("경고 키워드 삭제 버튼 클릭 시도", level=logging.DEBUG)
|
|
delete_button = await self.page.query_selector(self.delete_warning_tags_button_locator)
|
|
if delete_button is None:
|
|
raise Exception("경고 키워드 삭제 버튼을 찾을 수 없습니다.")
|
|
|
|
await delete_button.click()
|
|
self.logger.log("경고 키워드 삭제 버튼 클릭 완료", level=logging.INFO)
|
|
|
|
except Exception as e:
|
|
self.logger.log(f"경고 키워드 삭제 버튼 클릭 중 오류 발생: {e}", level=logging.ERROR, exc_info=True)
|