웨일번역 과거로 회귀

This commit is contained in:
R5600U_PC 2024-10-19 12:53:04 +09:00
parent 28816a5beb
commit 409017224b
13 changed files with 6444 additions and 49 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -146,17 +146,17 @@ class BrowserController:
# 관리자 로그인 처리 # 관리자 로그인 처리
await self.page.fill(self.login_email_locator, admin_id) await self.page.fill(self.login_email_locator, admin_id)
await self.page.fill(self.login_password_locator, admin_password) await self.page.fill(self.login_password_locator, admin_password)
await self.page.click(self.login_button_locator, timeout=5000) await self.page.click(self.login_button_locator)
else: else:
# 관리자 토글 버튼을 클릭해서 직원 로그인 화면 활성화 # 관리자 토글 버튼을 클릭해서 직원 로그인 화면 활성화
admin_toggle = self.page.locator(self.admin_toggle_locator, timeout=5000) admin_toggle = self.page.locator(self.admin_toggle_locator)
if await admin_toggle.get_attribute("aria-checked") == "true": if await admin_toggle.get_attribute("aria-checked") == "true":
await admin_toggle.click() # 관리자 모드에서 직원 모드로 전환 await admin_toggle.click() # 관리자 모드에서 직원 모드로 전환
await self.page.fill(self.login_email_locator, admin_id) await self.page.fill(self.login_email_locator, admin_id)
await self.page.fill(self.staff_id_locator, user_id) await self.page.fill(self.staff_id_locator, user_id)
await self.page.fill(self.login_password_locator, user_password) await self.page.fill(self.login_password_locator, user_password)
await self.page.click(self.staff_login_button_locator, timeout=5000) await self.page.click(self.staff_login_button_locator)
self.logger.info(f'로그인 완료: {"관리자" if is_admin else "직원"} 계정') self.logger.info(f'로그인 완료: {"관리자" if is_admin else "직원"} 계정')
@ -216,7 +216,7 @@ class BrowserController:
element_text = await self.page.evaluate(f'''(selector) => {{ element_text = await self.page.evaluate(f'''(selector) => {{
let element = document.querySelector(selector); let element = document.querySelector(selector);
return element ? element.innerText : null; return element ? element.innerText : null;
}}''', self.total_product_count_locator, timeout=5000) }}''', self.total_product_count_locator)
if element_text: if element_text:
self.logger.info(f"총 상품수 확인: {element_text}") # 텍스트 확인용 로그 self.logger.info(f"총 상품수 확인: {element_text}") # 텍스트 확인용 로그
@ -293,7 +293,7 @@ class BrowserController:
self.logger.info("다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.") self.logger.info("다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다.")
# 닫기 버튼 클릭 # 닫기 버튼 클릭
close_button = await self.page.query_selector(self.close_ad_button_locator, timeout=5000) close_button = await self.page.query_selector(self.close_ad_button_locator)
if close_button: if close_button:
await close_button.click() await close_button.click()
self.logger.info("다이얼로그를 성공적으로 닫았습니다.") self.logger.info("다이얼로그를 성공적으로 닫았습니다.")
@ -308,7 +308,7 @@ class BrowserController:
"""신규 상품 등록 페이지로 이동""" """신규 상품 등록 페이지로 이동"""
try: try:
new_product_page_locator = self.locator_manager.get_locator('BrowserControl', 'new_product_page_locator') new_product_page_locator = self.locator_manager.get_locator('BrowserControl', 'new_product_page_locator')
await self.page.click(new_product_page_locator, timeout=5000) await self.page.click(new_product_page_locator)
self.logger.info("신규 상품 등록 페이지로 이동 완료.") self.logger.info("신규 상품 등록 페이지로 이동 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"신규 상품 등록 페이지 이동 중 오류: {e}", exc_info=True) self.logger.error(f"신규 상품 등록 페이지 이동 중 오류: {e}", exc_info=True)
@ -402,7 +402,7 @@ class BrowserController:
async def click_detail_tab(self): async def click_detail_tab(self):
"""상세페이지 탭 클릭""" """상세페이지 탭 클릭"""
try: try:
await self.page.click(self.detail_tab_locator, timeout=5000) await self.page.click(self.detail_tab_locator)
self.logger.info("상세페이지 탭 클릭 완료.") self.logger.info("상세페이지 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"상세페이지 탭 클릭 중 오류: {e}", exc_info=True) self.logger.error(f"상세페이지 탭 클릭 중 오류: {e}", exc_info=True)
@ -410,7 +410,7 @@ class BrowserController:
async def click_option_tab(self): async def click_option_tab(self):
"""옵션 탭 클릭""" """옵션 탭 클릭"""
try: try:
await self.page.click(self.option_tab_locator, timeout=5000) await self.page.click(self.option_tab_locator)
self.logger.info("옵션 탭 클릭 완료.") self.logger.info("옵션 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"옵션 탭 클릭 중 오류: {e}", exc_info=True) self.logger.error(f"옵션 탭 클릭 중 오류: {e}", exc_info=True)
@ -418,7 +418,7 @@ class BrowserController:
async def click_price_tab(self): async def click_price_tab(self):
"""가격 탭 클릭""" """가격 탭 클릭"""
try: try:
await self.page.click(self.price_tab_locator, timeout=5000) await self.page.click(self.price_tab_locator)
self.logger.info("가격 탭 클릭 완료.") self.logger.info("가격 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"가격 탭 클릭 중 오류: {e}", exc_info=True) self.logger.error(f"가격 탭 클릭 중 오류: {e}", exc_info=True)
@ -426,7 +426,7 @@ class BrowserController:
async def click_title_tab(self): async def click_title_tab(self):
"""상품명 탭 클릭""" """상품명 탭 클릭"""
try: try:
await self.page.click(self.title_tab_locator, timeout=5000) await self.page.click(self.title_tab_locator)
self.logger.info("상품명 탭 클릭 완료.") self.logger.info("상품명 탭 클릭 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"상품명 탭 클릭 중 오류: {e}", exc_info=True) self.logger.error(f"상품명 탭 클릭 중 오류: {e}", exc_info=True)
@ -439,7 +439,7 @@ class BrowserController:
ck_source_editing_area_locator = self.locator_manager.get_locator('BrowserControl', 'ck_source_editing_area_locator') ck_source_editing_area_locator = self.locator_manager.get_locator('BrowserControl', 'ck_source_editing_area_locator')
# 소스 편집 모드로 전환 # 소스 편집 모드로 전환
await self.page.click(source_button_locator, timeout=5000) await self.page.click(source_button_locator)
self.logger.debug("소스 버튼 클릭 완료.") self.logger.debug("소스 버튼 클릭 완료.")
@ -454,7 +454,7 @@ class BrowserController:
# HTML 소스에서 이미지 URL 삭제 # HTML 소스에서 이미지 URL 삭제
self.logger.debug('img 태그를 삭제 중...') self.logger.debug('img 태그를 삭제 중...')
data_value_element = await self.page.query_selector(ck_source_editing_area_locator, timeout=5000) data_value_element = await self.page.query_selector(ck_source_editing_area_locator)
new_value = "" new_value = ""
if data_value_element: if data_value_element:
await self.page.evaluate(f'() => document.querySelector("{ck_source_editing_area_locator}").setAttribute("data-value", "{new_value}")') await self.page.evaluate(f'() => document.querySelector("{ck_source_editing_area_locator}").setAttribute("data-value", "{new_value}")')
@ -465,7 +465,7 @@ class BrowserController:
self.logger.debug('img 태그 삭제 완료.') self.logger.debug('img 태그 삭제 완료.')
# img 태그의 class 삭제 후 다시 소스 버튼 클릭 # img 태그의 class 삭제 후 다시 소스 버튼 클릭
await self.page.click(source_button_locator, timeout=5000) await self.page.click(source_button_locator)
self.logger.debug('소스 버튼 재 클릭 완료.') self.logger.debug('소스 버튼 재 클릭 완료.')
@ -552,7 +552,7 @@ class BrowserController:
async def save_and_ecs_product_edit(self): async def save_and_ecs_product_edit(self):
"""상품 수정 후 저장 버튼 클릭""" """상품 수정 후 저장 버튼 클릭"""
try: try:
await self.page.click(self.save_button_locator, timeout=5000) await self.page.click(self.save_button_locator)
await self.page.keyboard.press("Escape") await self.page.keyboard.press("Escape")
self.logger.info("상품 수정 내용 저장 및 ECS 완료.") self.logger.info("상품 수정 내용 저장 및 ECS 완료.")
except Exception as e: except Exception as e:
@ -561,7 +561,7 @@ class BrowserController:
async def save_product_edit(self): async def save_product_edit(self):
"""상품 수정 후 저장 버튼 클릭""" """상품 수정 후 저장 버튼 클릭"""
try: try:
await self.page.click(self.save_button_locator, timeout=5000) await self.page.click(self.save_button_locator)
self.logger.info("상품 수정 내용 저장 완료.") self.logger.info("상품 수정 내용 저장 완료.")
except Exception as e: except Exception as e:
self.logger.error(f"저장 버튼 클릭 중 오류: {e}", exc_info=True) self.logger.error(f"저장 버튼 클릭 중 오류: {e}", exc_info=True)
@ -570,7 +570,7 @@ class BrowserController:
"""다음 페이지로 이동""" """다음 페이지로 이동"""
try: try:
# 현재 페이지가 몇 번째 페이지인지 확인 (클래스에 'ant-pagination-item-active'가 있는 요소) # 현재 페이지가 몇 번째 페이지인지 확인 (클래스에 'ant-pagination-item-active'가 있는 요소)
current_page = await self.page.query_selector(self.current_page_locator, timeout=5000) current_page = await self.page.query_selector(self.current_page_locator)
if not current_page: if not current_page:
self.logger.warning("현재 페이지 정보를 찾을 수 없습니다.") self.logger.warning("현재 페이지 정보를 찾을 수 없습니다.")
@ -582,7 +582,7 @@ class BrowserController:
# 다음 페이지 버튼을 찾음 (title 속성으로 다음 페이지를 찾음) # 다음 페이지 버튼을 찾음 (title 속성으로 다음 페이지를 찾음)
next_page_button_locator = self.next_page_button_template.format(page_number=next_page_number) next_page_button_locator = self.next_page_button_template.format(page_number=next_page_number)
next_page_button = await self.page.query_selector(next_page_button_locator, timeout=5000) next_page_button = await self.page.query_selector(next_page_button_locator)
if next_page_button: if next_page_button:
await next_page_button.click() # 페이지 버튼 클릭 await next_page_button.click() # 페이지 버튼 클릭

View File

@ -272,11 +272,9 @@ class OptionHandler:
what_prefix_button = '1-99' what_prefix_button = '1-99'
if what_prefix_button == 'A-Z': if what_prefix_button == 'A-Z':
self.logger.debug("A-Z 버튼을 클릭합니다.")
await self.AtoZ_button_click() await self.AtoZ_button_click()
elif what_prefix_button == '1-99': elif what_prefix_button == '1-99':
# # 9. A-Z 버튼 클릭 # # 9. A-Z 버튼 클릭
self.logger.debug("1-99 버튼을 클릭합니다.")
await self.one_to_nine_button_click() await self.one_to_nine_button_click()
# 9. 저장 버튼 클릭 # 9. 저장 버튼 클릭
@ -294,9 +292,9 @@ class OptionHandler:
"""단일 상품 상태 여부를 확인하는 메서드""" """단일 상품 상태 여부를 확인하는 메서드"""
try: try:
# 단일 상품 등록 버튼이 선택되었는지 확인 # 단일 상품 등록 버튼이 선택되었는지 확인
single_option_checked = await self.page.query_selector(self.single_option_locator, timeout=5000) is not None single_option_checked = await self.page.query_selector(self.single_option_locator) is not None
# 옵션 상품 등록 버튼이 선택되었는지 확인 # 옵션 상품 등록 버튼이 선택되었는지 확인
option_product_checked = await self.page.query_selector(self.option_product_locator, timeout=5000) is not None option_product_checked = await self.page.query_selector(self.option_product_locator) is not None
# 두 요소의 상태를 기반으로 단일 상품 여부 결정 # 두 요소의 상태를 기반으로 단일 상품 여부 결정
is_single = single_option_checked and not option_product_checked is_single = single_option_checked and not option_product_checked
@ -645,15 +643,15 @@ class OptionHandler:
async def AtoZ_button_click(self): async def AtoZ_button_click(self):
self.logger.debug("A-Z 버튼을 클릭합니다.") self.logger.debug("A-Z 버튼을 클릭합니다.")
await self.page.click(self.AtoZ_button_locator, timeout=5000) await self.page.click(self.AtoZ_button_locator)
async def one_to_nine_button_click(self): async def one_to_nine_button_click(self):
self.logger.debug("1-99 버튼을 클릭합니다.") self.logger.debug("1-99 버튼을 클릭합니다.")
await self.page.click(self.one_to_nine_button_locator, timeout=5000) await self.page.click(self.one_to_nine_button_locator)
async def low_order_click(self): async def low_order_click(self):
self.logger.debug("가격 낮은 순 정렬을 클릭합니다.") self.logger.debug("가격 낮은 순 정렬을 클릭합니다.")
await self.page.click(self.low_order_button_locator, timeout=5000) await self.page.click(self.low_order_button_locator)
async def update_option_image(self, index, option_image_url, product_name, option_name, debug_flag=False): async def update_option_image(self, index, option_image_url, product_name, option_name, debug_flag=False):
""" """
@ -686,7 +684,7 @@ class OptionHandler:
await delete_button.click() await delete_button.click()
# 삭제 확인 버튼 클릭 # 삭제 확인 버튼 클릭
confirm_delete_button = await self.page.query_selector(confirm_delete_button_locator, timeout=5000) confirm_delete_button = await self.page.query_selector(confirm_delete_button_locator)
if confirm_delete_button: if confirm_delete_button:
self.logger.debug(f"삭제 확인버튼 클릭") self.logger.debug(f"삭제 확인버튼 클릭")
await confirm_delete_button.click() await confirm_delete_button.click()

View File

@ -39,7 +39,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug("노출상품명 입력칸에서 상품명을 가져오는 중입니다.") self.logger.debug("노출상품명 입력칸에서 상품명을 가져오는 중입니다.")
product_name_element = await self.page.query_selector(self.product_name_input_locator, timeout=5000) product_name_element = await self.page.query_selector(self.product_name_input_locator)
product_name = await product_name_element.get_attribute('value') if product_name_element else "" product_name = await product_name_element.get_attribute('value') if product_name_element else ""
self.logger.debug(f"상품명: {product_name}") self.logger.debug(f"상품명: {product_name}")
return product_name return product_name
@ -56,7 +56,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug(f"추천 단어를 상품명 추천 입력칸에 입력 중: {suggestion}") self.logger.debug(f"추천 단어를 상품명 추천 입력칸에 입력 중: {suggestion}")
suggestion_input_element = await self.page.query_selector(self.suggestion_input_locator, timeout=5000) suggestion_input_element = await self.page.query_selector(self.suggestion_input_locator)
if suggestion_input_element: if suggestion_input_element:
await suggestion_input_element.fill(suggestion) await suggestion_input_element.fill(suggestion)
self.logger.debug(f"추천 단어 '{suggestion}' 입력 완료.") self.logger.debug(f"추천 단어 '{suggestion}' 입력 완료.")
@ -71,7 +71,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug("상품명 추천단어 검색 버튼 클릭 중.") self.logger.debug("상품명 추천단어 검색 버튼 클릭 중.")
search_button_element = await self.page.query_selector(self.search_button_locator, timeout=5000) search_button_element = await self.page.query_selector(self.search_button_locator)
if search_button_element: if search_button_element:
await search_button_element.click() await search_button_element.click()
self.logger.debug("검색 버튼 클릭 완료.") self.logger.debug("검색 버튼 클릭 완료.")
@ -89,7 +89,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug("원본 상품명을 가져오는 중입니다.") self.logger.debug("원본 상품명을 가져오는 중입니다.")
original_name_element = await self.page.query_selector(self.original_product_name_locator, timeout=5000) original_name_element = await self.page.query_selector(self.original_product_name_locator)
original_name = await original_name_element.inner_text() if original_name_element else "" original_name = await original_name_element.inner_text() if original_name_element else ""
self.logger.debug(f"원본 상품명: {original_name}") self.logger.debug(f"원본 상품명: {original_name}")
return original_name return original_name
@ -103,7 +103,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug("경고 단어 삭제 버튼 클릭 중입니다.") self.logger.debug("경고 단어 삭제 버튼 클릭 중입니다.")
delete_button_element = await self.page.query_selector(self.delete_warning_button_locator, timeout=5000) delete_button_element = await self.page.query_selector(self.delete_warning_button_locator)
if delete_button_element: if delete_button_element:
await delete_button_element.click() await delete_button_element.click()
self.logger.debug("경고 단어 삭제 버튼 클릭 완료.") self.logger.debug("경고 단어 삭제 버튼 클릭 완료.")
@ -118,7 +118,7 @@ class TitleHandler:
""" """
try: try:
self.logger.debug("카테고리 추천받기 버튼 클릭 중입니다.") self.logger.debug("카테고리 추천받기 버튼 클릭 중입니다.")
category_suggestion_button_element = await self.page.query_selector(self.category_suggestion_button_locator, timeout=5000) category_suggestion_button_element = await self.page.query_selector(self.category_suggestion_button_locator)
if category_suggestion_button_element: if category_suggestion_button_element:
await category_suggestion_button_element.click() await category_suggestion_button_element.click()
self.logger.debug("카테고리 추천받기 버튼 클릭 완료.") self.logger.debug("카테고리 추천받기 버튼 클릭 완료.")
@ -149,7 +149,7 @@ class TitleHandler:
self.logger.error("카테고리 메인 선택자를 찾을 수 없습니다.") self.logger.error("카테고리 메인 선택자를 찾을 수 없습니다.")
return "" return ""
certified_text_element = main_category_element.locator(self.certified_text_locator, timeout=5000) certified_text_element = main_category_element.locator(self.certified_text_locator)
if certified_text_element: if certified_text_element:
certified_text = certified_text_element.inner_text() certified_text = certified_text_element.inner_text()
if "인증" in certified_text: if "인증" in certified_text:
@ -188,7 +188,7 @@ class TitleHandler:
self.logger.debug(f"category_locator : {category_locator}") self.logger.debug(f"category_locator : {category_locator}")
await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기 await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기
main_category_element = self.page.locator(category_locator, timeout=5000) # 대기 후 동기적으로 요소 가져오기 main_category_element = self.page.locator(category_locator) # 대기 후 동기적으로 요소 가져오기
self.logger.debug(f"main_category_element : {main_category_element}") self.logger.debug(f"main_category_element : {main_category_element}")
if not await main_category_element.count(): if not await main_category_element.count():
@ -196,7 +196,7 @@ class TitleHandler:
return "" return ""
# 인증 텍스트 요소 선택 # 인증 텍스트 요소 선택
category_text_element = main_category_element.locator(self.category_text_locator, timeout=5000) category_text_element = main_category_element.locator(self.category_text_locator)
self.logger.debug(f"category_text_element : {category_text_element}") self.logger.debug(f"category_text_element : {category_text_element}")

View File

@ -296,28 +296,31 @@ class WhaleTranslator:
self.move_mouse_to_center() self.move_mouse_to_center()
time.sleep(1) # 마우스 이동 후 대기 time.sleep(1) # 마우스 이동 후 대기
original_color = self.get_mouse_position_color() # 현재 색상 가져오기 # original_color = self.get_mouse_position_color() # 현재 색상 가져오기
self.colors['before'] = original_color # self.colors['before'] = original_color
self.logger.debug(f"번역 전 색상: {original_color}") # self.logger.debug(f"번역 전 색상: {original_color}")
self.logger.debug("번역 작업을 위한 마우스 오른쪽 클릭 및 R 전송") self.logger.debug("번역 작업을 위한 마우스 오른쪽 클릭 및 R 전송")
if not self.right_click_and_send_key('r'): if not self.right_click_and_send_key('r'):
self.logger.error("번역 작업이 대화상자 문제로 중단되었습니다.") self.logger.error("번역 작업이 대화상자 문제로 중단되었습니다.")
return False return False
# 번역 성공 여부 확인 # # 번역 성공 여부 확인
result = self.check_translation_by_color_change() # result = self.check_translation_by_color_change()
if result == "success": # if result == "success":
self.logger.debug("번역이 성공적으로 완료되었습니다!") # self.logger.debug("번역이 성공적으로 완료되었습니다!")
elif result == "error": # elif result == "error":
self.logger.debug("번역에 실패했습니다.") # self.logger.debug("번역에 실패했습니다.")
else: # else:
self.logger.debug("번역 상태를 확인하지 못했습니다.") # self.logger.debug("번역 상태를 확인하지 못했습니다.")
# # 최종 색상 출력
# self.logger.debug(f"번역 전 색상: {self.colors['before']}")
# self.logger.debug(f"번역 중 색상: {self.colors['during']}")
# self.logger.debug(f"번역 후 색상: {self.colors['after']}")
time.sleep(5) # 번역 대기
# 최종 색상 출력
self.logger.debug(f"번역 전 색상: {self.colors['before']}")
self.logger.debug(f"번역 중 색상: {self.colors['during']}")
self.logger.debug(f"번역 후 색상: {self.colors['after']}")
self.logger.debug("이미지 복사를 위한 마우스 오른쪽 클릭 및 C 전송") self.logger.debug("이미지 복사를 위한 마우스 오른쪽 클릭 및 C 전송")
if not self.right_click_and_send_key('c'): if not self.right_click_and_send_key('c'):