diff --git a/__pycache__/browser_control.cpython-311.pyc b/__pycache__/browser_control.cpython-311.pyc index 2bc6c098..b73ad456 100644 Binary files a/__pycache__/browser_control.cpython-311.pyc and b/__pycache__/browser_control.cpython-311.pyc differ diff --git a/__pycache__/clipboardImageManager.cpython-311.pyc b/__pycache__/clipboardImageManager.cpython-311.pyc index 79d833c0..662920d0 100644 Binary files a/__pycache__/clipboardImageManager.cpython-311.pyc and b/__pycache__/clipboardImageManager.cpython-311.pyc differ diff --git a/__pycache__/gui.cpython-311.pyc b/__pycache__/gui.cpython-311.pyc index de1b28c3..48883a34 100644 Binary files a/__pycache__/gui.cpython-311.pyc and b/__pycache__/gui.cpython-311.pyc differ diff --git a/__pycache__/logger_module.cpython-311.pyc b/__pycache__/logger_module.cpython-311.pyc index 2ee9989d..732cc90c 100644 Binary files a/__pycache__/logger_module.cpython-311.pyc and b/__pycache__/logger_module.cpython-311.pyc differ diff --git a/__pycache__/option.cpython-311.pyc b/__pycache__/option.cpython-311.pyc index 65ba05b8..dd67218f 100644 Binary files a/__pycache__/option.cpython-311.pyc and b/__pycache__/option.cpython-311.pyc differ diff --git a/__pycache__/toggleSwitch.cpython-311.pyc b/__pycache__/toggleSwitch.cpython-311.pyc index 272f3008..c8572b96 100644 Binary files a/__pycache__/toggleSwitch.cpython-311.pyc and b/__pycache__/toggleSwitch.cpython-311.pyc differ diff --git a/__pycache__/vertexAI.cpython-311.pyc b/__pycache__/vertexAI.cpython-311.pyc index f5a3a6a6..3c6ab396 100644 Binary files a/__pycache__/vertexAI.cpython-311.pyc and b/__pycache__/vertexAI.cpython-311.pyc differ diff --git a/__pycache__/whale_translator.cpython-311.pyc b/__pycache__/whale_translator.cpython-311.pyc index 69c6323f..9f5441e0 100644 Binary files a/__pycache__/whale_translator.cpython-311.pyc and b/__pycache__/whale_translator.cpython-311.pyc differ diff --git a/appTranslator.log b/appTranslator.log index a28dc373..b8976992 100644 --- a/appTranslator.log +++ b/appTranslator.log @@ -55450,3 +55450,10893 @@ Traceback (most recent call last): TypeError: Frame.click() missing 1 required positional argument: 'selector' 2024-10-12 08:42:14,355 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. 2024-10-12 08:42:14,355 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 15:35:20,830 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 15:35:20,830 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 15:35:20,871 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 15:35:20,871 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 15:35:20,881 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 15:35:20,964 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 15:35:24,697 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 15:36:22,594 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 15:36:23,565 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:36:23,566 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 15:36:23,567 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:36:23,567 - browser_control.py:53 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:36:27,727 - browser_control.py:68 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:36:27,738 - browser_control.py:73 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:36:27,738 - browser_control.py:80 - default_logger - DEBUG - 크롬 창 핸들: 13961752 +2024-10-12 15:36:27,738 - browser_control.py:86 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:36:27,989 - browser_control.py:104 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:36:30,033 - browser_control.py:224 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:36:30,175 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:36:30,177 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:36:30,536 - browser_control.py:243 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:36:30,536 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:36:30,536 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:36:30,536 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:36:57,564 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 15:36:57,564 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 15:36:57,564 - browser_control.py:650 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 15:36:58,164 - browser_control.py:660 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 15:36:58,170 - browser_control.py:145 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 15:36:58,170 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 15:36:58,184 - browser_control.py:290 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 15:36:58,184 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 15:36:58,221 - browser_control.py:325 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 15:36:58,730 - browser_control.py:328 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 15:36:59,255 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:36:59,270 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 15:36:59,280 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:36:59,295 - title.py:142 - default_logger - DEBUG - 선택 마켓 : 스마트스토어 , selector : "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1", element : None +2024-10-12 15:36:59,295 - title.py:150 - default_logger - ERROR - 카테고리 메인 선택자를 찾을 수 없습니다. +2024-10-12 15:36:59,297 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:36:59,298 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:36:59,300 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:36:59,301 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:36:59,302 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:36:59,303 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:37:00,739 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 15:37:29,317 - price.py:531 - default_logger - ERROR - 옵션 수를 나타내는 텍스트를 찾지 못함. 기본적으로 단일 상품으로 간주. +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 15:37:59,336 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("//*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[2]/td[3]/div/div/div/div[2]/input") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("//*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[2]/td[3]/div/div/div/div[2]/input") to be visible + +2024-10-12 15:37:59,339 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:37:59,340 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:37:59,341 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:37:59,343 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:37:59,344 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:37:59,345 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:37:59,346 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 15:37:59,348 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 15:45:10,232 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 15:45:14,493 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 15:45:14,493 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 15:45:14,506 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 15:45:14,506 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 15:45:14,506 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 15:45:14,577 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 15:45:18,760 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 15:45:21,273 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:45:21,275 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 15:45:21,275 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:45:21,276 - browser_control.py:53 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:45:25,920 - browser_control.py:68 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:45:25,936 - browser_control.py:73 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:45:25,939 - browser_control.py:80 - default_logger - DEBUG - 크롬 창 핸들: 10167298 +2024-10-12 15:45:25,940 - browser_control.py:86 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:45:26,156 - browser_control.py:104 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:45:28,091 - browser_control.py:224 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:45:28,174 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:45:28,174 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:45:28,495 - browser_control.py:243 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:45:28,495 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:28,495 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:28,495 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:34,815 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:45:34,816 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : +2024-10-12 15:45:34,816 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:45:34,816 - browser_control.py:53 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:45:39,063 - browser_control.py:68 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:45:39,073 - browser_control.py:73 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:45:39,073 - browser_control.py:80 - default_logger - DEBUG - 크롬 창 핸들: 1514080 +2024-10-12 15:45:39,073 - browser_control.py:86 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:45:39,326 - browser_control.py:104 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:45:41,100 - browser_control.py:224 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:45:41,232 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:45:41,232 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:45:41,612 - browser_control.py:243 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:45:41,613 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:41,614 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:41,614 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:45:45,267 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 15:45:45,268 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 15:45:45,268 - browser_control.py:650 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 15:45:45,904 - browser_control.py:660 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 15:45:45,908 - browser_control.py:145 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 15:45:45,908 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 15:45:45,914 - browser_control.py:290 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 15:45:45,916 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 15:45:45,941 - browser_control.py:325 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 15:45:46,481 - browser_control.py:328 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 15:45:47,045 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:47,060 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 15:45:47,343 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:47,360 - title.py:142 - default_logger - DEBUG - 선택 마켓 : 스마트스토어 , selector : "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1", element : None +2024-10-12 15:45:47,362 - title.py:150 - default_logger - ERROR - 카테고리 메인 선택자를 찾을 수 없습니다. +2024-10-12 15:45:47,362 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:47,363 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:47,365 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:47,365 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:47,366 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:47,366 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,439 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 15:45:55,444 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,447 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,449 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,449 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,452 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,453 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,454 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,457 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 15:45:55,458 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,464 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,466 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,475 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,478 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,484 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,487 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,489 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,490 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,492 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,493 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,494 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,498 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,504 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,506 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,508 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,509 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,510 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,512 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,513 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,514 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 15:45:55,516 - gui.py:681 - default_logger - DEBUG - 3/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,520 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,523 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,527 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,530 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,534 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,536 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,537 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,539 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,541 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,542 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,543 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,572 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,582 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,586 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,586 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,586 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,591 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,593 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,595 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,595 - gui.py:736 - default_logger - DEBUG - 3/[31]개 상품 수정 완료. +2024-10-12 15:45:55,595 - gui.py:681 - default_logger - DEBUG - 4/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,623 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,624 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,624 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,624 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,639 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,642 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,644 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,645 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,647 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,648 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,649 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,658 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,669 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,674 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,676 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,677 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,679 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,682 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,683 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,685 - gui.py:736 - default_logger - DEBUG - 4/[31]개 상품 수정 완료. +2024-10-12 15:45:55,687 - gui.py:681 - default_logger - DEBUG - 5/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,705 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,708 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,714 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,717 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,722 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,724 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,726 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,727 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,728 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,729 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,730 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,734 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,739 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,742 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,743 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,744 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,745 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,747 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,748 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,750 - gui.py:736 - default_logger - DEBUG - 5/[31]개 상품 수정 완료. +2024-10-12 15:45:55,750 - gui.py:681 - default_logger - DEBUG - 6/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,757 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,758 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,761 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,765 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,771 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,772 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,774 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,776 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,776 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,776 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,776 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,782 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,789 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,791 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,792 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,792 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,794 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,794 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,794 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,794 - gui.py:736 - default_logger - DEBUG - 6/[31]개 상품 수정 완료. +2024-10-12 15:45:55,794 - gui.py:681 - default_logger - DEBUG - 7/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,794 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,804 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,809 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,811 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,815 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,818 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,819 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,820 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,820 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,823 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,824 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,830 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,834 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,837 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,840 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,841 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,842 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,844 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,844 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,844 - gui.py:736 - default_logger - DEBUG - 7/[31]개 상품 수정 완료. +2024-10-12 15:45:55,844 - gui.py:681 - default_logger - DEBUG - 8/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,844 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,854 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,858 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,860 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,864 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,867 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,868 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,868 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,871 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,872 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,873 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,878 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,883 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,885 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,886 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,887 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,888 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,889 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,889 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,889 - gui.py:736 - default_logger - DEBUG - 8/[31]개 상품 수정 완료. +2024-10-12 15:45:55,889 - gui.py:681 - default_logger - DEBUG - 9/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,889 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,889 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,889 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,903 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,908 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,910 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,911 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,913 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,914 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,915 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,916 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,921 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,923 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,923 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,923 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,923 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,923 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,923 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,923 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,923 - gui.py:736 - default_logger - DEBUG - 9/[31]개 상품 수정 완료. +2024-10-12 15:45:55,935 - gui.py:681 - default_logger - DEBUG - 10/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,939 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,943 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,945 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,949 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,953 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,958 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,960 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,960 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,961 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:55,961 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:55,963 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:55,965 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,973 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,975 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:55,977 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:55,977 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:55,978 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,980 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:55,980 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,982 - gui.py:736 - default_logger - DEBUG - 10/[31]개 상품 수정 완료. +2024-10-12 15:45:55,982 - gui.py:681 - default_logger - DEBUG - 11/20: 세부사항 수정 작업 중... +2024-10-12 15:45:55,986 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:55,987 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:55,987 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,993 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:55,993 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:55,993 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:55,993 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:55,993 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:55,993 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,003 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,005 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,009 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,012 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,018 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,018 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,018 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,022 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,023 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,024 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,026 - gui.py:736 - default_logger - DEBUG - 11/[31]개 상품 수정 완료. +2024-10-12 15:45:56,026 - gui.py:681 - default_logger - DEBUG - 12/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,032 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,034 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,038 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,041 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,043 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,043 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,043 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,043 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,043 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,053 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,055 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,061 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,066 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,068 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,070 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,071 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,072 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,074 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,075 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,076 - gui.py:736 - default_logger - DEBUG - 12/[31]개 상품 수정 완료. +2024-10-12 15:45:56,077 - gui.py:681 - default_logger - DEBUG - 13/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,082 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,085 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,088 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,090 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,095 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,097 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,098 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,099 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,100 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,101 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,101 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,105 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,108 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,108 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,108 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,108 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,108 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,108 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,108 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,108 - gui.py:736 - default_logger - DEBUG - 13/[31]개 상품 수정 완료. +2024-10-12 15:45:56,121 - gui.py:681 - default_logger - DEBUG - 14/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,121 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,121 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,121 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,137 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,137 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,137 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,149 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,149 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,152 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,152 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,152 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,152 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,163 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,168 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,168 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,168 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,168 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,168 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,168 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,168 - gui.py:736 - default_logger - DEBUG - 14/[31]개 상품 수정 완료. +2024-10-12 15:45:56,168 - gui.py:681 - default_logger - DEBUG - 15/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,184 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,184 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,184 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,184 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,184 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,200 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,201 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,201 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,203 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,203 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,203 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,203 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,216 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,218 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,218 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,218 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,218 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,218 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,218 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,218 - gui.py:736 - default_logger - DEBUG - 15/[31]개 상품 수정 완료. +2024-10-12 15:45:56,218 - gui.py:681 - default_logger - DEBUG - 16/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,233 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,236 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,238 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,242 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,248 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,249 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,249 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,251 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,252 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,252 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,256 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,257 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,264 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,266 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,266 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,266 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,266 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,266 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,266 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,266 - gui.py:736 - default_logger - DEBUG - 16/[31]개 상품 수정 완료. +2024-10-12 15:45:56,266 - gui.py:681 - default_logger - DEBUG - 17/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,279 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,282 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,286 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,288 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,295 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,295 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,295 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,295 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,295 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,295 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,295 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,305 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,311 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,312 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,315 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,315 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,315 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,319 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,319 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,319 - gui.py:736 - default_logger - DEBUG - 17/[31]개 상품 수정 완료. +2024-10-12 15:45:56,319 - gui.py:681 - default_logger - DEBUG - 18/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,319 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,327 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,327 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,327 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,327 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,327 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,327 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,327 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,327 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,342 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,342 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,344 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,348 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,352 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,352 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,356 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,356 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,358 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,358 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,359 - gui.py:736 - default_logger - DEBUG - 18/[31]개 상품 수정 완료. +2024-10-12 15:45:56,359 - gui.py:681 - default_logger - DEBUG - 19/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,359 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,359 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,359 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,359 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,375 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,377 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,377 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,377 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,380 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,380 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,382 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,382 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,390 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,390 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,390 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,395 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,395 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,395 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,395 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,395 - gui.py:736 - default_logger - DEBUG - 19/[31]개 상품 수정 완료. +2024-10-12 15:45:56,395 - gui.py:681 - default_logger - DEBUG - 20/20: 세부사항 수정 작업 중... +2024-10-12 15:45:56,404 - browser_control.py:331 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 324, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Locator.scroll_into_view_if_needed: Target page, context or browser has been closed +2024-10-12 15:45:56,405 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:45:56,410 - title.py:98 - default_logger - ERROR - 원본 상품명 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 93, in get_original_product_name + original_name_element = await self.page.query_selector(self.original_product_name_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,411 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:45:56,415 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,417 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:45:56,418 - browser_control.py:358 - default_logger - DEBUG - 가격 탭 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 355, in click_price_tab + await self.page.click(price_tab_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,420 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:45:56,421 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:45:56,422 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:45:56,422 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:45:56,424 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,428 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,428 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:45:56,428 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:45:56,428 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:45:56,436 - browser_control.py:479 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 476, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,437 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:45:56,438 - browser_control.py:470 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 466, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:45:56,439 - gui.py:736 - default_logger - DEBUG - 20/[31]개 상품 수정 완료. +2024-10-12 15:45:56,439 - browser_control.py:511 - default_logger - DEBUG - 다음 페이지로 이동 중 오류 발생: Page.query_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 486, in go_to_next_page + current_page = await self.page.query_selector(current_page_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7905, in query_selector + await self._impl_obj.query_selector(selector=selector, strict=strict) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 385, in query_selector + return await self._main_frame.query_selector(selector, strict) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 304, in query_selector + await self._channel.send("querySelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.query_selector: Target page, context or browser has been closed +2024-10-12 15:45:56,439 - gui.py:744 - default_logger - DEBUG - 더 이상 페이지가 없습니다. 작업을 종료합니다. +2024-10-12 15:45:56,439 - gui.py:749 - default_logger - DEBUG - 모든 상품 번역 및 저장 완료. +2024-10-12 15:45:57,705 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 15:52:08,974 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 15:52:08,974 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 15:52:08,990 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 15:52:08,991 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 15:52:08,991 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 15:52:09,055 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 15:52:11,820 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 15:52:14,012 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:52:14,012 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 15:52:14,012 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:52:14,012 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:52:18,526 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:52:18,540 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:52:18,543 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 2366328 +2024-10-12 15:52:18,543 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:52:18,770 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:52:20,338 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:52:20,574 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:52:20,575 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:52:20,973 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:52:20,974 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:52:20,975 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:52:20,975 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:52:23,468 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 15:52:23,468 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 15:52:23,468 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 15:52:24,083 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 15:52:24,087 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 15:52:24,088 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 15:52:24,095 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 15:52:24,095 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 15:52:24,140 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 15:52:24,725 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 15:52:25,287 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:52:25,301 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 15:52:25,584 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:52:25,590 - title.py:142 - default_logger - DEBUG - 선택 마켓 : 스마트스토어 , selector : "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1", element : None +2024-10-12 15:52:25,590 - title.py:150 - default_logger - ERROR - 카테고리 메인 선택자를 찾을 수 없습니다. +2024-10-12 15:52:25,590 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:52:26,331 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 15:52:26,331 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:52:26,331 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:52:26,336 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:52:26,337 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:52:36,075 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 15:52:56,355 - price.py:531 - default_logger - ERROR - 옵션 수를 나타내는 텍스트를 찾지 못함. 기본적으로 단일 상품으로 간주. +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 15:52:56,378 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 15:52:56,386 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:52:56,391 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:52:56,391 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:52:56,393 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:52:56,393 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:52:56,393 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:52:56,397 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 15:52:56,397 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 15:55:05,556 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 15:55:12,331 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 15:55:12,331 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 15:55:12,346 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 15:55:12,346 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 15:55:12,346 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 15:55:12,415 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 15:55:16,199 - gui.py:431 - default_logger - DEBUG - 옵션이미지 번역 버튼 - 활성화 선택 +2024-10-12 15:55:16,910 - gui.py:431 - default_logger - DEBUG - 옵션이미지 번역 버튼 - 비활성화 선택 +2024-10-12 15:55:17,745 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 15:55:19,031 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:55:19,031 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 15:55:19,033 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:55:19,033 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:55:23,144 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:55:23,152 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:55:23,155 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 22942458 +2024-10-12 15:55:23,155 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:55:23,355 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:55:24,879 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:55:25,059 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:55:25,060 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:55:25,361 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:55:25,363 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:55:25,363 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:55:25,364 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:55:29,958 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 15:55:29,960 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 15:55:29,960 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 15:55:30,579 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 15:55:30,581 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 15:55:30,581 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 15:55:30,594 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 15:55:30,594 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 15:55:30,615 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 15:55:31,141 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 15:55:31,680 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:55:31,695 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 15:55:31,987 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:55:31,988 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: object Locator can't be used in 'await' expression +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 141, in get_category + main_category_element = await self.page.locator(self.category_main_selector_with_ss) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: object Locator can't be used in 'await' expression +2024-10-12 15:55:31,990 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:55:32,783 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 15:55:32,783 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:55:32,783 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:55:32,790 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:55:32,790 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:55:34,974 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 15:55:35,108 - price.py:535 - default_logger - ERROR - 옵션 수 계산 중 오류 발생: Page.wait_for_selector: Target page, context or browser has been closed +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 15:55:35,109 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: Page.wait_for_selector: Target page, context or browser has been closed +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 566, in collect_product_costs_and_prices + product_cost_element = await self.page.wait_for_selector(product_cost_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TargetClosedError: Page.wait_for_selector: Target page, context or browser has been closed +2024-10-12 15:55:35,115 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:55:35,115 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:55:35,115 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:55:35,115 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:55:35,115 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:55:35,115 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:55:35,130 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 15:55:35,130 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 15:55:35,138 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.scroll_into_view_if_needed: Connection closed while reading from the driver +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 330, in open_product_edit_dialog + await button.scroll_into_view_if_needed() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 16823, in scroll_into_view_if_needed + await self._impl_obj.scroll_into_view_if_needed(timeout=timeout) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 541, in scroll_into_view_if_needed + return await self._with_element( + ^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 108, in _with_element + handle = await self.element_handle(timeout=timeout) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 311, in element_handle + handle = await self._frame.wait_for_selector( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +Exception: Locator.scroll_into_view_if_needed: Connection closed while reading from the driver +2024-10-12 15:55:35,141 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:57:25,583 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 15:57:25,583 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 15:57:25,592 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 15:57:25,592 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 15:57:25,594 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 15:57:25,650 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 15:57:27,544 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 15:57:28,457 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 15:57:28,457 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 15:57:28,457 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 15:57:28,461 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 15:57:32,782 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 15:57:32,782 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 15:57:32,798 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 3220484 +2024-10-12 15:57:32,799 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 15:57:33,018 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 15:57:34,568 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 15:57:34,738 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 15:57:34,738 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 15:57:35,082 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 15:57:35,084 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:57:35,084 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:57:35,085 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 15:57:37,059 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 15:57:37,059 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 15:57:37,059 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 15:57:37,660 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 15:57:37,660 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 15:57:37,660 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 15:57:37,678 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 15:57:37,678 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 15:57:37,702 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 15:57:38,225 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 15:57:38,816 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 15:57:38,829 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 15:57:39,119 - title.py:139 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 15:57:39,119 - title.py:142 - default_logger - DEBUG - 선택 마켓 : 스마트스토어 , selector : "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1", element : selector='"div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1"'> +2024-10-12 15:57:39,119 - title.py:168 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute '_frame' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 153, in get_category + certified_text_element = main_category_element.locator(self.certified_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15489, in locator + self._impl_obj.locator( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 236, in locator + if selectorOrLocator._frame != self._frame: + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute '_frame' +2024-10-12 15:57:39,122 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 15:57:39,862 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 15:57:39,862 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 15:57:39,865 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 15:57:39,866 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 15:57:39,867 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 15:57:40,748 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 15:57:43,458 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 15:58:09,872 - price.py:531 - default_logger - ERROR - 옵션 수를 나타내는 텍스트를 찾지 못함. 기본적으로 단일 상품으로 간주. +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 15:58:09,895 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 15:58:09,899 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 15:58:09,900 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 15:58:09,901 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 15:58:09,902 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:58:09,903 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 15:58:09,903 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 15:58:09,907 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 15:58:09,907 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:01:03,262 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:01:07,761 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:01:07,761 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:01:07,771 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:01:07,771 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:01:07,771 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:01:07,840 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:01:09,304 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:01:11,071 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:01:11,074 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:01:11,074 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:01:11,075 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:01:14,893 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:01:14,910 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:01:14,913 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 3286020 +2024-10-12 16:01:14,913 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:01:15,106 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:01:16,822 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:01:16,942 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:01:16,944 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:01:17,264 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:01:17,265 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:01:17,265 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:01:17,265 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:01:19,081 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:01:19,081 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:01:19,081 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:01:19,673 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:01:19,676 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:01:19,676 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:01:19,684 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:01:19,684 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:01:19,711 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:01:20,294 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:01:20,882 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:01:20,905 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:01:21,189 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:01:26,191 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("text=\"div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1\"") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 189, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000) # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("text=\"div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1\"") to be visible + +2024-10-12 16:01:26,202 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:01:26,933 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:01:26,935 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:01:26,935 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:01:26,935 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:01:26,938 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:01:28,456 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:01:56,957 - price.py:531 - default_logger - ERROR - 옵션 수를 나타내는 텍스트를 찾지 못함. 기본적으로 단일 상품으로 간주. +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 16:01:56,981 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:01:56,985 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:01:56,986 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:01:56,987 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:01:56,989 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:01:56,991 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:01:56,992 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:01:56,995 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:01:56,996 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:04:00,226 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:04:05,199 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:04:05,199 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:04:05,213 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:04:05,213 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:04:05,213 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:04:05,282 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:04:08,202 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:04:09,833 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:04:09,835 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:04:09,835 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:04:09,835 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:04:13,958 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:04:13,967 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:04:13,969 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 7473918 +2024-10-12 16:04:13,969 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:04:14,182 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:04:15,649 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:04:15,850 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:04:15,850 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:04:16,136 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:04:16,137 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:04:16,138 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:04:16,138 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:04:17,358 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:04:17,358 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:04:17,360 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:04:17,963 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:04:17,965 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:04:17,965 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:04:17,965 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:04:17,975 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:04:18,000 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:04:18,542 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:04:19,118 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:04:19,135 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:04:19,436 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:04:24,462 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("text='#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)'") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 189, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000) # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("text='#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)'") to be visible + +2024-10-12 16:04:24,462 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:04:25,045 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:04:25,290 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:04:25,290 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:04:25,293 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:04:25,293 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:04:25,295 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:04:55,302 - price.py:531 - default_logger - ERROR - 옵션 수를 나타내는 텍스트를 찾지 못함. 기본적으로 단일 상품으로 간주. +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 516, in get_option_count_from_text + option_count_text_element = await self.page.wait_for_selector(self.option_count_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 30000ms exceeded. +Call log: +waiting for locator("text='div#productMainContentContainerId th:nth-child(2) > div > span'") to be visible + +2024-10-12 16:04:55,325 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:04:55,328 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:04:55,328 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:04:55,331 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:04:55,332 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:04:55,334 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:04:55,335 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:04:55,336 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:04:55,336 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:15:44,052 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:21:18,300 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:21:18,300 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:21:18,310 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:21:18,310 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:21:18,310 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:21:18,371 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:21:19,768 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:21:20,770 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:21:20,770 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:21:20,770 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:21:20,770 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:21:24,720 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 16:21:25,194 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:21:25,203 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:21:25,203 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 7539454 +2024-10-12 16:21:25,203 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:21:25,410 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:21:26,930 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:21:27,673 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:21:27,673 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:21:27,991 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:21:27,993 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:21:27,994 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:21:27,995 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:21:37,150 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:21:37,150 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:21:37,150 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:21:37,769 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:21:37,777 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:21:37,777 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:21:37,785 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:21:37,785 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:21:37,807 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:21:38,356 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:21:38,857 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:21:38,876 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:21:38,880 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:21:43,897 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") to be visible +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 189, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000) # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") to be visible + +2024-10-12 16:21:43,898 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:21:44,603 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:21:44,690 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:21:44,695 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:21:44,695 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:21:44,697 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:21:44,697 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:21:44,987 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 16:21:45,044 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:21:45,047 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:21:45,048 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:21:45,049 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:21:45,050 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:21:45,051 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:21:45,052 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:21:45,060 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:21:45,060 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:23:45,623 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:23:49,941 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:23:49,941 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:23:49,950 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:23:49,950 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:23:49,950 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:23:50,033 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:23:51,743 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:23:53,052 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:23:53,055 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:23:53,055 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:23:53,056 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:23:57,428 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:23:57,437 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:23:57,441 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 65669242 +2024-10-12 16:23:57,441 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:23:57,645 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:23:59,143 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:23:59,345 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:23:59,346 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:23:59,682 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:23:59,682 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:23:59,682 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:23:59,682 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:24:06,800 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:24:06,800 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:24:06,800 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:24:07,458 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:24:07,464 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:24:07,464 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:24:07,467 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:24:07,467 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:24:07,497 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:24:08,152 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:24:08,666 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:24:08,682 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:24:08,950 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:24:13,966 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 189, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") + +2024-10-12 16:24:13,966 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:24:14,440 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:24:14,765 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:24:14,769 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:24:14,769 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:24:14,769 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:24:14,772 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:24:14,970 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 16:24:15,008 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:24:15,024 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:24:15,024 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:24:15,024 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:24:15,024 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:24:15,024 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:24:15,024 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:24:15,037 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:24:15,040 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:24:15,751 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:25:32,966 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:25:32,966 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:25:32,974 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:25:32,974 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:25:32,974 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:25:33,043 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:25:34,460 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:25:36,245 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 비활성화 선택 +2024-10-12 16:25:38,257 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:25:38,257 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:25:38,257 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:25:38,261 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:25:42,023 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:25:42,035 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:25:42,037 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 4263468 +2024-10-12 16:25:42,037 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:25:42,301 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:25:42,710 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 16:25:43,798 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:25:43,986 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:25:43,986 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:25:44,283 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:25:44,284 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:25:44,285 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:25:44,285 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:25:46,000 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:25:46,000 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:25:46,000 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:25:46,613 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:25:46,618 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:25:46,619 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:25:46,625 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:25:46,625 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:25:46,650 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:25:47,158 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:25:47,656 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:25:47,674 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:25:47,976 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:25:47,985 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute 'count' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 192, in get_category + if not await main_category_element.count(): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute 'count' +2024-10-12 16:25:47,985 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:25:48,941 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:25:48,943 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:25:48,943 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:25:48,946 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:25:48,947 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:25:49,224 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 16:25:49,275 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:25:49,277 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:25:49,277 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:25:49,282 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:25:49,285 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:25:49,286 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:25:49,286 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:25:49,289 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:25:49,289 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:25:49,296 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:25:49,338 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:26:19,348 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms + +2024-10-12 16:26:19,361 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:26:19,369 - title.py:95 - default_logger - DEBUG - 원본 상품명: +2024-10-12 16:26:19,370 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:26:19,381 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute 'count' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 192, in get_category + if not await main_category_element.count(): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute 'count' +2024-10-12 16:26:19,383 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 16:26:19,425 - browser_control.py:359 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 16:26:19,427 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 16:26:19,428 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 16:26:19,430 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 16:26:19,431 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 16:26:19,455 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 16:26:19,478 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 16:26:19,479 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 16:26:19,479 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 16:26:19,481 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 16:26:19,482 - browser_control.py:490 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 487, in save_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:26:19,484 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:26:19,486 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:26:19,489 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:26:19,490 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:26:31,083 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:26:36,200 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:26:36,200 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:26:36,215 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:26:36,215 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:26:36,215 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:26:36,285 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:26:38,680 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:26:38,682 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:26:38,683 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:26:38,683 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:26:43,061 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:26:43,069 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:26:43,069 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 14879174 +2024-10-12 16:26:43,074 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:26:43,263 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:26:45,022 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:26:45,119 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:26:45,119 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:26:45,453 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:26:45,454 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:26:45,455 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:26:45,456 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:26:47,045 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:26:47,047 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:26:47,047 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:26:47,641 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:26:47,649 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:26:47,650 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:26:47,658 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:26:47,658 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:26:47,703 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:26:48,258 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:26:48,822 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:26:48,840 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:26:49,137 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:26:49,159 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute 'query_selector' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 197, in get_category + certified_text_element = await main_category_element.query_selector(self.certified_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute 'query_selector' +2024-10-12 16:26:49,161 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:26:49,161 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:26:49,168 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:26:49,168 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:26:49,203 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:26:53,179 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:27:19,215 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms + +2024-10-12 16:27:19,232 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:27:19,255 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:27:19,256 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:27:19,266 - title.py:219 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute 'query_selector' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 197, in get_category + certified_text_element = await main_category_element.query_selector(self.certified_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute 'query_selector' +2024-10-12 16:27:19,268 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:27:19,269 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:27:19,272 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:27:19,273 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:33:33,232 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:33:37,589 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:33:37,589 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:33:37,603 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:33:37,603 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:33:37,603 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:33:37,667 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:33:39,823 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:33:39,823 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:33:39,823 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:33:39,823 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:33:43,917 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:33:43,928 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:33:43,932 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 22873012 +2024-10-12 16:33:43,933 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:33:44,159 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:33:45,948 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:33:46,015 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:33:46,017 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:33:46,319 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:33:46,319 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:33:46,319 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:33:46,319 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:33:47,811 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:33:47,812 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:33:47,813 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:33:48,396 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:33:48,403 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:33:48,403 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:33:48,410 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:33:48,411 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:33:48,435 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:33:49,057 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:33:49,672 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:33:49,694 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:33:50,015 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:33:50,015 - title.py:189 - default_logger - DEBUG - category_locator : #productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2) +2024-10-12 16:33:55,025 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 191, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") + +2024-10-12 16:33:55,025 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:33:55,025 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:33:55,035 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:33:55,035 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:33:55,069 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:33:56,994 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:34:25,082 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + +2024-10-12 16:34:25,097 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:34:25,110 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:34:25,110 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:34:25,111 - title.py:189 - default_logger - DEBUG - category_locator : #productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2) +2024-10-12 16:34:30,118 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 191, in get_category + await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기 + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 7999, in wait_for_selector + await self._impl_obj.wait_for_selector( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 397, in wait_for_selector + return await self._main_frame.wait_for_selector(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 323, in wait_for_selector + await self._channel.send("waitForSelector", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Page.wait_for_selector: Timeout 5000ms exceeded. +Call log: +waiting for locator("#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)") + +2024-10-12 16:34:30,120 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:34:30,120 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:34:30,120 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:34:30,120 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:35:09,271 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:35:13,472 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:35:13,473 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:35:13,475 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:35:13,475 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:35:13,475 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:35:13,550 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:35:15,413 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:35:15,415 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:35:15,415 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:35:15,415 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:35:19,328 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:35:19,340 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:35:19,342 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 2956256 +2024-10-12 16:35:19,342 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:35:19,576 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:35:21,108 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:35:21,346 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:35:21,347 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:35:21,754 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:35:21,755 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:35:21,755 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:35:21,756 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:35:23,082 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:35:23,082 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:35:23,082 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:35:23,681 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:35:23,681 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:35:23,681 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:35:23,697 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:35:23,697 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:35:23,739 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:35:24,284 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:35:24,886 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:35:24,900 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:35:25,184 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:35:25,184 - title.py:189 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:35:25,208 - title.py:193 - default_logger - DEBUG - main_category_element : JSHandle@node +2024-10-12 16:35:25,208 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'ElementHandle' object has no attribute 'count' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 195, in get_category + if not await main_category_element.count(): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'ElementHandle' object has no attribute 'count' +2024-10-12 16:35:25,209 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:35:25,209 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:35:25,209 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:35:25,209 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:35:25,238 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:35:28,837 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:35:55,250 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms + +2024-10-12 16:35:55,252 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:35:55,274 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:35:55,274 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:35:55,274 - title.py:189 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:35:55,296 - title.py:193 - default_logger - DEBUG - main_category_element : JSHandle@node +2024-10-12 16:35:55,297 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'ElementHandle' object has no attribute 'count' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 195, in get_category + if not await main_category_element.count(): + ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'ElementHandle' object has no attribute 'count' +2024-10-12 16:35:55,297 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:35:55,299 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:35:55,300 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:35:55,302 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:37:31,898 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:37:36,201 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:37:36,201 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:37:36,212 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:37:36,212 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:37:36,214 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:37:36,275 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:37:38,134 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:37:38,134 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:37:38,134 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:37:38,134 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:37:42,590 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:37:42,599 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:37:42,601 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 15075782 +2024-10-12 16:37:42,601 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:37:42,795 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:37:44,530 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:37:44,647 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:37:44,650 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:37:44,980 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:37:44,980 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:37:44,981 - title.py:32 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:37:44,982 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:37:46,321 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:37:46,321 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:37:46,321 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:37:46,908 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:37:46,908 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:37:46,908 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:37:46,923 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:37:46,924 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:37:46,944 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:37:47,457 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:37:48,003 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:37:48,020 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:37:48,324 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:37:48,324 - title.py:189 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:37:48,334 - title.py:193 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 16:37:48,345 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute '_frame' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 200, in get_category + certified_text_element = main_category_element.locator(self.certified_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15489, in locator + self._impl_obj.locator( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 236, in locator + if selectorOrLocator._frame != self._frame: + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute '_frame' +2024-10-12 16:37:48,348 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:37:48,348 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:37:48,350 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:37:48,356 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:37:48,378 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:37:49,371 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:38:18,394 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + +2024-10-12 16:38:18,414 - title.py:92 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:38:18,434 - title.py:95 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:38:18,435 - title.py:180 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:38:18,435 - title.py:189 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:38:18,449 - title.py:193 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 16:38:18,457 - title.py:222 - default_logger - ERROR - 카테고리 텍스트 가져오기 중 오류 발생: 'NoneType' object has no attribute '_frame' +Traceback (most recent call last): + File "H:\py\autoTrans\title.py", line 200, in get_category + certified_text_element = main_category_element.locator(self.certified_text_locator) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15489, in locator + self._impl_obj.locator( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 236, in locator + if selectorOrLocator._frame != self._frame: + ^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'NoneType' object has no attribute '_frame' +2024-10-12 16:38:18,460 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:38:18,461 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:38:18,462 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:38:18,462 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 16:42:56,938 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 16:43:29,404 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 16:43:29,404 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 16:43:29,416 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 16:43:29,416 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 16:43:29,416 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 16:43:29,491 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 16:43:31,081 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 16:43:31,083 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 16:43:31,085 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 16:43:31,085 - browser_control.py:59 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 16:43:35,742 - browser_control.py:74 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 16:43:35,752 - browser_control.py:79 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 16:43:35,754 - browser_control.py:86 - default_logger - DEBUG - 크롬 창 핸들: 10947798 +2024-10-12 16:43:35,755 - browser_control.py:92 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 16:43:35,961 - browser_control.py:110 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 16:43:37,446 - browser_control.py:230 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 16:43:37,648 - browser_control.py:236 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 16:43:37,649 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 16:43:37,989 - browser_control.py:249 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 16:43:37,990 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:43:37,990 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:43:37,990 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 16:43:39,694 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 16:43:39,694 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 16:43:39,694 - browser_control.py:661 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 16:43:40,285 - browser_control.py:671 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 16:43:40,295 - browser_control.py:151 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 16:43:40,296 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 16:43:40,303 - browser_control.py:296 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 16:43:40,303 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 16:43:40,324 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:43:40,847 - browser_control.py:334 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 16:43:41,443 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:43:41,460 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:43:41,743 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:43:41,743 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:43:41,762 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 16:43:41,768 - title.py:201 - default_logger - DEBUG - certified_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 16:43:41,783 - title.py:216 - default_logger - DEBUG - 카테고리 텍스트: 생활용품-공구-수공구/공구함-기타 수공구 +2024-10-12 16:43:41,784 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:43:41,784 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:43:41,788 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 16:43:41,788 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 16:43:41,825 - browser_control.py:331 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 16:43:43,293 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 16:44:11,831 - browser_control.py:337 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 중 오류: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 333, in open_product_edit_dialog + await button.click() + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 15059, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_locator.py", line 156, in click + return await self._frame.click(self._selector, strict=True, **params) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_frame.py", line 488, in click + await self._channel.send("click", locals_to_params(locals())) + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 59, in send + return await self._connection.wrap_api_call( + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_connection.py", line 514, in wrap_api_call + raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None +playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. +Call log: +waiting for locator("//button[span[text()=\"세부사항 수정 및 업로드\"]]").nth(1) + - locator resolved to + - attempting click action + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #1 + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #2 + - waiting 20ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #3 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #4 + - waiting 100ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #5 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #6 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #7 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #8 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #9 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #10 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #11 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #12 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #13 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #14 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #15 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #16 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #17 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #18 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #19 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #20 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #21 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #22 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #23 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #24 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #25 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #26 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #27 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #28 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #29 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #30 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #31 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #32 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #33 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #34 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #35 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #36 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #37 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #38 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #39 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #40 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #41 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #42 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #43 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #44 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #45 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #46 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #47 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #48 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #49 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #50 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #51 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #52 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #53 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #54 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #55 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #56 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #57 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #58 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #59 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #60 + - waiting 500ms + - waiting for element to be visible, enabled and stable + - element is visible, enabled and stable + - scrolling into view if needed + - done scrolling + -
from
subtree intercepts pointer events + - retrying click action, attempt #61 + - waiting 500ms + +2024-10-12 16:44:11,845 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 16:44:11,850 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 16:44:11,850 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 16:44:11,850 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 16:44:11,864 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 16:44:11,877 - title.py:201 - default_logger - DEBUG - certified_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 16:44:11,883 - title.py:216 - default_logger - DEBUG - 카테고리 텍스트: 생활용품-공구-수공구/공구함-기타 수공구 +2024-10-12 16:44:11,893 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 16:44:11,893 - browser_control.py:481 - default_logger - DEBUG - 저장 버튼 클릭 중 오류: Frame.click() missing 1 required positional argument: 'selector' +Traceback (most recent call last): + File "H:\py\autoTrans\browser_control.py", line 477, in save_and_ecs_product_edit + await self.page.click(save_button_locator) + File "H:\py\autoTrans\Lib\site-packages\playwright\async_api\_generated.py", line 9625, in click + await self._impl_obj.click( + File "H:\py\autoTrans\Lib\site-packages\playwright\_impl\_page.py", line 777, in click + return await self._main_frame.click(**locals_to_params(locals())) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +TypeError: Frame.click() missing 1 required positional argument: 'selector' +2024-10-12 16:44:11,894 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 16:44:11,896 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 17:13:47,039 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:16:03,899 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:16:03,899 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:16:03,936 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:16:03,937 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:16:03,941 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:16:04,008 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:16:07,829 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 17:16:09,249 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 17:16:09,251 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 17:16:09,251 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 17:16:09,251 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 17:16:17,163 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 17:16:17,172 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 17:16:17,174 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 1971740 +2024-10-12 17:16:17,175 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 17:16:17,372 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 17:16:19,233 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 17:16:19,329 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 17:16:19,329 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 17:16:19,673 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 17:16:19,675 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:16:19,675 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:16:19,675 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:16:24,325 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 17:16:24,325 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 17:16:24,325 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 17:16:24,928 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 17:16:24,934 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 17:16:24,934 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 17:16:24,940 - browser_control.py:318 - default_logger - DEBUG - 수정할 상품 개수: 20 +2024-10-12 17:16:24,940 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 17:16:24,967 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 17:16:25,534 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 17:16:26,089 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 17:16:26,104 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 17:16:26,400 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 17:16:26,400 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 17:16:26,417 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 17:16:26,423 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 17:16:26,432 - title.py:217 - default_logger - DEBUG - 카테고리 텍스트: +2024-10-12 17:16:26,437 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 17:16:27,181 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 17:16:27,181 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 17:16:27,183 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 17:16:27,184 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 17:16:27,184 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 17:16:27,403 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 17:16:27,443 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 17:16:27,454 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 17:16:27,461 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 17:16:27,461 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 17:16:27,641 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 17:16:27,643 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 17:16:27,961 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 17:16:27,964 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 17:16:27,965 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 17:16:28,067 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 17:16:28,456 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 17:16:28,728 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 17:16:29,010 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 17:16:29,024 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机 +2024-10-12 17:16:29,026 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 17:16:29,026 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 17:16:29,037 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 17:16:29,043 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 17:16:29,053 - title.py:217 - default_logger - DEBUG - 카테고리 텍스트: +2024-10-12 17:16:29,053 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 17:16:29,456 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 17:16:29,457 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 17:16:29,458 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 17:16:29,459 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 17:16:29,460 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 17:16:29,602 - price.py:524 - default_logger - DEBUG - 옵션 수: 4 +2024-10-12 17:16:29,620 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 17:16:29,620 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 17:16:29,620 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 17:16:29,625 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 17:16:29,828 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 17:16:29,829 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 17:16:30,131 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 17:16:30,133 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 17:16:30,134 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 17:16:30,610 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 17:16:33,964 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:19:18,808 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:19:18,808 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:19:18,823 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:19:18,823 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:19:18,823 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:19:18,885 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:19:20,720 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 17:19:23,906 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 17:19:23,906 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 17:19:23,906 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 17:19:23,909 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 17:19:28,004 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 17:19:28,012 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 17:19:28,015 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 3607296 +2024-10-12 17:19:28,016 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 17:19:28,208 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 17:19:29,973 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 17:19:30,055 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 17:19:30,055 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 17:19:30,356 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 17:19:30,356 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:19:30,356 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:19:30,356 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 17:19:32,064 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 17:19:32,066 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 17:19:32,066 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 17:19:32,665 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 17:19:32,674 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 17:19:32,674 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 17:19:32,680 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20 +2024-10-12 17:19:32,682 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 17:19:32,708 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 17:19:33,237 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 17:19:33,750 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 17:19:33,765 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 17:19:34,040 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 17:19:34,040 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 +2024-10-12 17:19:34,056 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1'> +2024-10-12 17:19:34,056 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 17:19:34,080 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활용품-공구-수공구/공구함-기타 수공구 +2024-10-12 17:19:34,080 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 17:19:34,833 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 17:19:34,833 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 17:19:34,833 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 17:19:34,838 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 17:19:34,838 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 17:19:35,067 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 17:19:35,110 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 17:19:35,118 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 17:19:35,120 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 17:19:35,120 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 17:19:35,216 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 17:19:35,229 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 17:19:35,229 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 17:19:35,577 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 17:19:35,580 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 17:19:35,581 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 17:19:53,804 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:22:07,822 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:23:24,272 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:26:17,208 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:26:17,208 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:26:17,217 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:26:17,217 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:26:17,218 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:26:17,289 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:26:19,214 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:29:47,304 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:29:53,068 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:29:53,071 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:29:53,080 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:29:53,080 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:29:53,080 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:29:53,146 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:29:55,337 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:31:36,866 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:31:41,338 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:31:41,338 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:31:41,349 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:31:41,349 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:31:41,349 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:31:41,506 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:31:43,100 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:33:47,589 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:33:51,876 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:33:51,876 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:33:51,887 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:33:51,887 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:33:51,887 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:36:21,865 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:36:21,865 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:36:21,875 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:36:21,876 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:36:21,876 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:36:22,023 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:36:23,241 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:36:38,625 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:36:42,713 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:36:42,713 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:36:42,725 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:36:42,725 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:36:42,725 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:36:42,885 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:36:44,371 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 17:37:42,122 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 17:37:46,319 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 17:37:46,319 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 17:37:46,332 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 17:37:46,333 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 17:37:46,333 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 17:37:46,476 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 17:37:48,545 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:12:25,989 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:12:30,135 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:12:30,135 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:12:30,154 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:12:30,154 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:12:30,154 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:12:30,312 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:12:31,585 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:34:54,573 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:34:58,842 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:34:58,842 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:34:58,850 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:34:58,850 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:34:58,850 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:36:01,147 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:36:01,147 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:36:01,165 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:36:01,166 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:36:01,166 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:40:25,163 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:40:25,163 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:40:25,172 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:40:25,172 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:40:25,174 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:40:25,241 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:40:27,007 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:41:27,834 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:42:04,112 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:42:08,383 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:42:08,383 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:42:08,392 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:42:08,393 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:42:08,393 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:42:08,476 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:42:17,520 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:43:36,592 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:43:40,610 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:43:40,611 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:43:40,618 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:43:40,618 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:43:40,622 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:43:40,698 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:43:41,874 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:49:45,044 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:49:49,388 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:49:49,388 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:49:49,391 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:49:49,391 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:49:49,391 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:49:49,477 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:49:50,889 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:52:05,086 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:52:09,575 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:52:09,575 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:52:09,582 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:52:09,582 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:52:09,582 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:52:09,664 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:52:11,313 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:52:49,360 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:52:53,521 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:52:53,521 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:52:53,530 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:52:53,530 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:52:53,530 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:52:53,613 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:52:55,421 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:56:24,430 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 21:56:28,775 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 21:56:28,775 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 21:56:28,784 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 21:56:28,784 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 21:56:28,784 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 21:56:28,884 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 21:56:29,986 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 21:56:45,791 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:00:12,230 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:00:12,230 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:00:12,230 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:00:12,230 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:00:12,241 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:00:12,353 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:00:13,770 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:01:50,126 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:01:54,188 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:01:54,188 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:01:54,200 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:01:54,200 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:01:54,200 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:01:54,307 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:01:55,499 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:04:04,969 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:04:09,108 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:04:09,108 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:04:09,123 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:04:09,123 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:04:09,123 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:04:09,235 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:04:10,488 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:06:58,246 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:07:02,477 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:07:02,478 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:07:02,484 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:07:02,484 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:07:02,488 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:07:02,579 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:07:03,975 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:07:09,690 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:09:11,035 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:09:11,035 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:09:11,054 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:09:11,054 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:09:11,055 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:09:11,148 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:09:12,299 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:11:45,284 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:11:49,673 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:11:49,674 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:11:49,681 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:11:49,681 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:11:49,681 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:11:49,788 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:11:51,039 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:13:17,659 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:13:21,627 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:13:21,628 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:13:21,637 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:13:21,639 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:13:21,639 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:13:21,740 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:16:06,999 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:16:25,617 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:16:25,617 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:16:25,628 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:16:25,628 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:16:25,632 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:16:25,732 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:16:26,899 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:17:11,488 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:18:01,323 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:18:01,324 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:18:01,332 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:18:01,332 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:18:01,332 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:18:01,446 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:18:03,063 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:18:20,141 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:18:24,395 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:18:24,395 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:18:24,406 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:18:24,406 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:18:24,406 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:18:24,505 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:18:25,929 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:18:54,704 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:18:59,294 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:18:59,294 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:18:59,302 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:18:59,302 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:18:59,304 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:18:59,423 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:19:00,723 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:19:12,209 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:19:16,258 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:19:16,258 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:19:16,265 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:19:16,265 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:19:16,265 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:19:16,374 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:19:17,904 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:21:03,826 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:21:08,113 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:21:08,113 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:21:08,133 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:21:08,133 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:21:08,133 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:21:08,243 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:21:09,870 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:21:23,590 - cmb_diag.py:419 - default_logger - ERROR - CMB 단계 저장 중 오류: no such table: crmobi_stage +Traceback (most recent call last): + File "H:\py\autoTrans\src\cmb_diag.py", line 397, in save_cmb_stage_to_db + self.cursor.execute("SELECT COUNT(1) FROM crmobi_stage WHERE stage = ?", (stage,)) +sqlite3.OperationalError: no such table: crmobi_stage +2024-10-12 22:21:33,458 - cmb_diag.py:419 - default_logger - ERROR - CMB 단계 저장 중 오류: no such table: crmobi_stage +Traceback (most recent call last): + File "H:\py\autoTrans\src\cmb_diag.py", line 397, in save_cmb_stage_to_db + self.cursor.execute("SELECT COUNT(1) FROM crmobi_stage WHERE stage = ?", (stage,)) +sqlite3.OperationalError: no such table: crmobi_stage +2024-10-12 22:21:37,002 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:21:57,732 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:21:57,732 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:21:57,740 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:21:57,740 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:21:57,740 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:21:57,848 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:21:58,679 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:22:03,875 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:22:07,938 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:22:07,938 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:22:07,950 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:22:07,950 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:22:07,950 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:22:08,079 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:22:09,029 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:26:10,921 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:26:14,941 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:26:14,941 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:26:14,952 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:26:14,952 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:26:14,955 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:26:15,056 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:26:16,566 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:30:25,975 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:30:30,208 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:30:30,215 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:30:30,222 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:30:30,222 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:30:30,222 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:30:30,334 - cmb_diag.py:225 - default_logger - ERROR - CrMoBi 단계 설정을 위젯에 반영하는 중 오류 발생: no such column: min_amount +Traceback (most recent call last): + File "H:\py\autoTrans\src\cmb_diag.py", line 210, in update_cmb_settings_from_db + self.cursor.execute("SELECT stage, min_amount, unit_amount, extra_cost FROM crmobi_stages") +sqlite3.OperationalError: no such column: min_amount +2024-10-12 22:30:30,335 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:30:31,412 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:30:35,487 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:34:36,611 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:34:36,611 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:34:36,620 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:34:36,620 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:34:36,621 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:34:36,724 - cmb_diag.py:223 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:34:36,724 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:34:37,914 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:34:54,443 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:34:57,384 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:35:01,314 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:35:01,314 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:35:01,329 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:35:01,329 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:35:01,329 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:35:01,456 - cmb_diag.py:223 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:35:01,459 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:35:02,407 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:36:43,984 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:36:47,823 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:36:47,823 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:36:47,832 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:36:47,832 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:36:47,832 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:36:47,941 - cmb_diag.py:223 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:36:47,941 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:36:48,997 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:40:54,621 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:40:58,796 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:40:58,796 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:40:58,810 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:40:58,810 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:40:58,810 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:40:58,907 - cmb_diag.py:223 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:40:58,907 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:41:00,339 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:41:47,894 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:41:51,951 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:41:51,951 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:41:51,961 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:41:51,961 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:41:51,961 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:41:52,073 - cmb_diag.py:224 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:41:52,075 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:41:53,559 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:42:36,134 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:42:52,508 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:47:22,199 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:48:56,565 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:48:56,565 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:48:56,575 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:48:56,575 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:48:56,575 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:48:56,687 - cmb_diag.py:297 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:48:56,690 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:49:21,114 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:49:26,875 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:49:26,875 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:49:26,895 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:49:26,895 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:49:26,895 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:49:27,023 - cmb_diag.py:297 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:49:27,025 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:49:28,424 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:52:17,752 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:52:21,759 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:52:21,759 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:52:21,769 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:52:21,769 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:52:21,769 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:52:21,868 - cmb_diag.py:337 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:52:47,642 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:52:47,642 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:52:47,652 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:52:47,652 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:52:47,653 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:52:47,763 - cmb_diag.py:347 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:52:47,765 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:52:49,130 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:54:12,587 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:58:13,000 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:58:13,000 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:58:13,007 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:58:13,007 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:58:13,007 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:59:04,120 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:59:04,120 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:59:04,134 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:59:04,135 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:59:04,135 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:59:04,247 - cmb_diag.py:362 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:59:04,388 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:59:05,664 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 22:59:54,106 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 22:59:58,088 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 22:59:58,088 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 22:59:58,090 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 22:59:58,090 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 22:59:58,090 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 22:59:58,198 - cmb_diag.py:358 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 22:59:58,198 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 22:59:59,266 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:00:49,397 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:00:53,540 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:00:53,540 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:00:53,547 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:00:53,547 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:00:53,547 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:00:53,662 - cmb_diag.py:356 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:00:53,664 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:00:56,086 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:03:03,855 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:03:08,080 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:03:08,080 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:03:08,093 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:03:08,093 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:03:08,093 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:03:08,205 - cmb_diag.py:356 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:03:08,205 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:03:09,428 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:05:04,931 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:05:09,398 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:05:09,398 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:05:09,403 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:05:09,403 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:05:09,403 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:05:09,530 - cmb_diag.py:356 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:05:09,530 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:05:10,811 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:06:32,300 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:06:36,599 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:06:36,599 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:06:36,608 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:06:36,608 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:06:36,609 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:06:36,715 - cmb_diag.py:363 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:06:36,715 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:06:37,964 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:07:02,983 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:10:26,398 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:10:26,398 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:10:26,410 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:10:26,411 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:10:26,411 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:10:26,546 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:10:26,549 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:10:27,657 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:10:59,183 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:14:08,376 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:14:08,376 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:14:08,387 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:14:08,387 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:14:08,387 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:14:08,492 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:14:08,492 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:14:10,197 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:15:25,006 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:15:29,225 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:15:29,225 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:15:29,236 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:15:29,242 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:15:29,242 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:15:29,357 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:15:29,358 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:15:30,351 - gui.py:555 - default_logger - DEBUG - 크무비 설정 버튼 클릭됨 +2024-10-12 23:15:41,203 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... +2024-10-12 23:16:49,993 - vertexAI.py:18 - default_logger - DEBUG - GOOGLE_APPLICATION_CREDENTIALS 환경 변수를 설정: leensoo1nt.json +2024-10-12 23:16:49,993 - vertexAI.py:22 - default_logger - DEBUG - Vertex AI 모델 초기화 중... +2024-10-12 23:16:50,004 - vertexAI.py:26 - default_logger - DEBUG - prompt.json 파일을 불러옵니다. +2024-10-12 23:16:50,004 - vertexAI.py:40 - default_logger - DEBUG - 프롬프트 파일 경로: H:\py\autoTrans\prompt.json +2024-10-12 23:16:50,004 - vertexAI.py:43 - default_logger - DEBUG - prompt.json 파일이 성공적으로 로드되었습니다. +2024-10-12 23:16:50,156 - cmb_diag.py:368 - default_logger - DEBUG - CrMoBi 단계 설정이 위젯에 반영되었습니다. +2024-10-12 23:16:50,158 - gui.py:104 - default_logger - DEBUG - 로그기록이 설정되었습니다. +2024-10-12 23:16:51,789 - gui.py:524 - default_logger - DEBUG - 크롬 실행 버튼 클릭됨 +2024-10-12 23:16:51,789 - gui.py:525 - default_logger - DEBUG - self.browser_controller.page : None +2024-10-12 23:16:51,792 - gui.py:560 - default_logger - DEBUG - 크롬 브라우저를 실행합니다... +2024-10-12 23:16:51,792 - browser_control.py:61 - default_logger - DEBUG - 크롬 브라우저 실행 중... +2024-10-12 23:16:55,420 - gui.py:431 - default_logger - DEBUG - 가격 수정 버튼 - 활성화 선택 +2024-10-12 23:16:56,131 - browser_control.py:76 - default_logger - DEBUG - newPage 로딩 ... +2024-10-12 23:16:56,139 - browser_control.py:81 - default_logger - DEBUG - 페이지 제목: 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 +2024-10-12 23:16:56,143 - browser_control.py:88 - default_logger - DEBUG - 크롬 창 핸들: 15537146 +2024-10-12 23:16:56,143 - browser_control.py:94 - default_logger - DEBUG - 로그인 시도 중: 직원 계정 +2024-10-12 23:16:56,338 - browser_control.py:112 - default_logger - DEBUG - 로그인 완료: 직원 계정 +2024-10-12 23:16:58,143 - browser_control.py:252 - default_logger - DEBUG - 다이얼로그가 발견되었습니다. 닫기 버튼을 클릭합니다. +2024-10-12 23:16:58,358 - browser_control.py:258 - default_logger - DEBUG - 다이얼로그를 성공적으로 닫았습니다. +2024-10-12 23:16:58,358 - gui.py:584 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 중... +2024-10-12 23:16:58,672 - browser_control.py:271 - default_logger - DEBUG - 신규 상품 등록 페이지로 이동 완료. +2024-10-12 23:16:58,672 - option.py:36 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 23:16:58,672 - title.py:31 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 23:16:58,672 - price.py:33 - default_logger - DEBUG - page객체 업데이트 : +2024-10-12 23:17:00,032 - gui.py:634 - default_logger - DEBUG - 번역 작업 버튼 클릭됨 +2024-10-12 23:17:00,032 - gui.py:639 - default_logger - DEBUG - 번역 작업을 시작합니다... +2024-10-12 23:17:00,032 - browser_control.py:679 - default_logger - DEBUG - 페이지 스크롤 시작... +2024-10-12 23:17:00,627 - browser_control.py:689 - default_logger - DEBUG - 페이지 스크롤 완료. +2024-10-12 23:17:00,632 - browser_control.py:173 - default_logger - DEBUG - 가져온 텍스트: 총 31개 상품 +2024-10-12 23:17:00,632 - gui.py:663 - default_logger - DEBUG - 현재 페이지: 1 +2024-10-12 23:17:00,639 - browser_control.py:318 - default_logger - DEBUG - 현재 페이지의 수정할 상품 개수: 20 +2024-10-12 23:17:00,639 - gui.py:681 - default_logger - DEBUG - 1/20: 세부사항 수정 작업 중... +2024-10-12 23:17:00,677 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 23:17:01,219 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 23:17:01,795 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 23:17:01,811 - title.py:94 - default_logger - DEBUG - 원본 상품명: 液压电磁阀双向换向阀220v24vDSG-02-3C2/2B2/2B3B/3C3/3C6/03/D2 +2024-10-12 23:17:02,105 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 23:17:02,105 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 +2024-10-12 23:17:02,119 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'> +2024-10-12 23:17:02,125 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 23:17:02,137 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구 +2024-10-12 23:17:02,140 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 23:17:02,912 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 23:17:02,916 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 23:17:02,916 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 23:17:02,916 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 23:17:02,916 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 23:17:03,142 - price.py:524 - default_logger - DEBUG - 옵션 수: 18 +2024-10-12 23:17:03,185 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 23:17:03,186 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 23:17:03,189 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 23:17:03,190 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 23:17:03,379 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 23:17:03,381 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 23:17:03,706 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 23:17:03,709 - gui.py:736 - default_logger - DEBUG - 1/[31]개 상품 수정 완료. +2024-10-12 23:17:03,710 - gui.py:681 - default_logger - DEBUG - 2/20: 세부사항 수정 작업 중... +2024-10-12 23:17:03,810 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 23:17:04,203 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 23:17:04,751 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 23:17:04,766 - title.py:94 - default_logger - DEBUG - 원본 상품명: 小型香水瓶分装中套机喷雾头胶水瓶内塞压盖机卡口封口手压封盖机 +2024-10-12 23:17:04,767 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 23:17:04,767 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 +2024-10-12 23:17:04,781 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'> +2024-10-12 23:17:04,787 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 23:17:04,801 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구 +2024-10-12 23:17:04,802 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 23:17:05,211 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 23:17:05,212 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 23:17:05,212 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 23:17:05,212 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 23:17:05,212 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 23:17:05,344 - price.py:524 - default_logger - DEBUG - 옵션 수: 4 +2024-10-12 23:17:05,383 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 23:17:05,383 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 23:17:05,383 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 23:17:05,387 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 23:17:05,594 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 23:17:05,595 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 23:17:05,956 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 23:17:05,958 - gui.py:736 - default_logger - DEBUG - 2/[31]개 상품 수정 완료. +2024-10-12 23:17:05,960 - gui.py:681 - default_logger - DEBUG - 3/20: 세부사항 수정 작업 중... +2024-10-12 23:17:06,010 - browser_control.py:353 - default_logger - DEBUG - 상품의 '세부사항 수정 및 업로드' 버튼을 화면에 보이도록 스크롤. +2024-10-12 23:17:06,354 - gui.py:757 - default_logger - DEBUG - 번역 작업을 중단합니다... +2024-10-12 23:17:06,377 - browser_control.py:356 - default_logger - DEBUG - 세부사항 수정 다이얼로그 열기 완료. +2024-10-12 23:17:06,890 - title.py:91 - default_logger - DEBUG - 원본 상품명을 가져오는 중입니다. +2024-10-12 23:17:06,908 - title.py:94 - default_logger - DEBUG - 원본 상품명: 驾驾乐千斤顶液压立式2吨小汽车用5吨货车轿车油压车载手摇千金顶 +2024-10-12 23:17:06,908 - title.py:179 - default_logger - DEBUG - 마켓 : ss - 카테고리 텍스트를 가져오는 중입니다. +2024-10-12 23:17:06,908 - title.py:188 - default_logger - DEBUG - category_locator : div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 +2024-10-12 23:17:06,926 - title.py:192 - default_logger - DEBUG - main_category_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2'> +2024-10-12 23:17:06,932 - title.py:201 - default_logger - DEBUG - category_text_element : selector='div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2 >> div.ant-col.css-1li46mu:nth-child(1)'> +2024-10-12 23:17:06,943 - title.py:214 - default_logger - DEBUG - 카테고리 text = 생활/건강-공구-에어공구-유압공구 +2024-10-12 23:17:06,943 - gui.py:707 - default_logger - DEBUG - 가격수정 : True +2024-10-12 23:17:07,960 - browser_control.py:381 - default_logger - DEBUG - 가격 탭 클릭 완료. +2024-10-12 23:17:07,960 - price.py:65 - default_logger - DEBUG - 초기 더하기마진과 해외배송비 가격 정보를 수집합니다. +2024-10-12 23:17:07,960 - price.py:630 - default_logger - ERROR - 해외배송비와 더하기 마진 수집 중 오류 발생: 'PriceHandler' object has no attribute 'selectors' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 618, in get_plusmargin_and_shipping_values + margin_element = await self.page.wait_for_selector(self.selectors['plus_margin_locator']) + ^^^^^^^^^^^^^^ +AttributeError: 'PriceHandler' object has no attribute 'selectors' +2024-10-12 23:17:07,964 - price.py:71 - default_logger - DEBUG - 더하기마진값5000을 팔린가격5000으로 간주 +2024-10-12 23:17:07,964 - price.py:73 - default_logger - DEBUG - 옵션 가격 정보를 수집합니다. +2024-10-12 23:17:08,315 - price.py:524 - default_logger - DEBUG - 옵션 수: 43 +2024-10-12 23:17:08,340 - price.py:601 - default_logger - ERROR - Failed to collect product costs and prices: 'coroutine' object has no attribute 'replace' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 569, in collect_product_costs_and_prices + cost_value = int(float(await product_cost_element.input_value().replace(",", ""))) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +AttributeError: 'coroutine' object has no attribute 'replace' +2024-10-12 23:17:08,341 - price.py:500 - default_logger - ERROR - 원가기반 가격 계산 중 중 오류 발생: unsupported operand type(s) for /: 'PriceHandler' and 'float' +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 484, in calc_initial_price + initial_cost_price = self.round_to_UP(initial_cost_price) + ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + File "H:\py\autoTrans\price.py", line 706, in round_to_UP + rounded_number = math.ceil(number / nearest) * nearest + ~~~~~~~^~~~~~~~~ +TypeError: unsupported operand type(s) for /: 'PriceHandler' and 'float' +2024-10-12 23:17:08,342 - price.py:83 - default_logger - DEBUG - 적정 판매가를 계산합니다. +2024-10-12 23:17:08,343 - price.py:122 - default_logger - ERROR - 가격 수정 중 오류 발생: 'NoneType' object does not support item assignment +Traceback (most recent call last): + File "H:\py\autoTrans\price.py", line 84, in process_price + self.optimal_price_config['sold_price'] = sold_price # 팔린가격 기본값(10000이 아닌 값이 있을 경우 팔린가격으로 간주) + ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^ +TypeError: 'NoneType' object does not support item assignment +2024-10-12 23:17:08,452 - browser_control.py:508 - default_logger - DEBUG - 상품 수정 내용 저장 완료. +2024-10-12 23:17:08,452 - gui.py:731 - default_logger - DEBUG - 상품 세부사항 저장 중... +2024-10-12 23:17:08,823 - browser_control.py:500 - default_logger - DEBUG - 상품 수정 내용 저장 및 ECS 완료. +2024-10-12 23:17:08,826 - gui.py:736 - default_logger - DEBUG - 3/[31]개 상품 수정 완료. +2024-10-12 23:17:08,827 - gui.py:678 - default_logger - DEBUG - 번역 작업이 중단되었습니다. +2024-10-12 23:17:11,210 - gui.py:761 - default_logger - DEBUG - 프로그램을 종료합니다... diff --git a/browser_control.py b/browser_control.py index 9ffac05b..48aa8170 100644 --- a/browser_control.py +++ b/browser_control.py @@ -12,7 +12,7 @@ class BrowserController: self.app = app self.logger = logger self.locator_manager = locator_manager - self.chrome_window_name = "퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 - Chrome" + # self.chrome_window_name = "퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 - Chrome" # self.whale_window_name = "새 시크릿 탭 - Whale" self.chrome_hwnd = None self.whale_hwnd = None @@ -22,6 +22,7 @@ class BrowserController: self.page = None # BrowserController에 해당하는 모든 locator를 정의 + self.chrome_window_name = self.locator_manager.get_locator('BrowserControl', 'chrome_window_name') self.login_email_locator = self.locator_manager.get_locator('BrowserControl', 'login_email_locator') self.login_password_locator = self.locator_manager.get_locator('BrowserControl', 'login_password_locator') self.login_button_locator = self.locator_manager.get_locator('BrowserControl', 'login_button_locator') @@ -30,6 +31,7 @@ class BrowserController: self.staff_login_button_locator = self.locator_manager.get_locator('BrowserControl', 'staff_login_button_locator') self.close_ad_dialog_locator = self.locator_manager.get_locator('BrowserControl', 'close_ad_dialog_locator') self.close_ad_button_locator = self.locator_manager.get_locator('BrowserControl', 'close_ad_button_locator') + self.total_product_count_locator = self.locator_manager.get_locator('BrowserControl', 'total_product_count_locator') self.product_name_template = self.locator_manager.get_locator('BrowserControl', 'product_name_template') self.product_price_template = self.locator_manager.get_locator('BrowserControl', 'product_price_template') self.product_image_template = self.locator_manager.get_locator('BrowserControl', 'product_image_template') @@ -42,8 +44,14 @@ class BrowserController: self.ck_source_editing_area_locator = self.locator_manager.get_locator('BrowserControl', 'ck_source_editing_area_locator') self.option_input_field_locator = self.locator_manager.get_locator('BrowserControl', 'option_input_field_locator') self.text_templates = self.locator_manager.selectors.get('DetailPageTextTemplates', {}) - self.product_name_template_xpath = self.locator_manager.get_locator('BrowserControl', 'product_name_template_xpath') - + self.title_tab_locator = self.locator_manager.get_locator('BrowserControl', 'title_tab_locator') + self.option_tab_locator = self.locator_manager.get_locator('BrowserControl', 'option_tab_locator') + self.price_tab_locator = self.locator_manager.get_locator('BrowserControl', 'price_tab_locator') + self.tag_tab_locator = self.locator_manager.get_locator('BrowserControl', 'tag_tab_locator') + self.thumb_tab_locator = self.locator_manager.get_locator('BrowserControl', 'thumb_tab_locator') + self.detail_tab_locator = self.locator_manager.get_locator('BrowserControl', 'detail_tab_locator') + self.upload_tab_locator = self.locator_manager.get_locator('BrowserControl', 'upload_tab_locator') + self.save_button_locator = self.locator_manager.get_locator('BrowserControl', 'save_button_locator') def get_page(self): return self.page @@ -133,7 +141,7 @@ class BrowserController: self.logger.debug('크롬 창을 찾을 수 없습니다.') - async def get_total_product_count(self): + async def get_total_product_count_ori(self): try: # JavaScript로 해당 요소의 텍스트를 가져옴 element_text = await self.page.evaluate('''() => { @@ -153,38 +161,58 @@ class BrowserController: self.logger.debug(f"상품 수를 가져오는 중 오류 발생: {e}", exc_info=True) return 0 - - async def get_product_name(self, index, selector='xpath'): - """ - 상품명을 수집하는 메서드 - index : 상품명을 수집하는 인덱스 - selector : 수집방법 (css 또는 xpath) - """ + async def get_total_product_count(self): try: - # config.ini에서 설정된 선택자에 인덱스를 적용하여 가져옴 - # product_name_selector = self.product_name_template.format(index=index) - # self.logger.debug(f"사용된 선택자: {product_name_selector}") # 선택자 출력 - - product_name_xpath_selector = self.product_name_template_xpath.format(index=index) - self.logger.debug(f"사용된 선택자: {product_name_xpath_selector}") # 선택자 출력 - - - # XPath 기반으로 요소 검색 - product_name_element = await self.page.locator(f"xpath={product_name_xpath_selector}").element_handle() - - # product_name_element = await self.page.query_selector(product_name_selector) - - # product_name_element가 None인지 확인 - if product_name_element is None: - self.logger.error(f"상품명 요소를 찾을 수 없습니다: index {index}") - return "수집 오류 발생" - - # 요소가 존재할 경우, inner_text 수집 - product_name = await product_name_element.inner_text() - return product_name.strip() + # Python 변수를 JavaScript로 전달하여 요소의 텍스트를 가져옴 + element_text = await self.page.evaluate(f'''(selector) => {{ + let element = document.querySelector(selector); + return element ? element.innerText : null; + }}''', self.total_product_count_locator) + + if element_text: + self.logger.debug(f"가져온 텍스트: {element_text}") # 텍스트 확인용 로그 + # "총 xx개 상품"에서 숫자만 추출 + count = int(''.join(filter(str.isdigit, element_text))) + return count + else: + self.logger.debug("요소를 찾을 수 없습니다.") + return 0 except Exception as e: - self.logger.error(f"상품명 수집 중 오류: {e}") - return "수집 오류 발생" + self.logger.debug(f"상품 수를 가져오는 중 오류 발생: {e}", exc_info=True) + return 0 + + + # async def get_product_name(self, index, selector='xpath'): + # """ + # 상품명을 수집하는 메서드 + # index : 상품명을 수집하는 인덱스 + # selector : 수집방법 (css 또는 xpath) + # """ + # try: + # # config.ini에서 설정된 선택자에 인덱스를 적용하여 가져옴 + # # product_name_selector = self.product_name_template.format(index=index) + # # self.logger.debug(f"사용된 선택자: {product_name_selector}") # 선택자 출력 + + # product_name_xpath_selector = self.product_name_template_xpath.format(index=index) + # self.logger.debug(f"사용된 선택자: {product_name_xpath_selector}") # 선택자 출력 + + + # # XPath 기반으로 요소 검색 + # product_name_element = await self.page.locator(f"xpath={product_name_xpath_selector}").element_handle() + + # # product_name_element = await self.page.query_selector(product_name_selector) + + # # product_name_element가 None인지 확인 + # if product_name_element is None: + # self.logger.error(f"상품명 요소를 찾을 수 없습니다: index {index}") + # return "수집 오류 발생" + + # # 요소가 존재할 경우, inner_text 수집 + # product_name = await product_name_element.inner_text() + # return product_name.strip() + # except Exception as e: + # self.logger.error(f"상품명 수집 중 오류: {e}") + # return "수집 오류 발생" @@ -287,7 +315,7 @@ class BrowserController: self.logger.debug("세부사항 수정 및 업로드 버튼을 찾을 수 없습니다.") return [] - self.logger.debug(f"수정할 상품 개수: {button_count}") + self.logger.debug(f"현재 페이지의 수정할 상품 개수: {button_count}") # 모든 버튼을 리스트로 반환 return [buttons.nth(i) for i in range(button_count)] @@ -333,30 +361,35 @@ class BrowserController: async def click_detail_tab(self): """상세페이지 탭 클릭""" try: - detail_tab_locator = self.locator_manager.get_locator('BrowserControl', 'detail_tab_locator') - await self.page.click(detail_tab_locator) + await self.page.click(self.detail_tab_locator) self.logger.debug("상세페이지 탭 클릭 완료.") except Exception as e: self.logger.debug(f"상세페이지 탭 클릭 중 오류: {e}", exc_info=True) async def click_option_tab(self): - """상세페이지 탭 클릭""" + """옵션 탭 클릭""" try: - option_tab_locator = self.locator_manager.get_locator('BrowserControl', 'option_tab_locator') - await self.page.click(option_tab_locator) + await self.page.click(self.option_tab_locator) self.logger.debug("옵션 탭 클릭 완료.") except Exception as e: self.logger.debug(f"옵션 탭 클릭 중 오류: {e}", exc_info=True) async def click_price_tab(self): - """상세페이지 탭 클릭""" + """가격 탭 클릭""" try: - price_tab_locator = self.locator_manager.get_locator('BrowserControl', 'price_tab_locator') - await self.page.click(price_tab_locator) + await self.page.click(self.price_tab_locator) self.logger.debug("가격 탭 클릭 완료.") except Exception as e: self.logger.debug(f"가격 탭 클릭 중 오류: {e}", exc_info=True) + async def click_title_tab(self): + """상품명 탭 클릭""" + try: + await self.page.click(self.title_tab_locator) + self.logger.debug("상품명 탭 클릭 완료.") + except Exception as e: + self.logger.debug(f"상품명 탭 클릭 중 오류: {e}", exc_info=True) + async def extract_image_urls(self, optionHandler, is_option_data=False): """상세페이지에서 이미지 URL 추출""" try: @@ -462,8 +495,7 @@ class BrowserController: async def save_and_ecs_product_edit(self): """상품 수정 후 저장 버튼 클릭""" try: - save_button_locator = self.locator_manager.get_locator('BrowserControl', 'save_button_locator') - await self.page.click(save_button_locator) + await self.page.click(self.save_button_locator) await self.page.keyboard.press("Escape") self.logger.debug("상품 수정 내용 저장 및 ECS 완료.") except Exception as e: @@ -472,8 +504,7 @@ class BrowserController: async def save_product_edit(self): """상품 수정 후 저장 버튼 클릭""" try: - save_button_locator = self.locator_manager.get_locator('BrowserControl', 'save_button_locator') - await self.page.click(save_button_locator) + await self.page.click(self.save_button_locator) self.logger.debug("상품 수정 내용 저장 완료.") except Exception as e: self.logger.debug(f"저장 버튼 클릭 중 오류: {e}", exc_info=True) @@ -482,8 +513,7 @@ class BrowserController: """다음 페이지로 이동""" try: # 현재 페이지가 몇 번째 페이지인지 확인 (클래스에 'ant-pagination-item-active'가 있는 요소) - current_page_locator = self.locator_manager.get_locator('BrowserControl', 'current_page_locator') - current_page = await self.page.query_selector(current_page_locator) + current_page = await self.page.query_selector(self.current_page_locator) if not current_page: self.logger.debug("현재 페이지 정보를 찾을 수 없습니다.") @@ -494,8 +524,7 @@ class BrowserController: next_page_number = current_page_number + 1 # 다음 페이지 버튼을 찾음 (title 속성으로 다음 페이지를 찾음) - next_page_button_template = self.locator_manager.get_locator('BrowserControl', 'next_page_button_template') - next_page_button_locator = 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) if next_page_button: @@ -606,43 +635,43 @@ class BrowserController: self.logger.debug("최대 스크롤 횟수에 도달했습니다.") - async def collect_product_info(self): - """ - 상품 정보를 수집하는 메서드 - """ - try: - # 페이지를 아래로 스크롤하여 모든 상품 로드 - await self.scroll_with_wheel('down') - await self.scroll_with_wheel('up') + # async def collect_product_info(self): + # """ + # 상품 정보를 수집하는 메서드 + # """ + # try: + # # 페이지를 아래로 스크롤하여 모든 상품 로드 + # await self.scroll_with_wheel('down') + # await self.scroll_with_wheel('up') - product_infos = [] - for i in range(1, 51): # 1부터 최대 50까지 상품 처리 - try: - # 각 상품의 CSS 선택자를 동적으로 생성하여 접근 - product_name_locator = self.product_name_template.format(i=i) - product_price_locator = self.product_price_template.format(i=i) - product_image_locator = self.product_image_template.format(i=i) + # product_infos = [] + # for i in range(1, 51): # 1부터 최대 50까지 상품 처리 + # try: + # # 각 상품의 CSS 선택자를 동적으로 생성하여 접근 + # product_name_locator = self.product_name_template.format(i=i) + # product_price_locator = self.product_price_template.format(i=i) + # product_image_locator = self.product_image_template.format(i=i) - product_name_element = await self.page.query_selector(product_name_locator) - product_price_element = await self.page.query_selector(product_price_locator) - product_image_element = await self.page.query_selector(product_image_locator) + # product_name_element = await self.page.query_selector(product_name_locator) + # product_price_element = await self.page.query_selector(product_price_locator) + # product_image_element = await self.page.query_selector(product_image_locator) - if product_name_element and product_price_element and product_image_element: - product_info = { - "name": await product_name_element.text_content().strip(), - "price": await product_price_element.text_content().strip(), - "image_url": await product_image_element.get_attribute('src') - } - self.logger.debug(f"상품 {i}: {product_info}") - product_infos.append(product_info) - except Exception as e: - self.logger.error(f"상품 {i} 정보 수집 중 오류 발생: {e}", exc_info=True) - continue + # if product_name_element and product_price_element and product_image_element: + # product_info = { + # "name": await product_name_element.text_content().strip(), + # "price": await product_price_element.text_content().strip(), + # "image_url": await product_image_element.get_attribute('src') + # } + # self.logger.debug(f"상품 {i}: {product_info}") + # product_infos.append(product_info) + # except Exception as e: + # self.logger.error(f"상품 {i} 정보 수집 중 오류 발생: {e}", exc_info=True) + # continue - return product_infos - except Exception as e: - self.logger.error(f"상품 정보 수집 중 오류 발생: {e}", exc_info=True) - return [] + # return product_infos + # except Exception as e: + # self.logger.error(f"상품 정보 수집 중 오류 발생: {e}", exc_info=True) + # return [] async def scroll_page_to_bottom(self, pause_time=0.2): diff --git a/config.ini b/config.ini index bdd6d631..abaf4fe6 100644 --- a/config.ini +++ b/config.ini @@ -1,19 +1,19 @@ [PriceLocators] -return_fee_input_locator = //*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[3]/div/div/div/div[1]/div[2]/input -first_delv_fee_input_locator = //*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[4]/div/div[2]/div/div[1]/div[2]/input -exchange_fee_input_locator = //*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[5]/div/div/div/div[1]/div[2]/input -plus_margin_locator = //*[@id='productMainContentContainerId']/div/div[1]/div/div/div[2]/div/div[1]/div[8]/div/div/div[3]/div/div/div/div[1]/div[2]/input -oversea_shipping_locator = //*[@id='productMainContentContainerId']/div/div[1]/div/div/div[2]/div/div[1]/div[10]/div/div/div/div[1]/div[2]/input +return_fee_input_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[3]/div/div/div/div[1]/div[2]/input' +first_delv_fee_input_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[4]/div/div[2]/div/div[1]/div[2]/input' +exchange_fee_input_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div/div/div[4]/div/div[1]/div[5]/div/div/div/div[1]/div[2]/input' +plus_margin_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div/div/div[2]/div/div[1]/div[8]/div/div/div[3]/div/div/div/div[1]/div[2]/input' +oversea_shipping_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div/div/div[2]/div/div[1]/div[10]/div/div/div/div[1]/div[2]/input' option_count_text_locator = 'div#productMainContentContainerId th:nth-child(2) > div > span' -product_cost_locator = //*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[{i}]/td[3]/div/div/div/div[2]/input -standard_selling_price_locator = //*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[{i}]/td[4]/div/div/div[1]/div/div[2]/input +product_cost_locator = '//*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[{i}]/td[3]/div/div/div/div[2]/input' +standard_selling_price_locator = '//*[@id='productMainContentContainerId']/div/div[2]/div/div/div[5]/div[1]/div/div/div/div/div[2]/table/tbody/tr[{i}]/td[4]/div/div/div[1]/div/div[2]/input' [OptionLocators] # 옵션 관련 선택자 -option_excluded_selector_template = //*[@id="productMainContentContainerId"]/div[1]/div[2]/div/div/div[2]/div/div[1]/div/div/div[2]/div/div/div[5]/div[1]/div/div/ul/li[{i}]/div/div[1]/div/div[2]/div/div[3] -option_input_selector_template = //*[@id="productMainContentContainerId"]/div[1]/div[2]/div/div/div[2]/div/div[1]/div/div/div[2]/div/div/div[5]/div[1]/div/div/ul/li[{i}]/div/div[1]/div/div[3]/div[2]/div[1]/span/input -single_option_locator = //div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '단일 상품등록')] -option_product_locator = //div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '옵션 상품등록')] +option_excluded_selector_template = '//*[@id="productMainContentContainerId"]/div[1]/div[2]/div/div/div[2]/div/div[1]/div/div/div[2]/div/div/div[5]/div[1]/div/div/ul/li[{i}]/div/div[1]/div/div[2]/div/div[3]' +option_input_selector_template = '//*[@id="productMainContentContainerId"]/div[1]/div[2]/div/div/div[2]/div/div[1]/div/div/div[2]/div/div/div[5]/div[1]/div/div/ul/li[{i}]/div/div[1]/div/div[3]/div[2]/div[1]/span/input' +single_option_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '단일 상품등록')]' +option_product_locator = '//div[@id="productMainContentContainerId"]//label[contains(@class, 'ant-radio-button-wrapper-checked') and contains(., '옵션 상품등록')]' total_options_selector = '#productMainContentContainerId label.ant-checkbox-wrapper' original_name_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span' edit_field_selector_template = 'div#productMainContentContainerId li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input' @@ -23,95 +23,112 @@ price_selector_template = '#productMainContentContainerId li:nth-child({i}) sup' delete_button_selector_template = '#productMainContentContainerId > div.sc-TOgAA.fZvEqY > div:nth-child(2) > div > div > div:nth-child(2) > div > div.sc-cFShuL.dbIeho > div > div > div.ant-collapse-content.ant-collapse-content-active > div > div > div.sc-fGdiLE.iyXMeU > div.ant-list.ant-list-split.css-1li46mu > div > div > ul > li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(2) > div > div.ant-row.ant-row-no-wrap.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > div' confirm_delete_button_locator = 'body > div:nth-child(18) > div > div.ant-modal-wrap.ant-modal-confirm-centered.ant-modal-centered > div > div.sc-ddjGPC.jbwEYW > div > div > div > div.ant-modal-confirm-btns > button.ant-btn.css-1li46mu.ant-btn-primary.ant-btn-dangerous' add_button_selector_template = '#productMainContentContainerId > div.sc-TOgAA.fZvEqY > div:nth-child(2) > div > div > div:nth-child(2) > div > div.sc-cFShuL.dbIeho > div > div > div.ant-collapse-content.ant-collapse-content-active > div > div > div.sc-fGdiLE.iyXMeU > div.ant-list.ant-list-split.css-1li46mu > div > div > ul > li:nth-child({i}) > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img' -file_input_locator = input[type="file"] +file_input_locator = 'input[type="file"]' [DetailLocators] -product_detail_input_locator = //*[@id='detailMainContainerId']/div/div/div[{i}]/textarea -product_image_locator = //*[@id='detailMainContainerId']/div/div/div[{i}]/img +product_detail_input_locator = '//*[@id='detailMainContainerId']/div/div/div[{i}]/textarea' +product_image_locator = '//*[@id='detailMainContainerId']/div/div/div[{i}]/img' [DetailPageTextTemplates] -leading_text_1 = "---" -leading_text_2 = "# > 안녕하세요 혜리수샵입니다." -leading_text_3 = " " -leading_text_4 = " " -leading_text_5 = "### 마켓정책으로 인해 모든 옵션이 노출되지 않을수도 있습니다." -leading_text_6 = "**반드시 옵션사진과 옵션이름을 확인하시고 구매하시기 바랍니다.**" -leading_text_7 = "---" +leading_text_1 = '---' +leading_text_2 = '# > 안녕하세요 혜리수샵입니다.' +leading_text_3 = ' ' +leading_text_4 = ' ' +leading_text_5 = '### 마켓정책으로 인해 모든 옵션이 노출되지 않을수도 있습니다.' +leading_text_6 = '**반드시 옵션사진과 옵션이름을 확인하시고 구매하시기 바랍니다.**' +leading_text_7 = '---' # 필요한 만큼 추가 가능 [TitleLocators] # 상품명 관련 선택자 -product_name_input_locator = //*[@id='productMainContentContainerId']/div/div[1]/div[5]/div[1]/span/input +product_name_input_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div[5]/div[1]/span/input' product_name_input_css_path = 'div#productMainContentContainerId div:nth-child(5) > div:nth-child(1) > span > input' # 상품명 추천단어 입력칸 선택자 -product_name_suggestion_input_locator = //*[@id="productMainContentContainerId"]/div/div[1]/div[2]/div[2]/div/span/span/span[1]/input +product_name_suggestion_input_locator = '//*[@id="productMainContentContainerId"]/div/div[1]/div[2]/div[2]/div/span/span/span[1]/input' product_name_suggestion_input_css_path = 'div#productMainContentContainerId div:nth-child(2) > div:nth-child(2) > div > span > span > span.ant-input-affix-wrapper.css-1li46mu.ant-input-outlined > input' # 상품명 추천단어 입력 검색 버튼 선택자 -product_name_search_button_locator = //*[@id="productMainContentContainerId"]/div/div[1]/div[2]/div[2]/div/span/span/span[2]/button +product_name_search_button_locator = '//*[@id="productMainContentContainerId"]/div/div[1]/div[2]/div[2]/div/span/span/span[2]/button' product_name_search_button_css_path = 'div#productMainContentContainerId div:nth-child(2) > div:nth-child(2) > div > span > span > span.ant-input-group-addon > button[type="button"]' # 원본 상품명 선택자 -original_product_name_locator = //*[@id="productMainContentContainerId"]/div/div[1]/div[6]/div[1]/div/span +original_product_name_locator = '//*[@id="productMainContentContainerId"]/div/div[1]/div[6]/div[1]/div/span' original_product_name_css_path = 'div#productMainContentContainerId div.sc-aNeao.tNLFa > div.ant-flex.css-1li46mu.ant-flex-align-stretch.ant-flex-vertical > div:nth-child(1) > div > span' # 상품명의 경고단어 삭제 버튼 선택자 -product_name_warning_delete_button_locator = //*[@id="productMainContentContainerId"]/div/div[1]/div[6]/div[3]/div[2]/div/button +product_name_warning_delete_button_locator = '//*[@id="productMainContentContainerId"]/div/div[1]/div[6]/div[3]/div[2]/div/button' product_name_warning_delete_button_css_path = 'div#productMainContentContainerId div:nth-child(2) > div > button[type="button"]' # 카테고리 관련 선택자 -category_suggestion_button_locator = //*[@id='productMainContentContainerId']/div/div[1]/div[5]/div[2]/button +category_suggestion_button_locator = '//*[@id='productMainContentContainerId']/div/div[1]/div[5]/div[2]/button' category_suggestion_button_css_path = 'div#productMainContentContainerId div:nth-child(2) > button[type="button"]' # 카테고리 선택자 - 인증 여부에 따른 분기 -category_main_selector_with_cp = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(1)' -category_main_selector_with_ss = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)' -category_main_selector_with_esm = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(3)' -category_certified_text_locator = div.ant-col.css-1li46mu:nth-child(1) -category_text_with_certification_locator = div.ant-col.css-1li46mu:nth-child(2) -category_text_without_certification_locator = div.ant-col.css-1li46mu:nth-child(1) +category_main_selector_with_cp = 'div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1' +category_main_selector_with_ss = 'div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=2' +category_main_selector_with_esm = 'div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=3' +; category_main_selector_with_cp = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(1)' +; category_main_selector_with_ss = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(2)' +; category_main_selector_with_esm = '#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(3)' +category_text_locator = 'div.ant-col.css-1li46mu:nth-child(1)' +category_text_locator_certified = 'div.ant-col.css-1li46mu:nth-child(2)' +; category_text_without_certification_locator = 'div.ant-col.css-1li46mu:nth-child(1)' [BrowserControl] # 크롬 창 이름 -chrome_window_name = 퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 - Chrome +chrome_window_name = '퍼센티 - 셀러들을 위한 AI 구매대행 솔루션 - Chrome' # 관리자 로그인 관련 선택자 -login_email_locator = input[placeholder="이메일 주소 입력"] -login_password_locator = input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"] -login_button_locator = button:has-text("로그인 하기") +login_email_locator = 'input[placeholder="이메일 주소 입력"]' +login_password_locator = 'input[placeholder="영문/숫자/특수문자의 조합 (6~15자리)"]' +login_button_locator = 'button:has-text("로그인 하기")' # 직원 로그인 관련 선택자 -staff_id_locator = input[placeholder="직원 아이디 입력"] -staff_login_button_locator = button:has-text("직원 로그인 하기") -admin_toggle_locator = button[role="switch"] +staff_id_locator = 'input[placeholder="직원 아이디 입력"]' +staff_login_button_locator = 'button:has-text("직원 로그인 하기")' +admin_toggle_locator = 'button[role="switch"]' # 광고 다이얼로그 관련 선택자 -close_ad_dialog_locator = div.ant-modal-wrap.ant-modal-centered -close_ad_button_locator = div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default +close_ad_dialog_locator = 'div.ant-modal-wrap.ant-modal-centered' +close_ad_button_locator = 'div.ant-modal-footer > div > div > button[type='button'].ant-btn.css-1li46mu.ant-btn-default' # 상품 관련 선택자 -product_name_template_xpath = /html/body/div[1]/div/div/div/div/main/div/div[2]/div[2]/div[3]/div/div/ul/div[{index}]/div/li/div/div/div[2]/div/div/div[1]/div[1]/span[2] +product_name_template_xpath = '/html/body/div[1]/div/div/div/div/main/div/div[2]/div[2]/div[3]/div/div/ul/div[{index}]/div/li/div/div/div[2]/div/div/div[1]/div[1]/span[2]' product_name_template = 'div#root div:nth-child({index}) > div > li > div > div > div:nth-child(2) > div > div > div.ant-col.css-1li46mu > div.sc-ktPPKK.ezbvYT > span.sc-ecPEgm.gmiQgL.Body3Regular14.CharacterPrimary85' product_price_template = 'div#root div:nth-child({index}) > div > li > div > div > div:nth-child(2) > div > div > div.ant-col.css-1li46mu > span.price' product_image_template = 'div#root div:nth-child({index}) > div > li > div > div > div:nth-child(2) > div > img' # 상품 편집 및 페이지 이동 관련 선택자 -product_edit_button = button:has-text("세부사항 수정 및 업로드") -product_edit_button_template = //button[span[text()="세부사항 수정 및 업로드"]] +product_edit_button = 'button:has-text("세부사항 수정 및 업로드")' +product_edit_button_template = '//button[span[text()="세부사항 수정 및 업로드"]]' -next_page_button_template = li.ant-pagination-item[title="{page_number}"] -new_product_page_locator = span.ant-menu-title-content:has-text("신규 상품 등록") -current_page_locator = li.ant-pagination-item.ant-pagination-item-active +next_page_button_template = 'li.ant-pagination-item[title="{page_number}"]' +new_product_page_locator = 'span.ant-menu-title-content:has-text("신규 상품 등록")' +current_page_locator = 'li.ant-pagination-item.ant-pagination-item-active' + +total_product_count_locator = '#root > div > div > div > div > main > div > div.sc-ezreuY.kYrYVh > div.sc-dChVcU.cRrUlt > div.sc-izQBue.dxiUJm > div > div:nth-child(1) > label > span:nth-child(2)' + +# 편집페이지 관련 선택자 +title_tab_locator = 'div.ant-tabs-tab:has-text("상품명 / 카테고리")' +option_tab_locator = 'div.ant-tabs-tab:has-text("옵션")' +price_tab_locator = 'div.ant-tabs-tab:has-text("가격")' +tag_tab_locator = 'div.ant-tabs-tab:has-text("키워드")' +thumb_tab_locator = 'div.ant-tabs-tab:has-text("썸네일")' +detail_tab_locator = 'div.ant-tabs-tab:has-text("상세페이지")' +upload_tab_locator = 'div.ant-tabs-tab:has-text("업로드")' # 상세페이지 소스 관련 선택자 -source_button_locator = button[data-cke-tooltip-text="소스"] -ck_source_editing_area_locator = div.ck-source-editing-area +source_button_locator = 'button[data-cke-tooltip-text="소스"]' +ck_source_editing_area_locator = 'div.ck-source-editing-area' # 옵션 입력 필드 option_input_field_locator = 'div#productMainContentContainerId > div > div > div:nth-child(2) > div:nth-child(2) > div:nth-child(2) > div' +# Save +save_button_locator = 'button:has-text("저장하기")' + [CategoryMargins] categories = 가구, 농기구 diff --git a/locatorManager.py b/locatorManager.py index e561cf68..9adea97c 100644 --- a/locatorManager.py +++ b/locatorManager.py @@ -17,69 +17,76 @@ class LocatorManager: # PriceLocators 섹션 self.selectors['PriceLocators'] = { - 'return_fee_input_locator': self.config.get('PriceLocators', 'return_fee_input_locator'), - 'first_delv_fee_input_locator': self.config.get('PriceLocators', 'first_delv_fee_input_locator'), - 'exchange_fee_input_locator': self.config.get('PriceLocators', 'exchange_fee_input_locator'), - 'plus_margin_locator': self.config.get('PriceLocators', 'plus_margin_locator'), - 'oversea_shipping_locator': self.config.get('PriceLocators', 'oversea_shipping_locator'), - 'option_count_text_locator': self.config.get('PriceLocators', 'option_count_text_locator'), - 'product_cost_locator': self.config.get('PriceLocators', 'product_cost_locator'), - 'standard_selling_price_locator': self.config.get('PriceLocators', 'standard_selling_price_locator') + 'return_fee_input_locator': self.config.get('PriceLocators', 'return_fee_input_locator').strip("'"), + 'first_delv_fee_input_locator': self.config.get('PriceLocators', 'first_delv_fee_input_locator').strip("'"), + 'exchange_fee_input_locator': self.config.get('PriceLocators', 'exchange_fee_input_locator').strip("'"), + 'plus_margin_locator': self.config.get('PriceLocators', 'plus_margin_locator').strip("'"), + 'oversea_shipping_locator': self.config.get('PriceLocators', 'oversea_shipping_locator').strip("'"), + 'option_count_text_locator': self.config.get('PriceLocators', 'option_count_text_locator').strip("'"), + 'product_cost_locator': self.config.get('PriceLocators', 'product_cost_locator').strip("'"), + 'standard_selling_price_locator': self.config.get('PriceLocators', 'standard_selling_price_locator').strip("'"), } # BrowserControl 섹션 self.selectors['BrowserControl'] = { - 'login_email_locator': self.config.get('BrowserControl', 'login_email_locator'), - 'login_password_locator': self.config.get('BrowserControl', 'login_password_locator'), - 'login_button_locator': self.config.get('BrowserControl', 'login_button_locator'), - 'admin_toggle_locator': self.config.get('BrowserControl', 'admin_toggle_locator'), - 'staff_id_locator': self.config.get('BrowserControl', 'staff_id_locator'), - 'staff_login_button_locator': self.config.get('BrowserControl', 'staff_login_button_locator'), - 'close_ad_dialog_locator': self.config.get('BrowserControl', 'close_ad_dialog_locator'), - 'close_ad_button_locator': self.config.get('BrowserControl', 'close_ad_button_locator'), - 'product_name_template': self.config.get('BrowserControl', 'product_name_template'), - 'product_price_template': self.config.get('BrowserControl', 'product_price_template'), - 'product_image_template': self.config.get('BrowserControl', 'product_image_template'), - 'new_product_page_locator': self.config.get('BrowserControl', 'new_product_page_locator'), - 'current_page_locator': self.config.get('BrowserControl', 'current_page_locator'), - 'next_page_button_template': self.config.get('BrowserControl', 'next_page_button_template'), - 'source_button_locator': self.config.get('BrowserControl', 'source_button_locator'), - 'ck_source_editing_area_locator': self.config.get('BrowserControl', 'ck_source_editing_area_locator'), - 'option_input_field_locator': self.config.get('BrowserControl', 'option_input_field_locator') + 'login_email_locator': self.config.get('BrowserControl', 'login_email_locator').strip("'"), + 'login_password_locator': self.config.get('BrowserControl', 'login_password_locator').strip("'"), + 'login_button_locator': self.config.get('BrowserControl', 'login_button_locator').strip("'"), + 'admin_toggle_locator': self.config.get('BrowserControl', 'admin_toggle_locator').strip("'"), + 'staff_id_locator': self.config.get('BrowserControl', 'staff_id_locator').strip("'"), + 'staff_login_button_locator': self.config.get('BrowserControl', 'staff_login_button_locator').strip("'"), + 'close_ad_dialog_locator': self.config.get('BrowserControl', 'close_ad_dialog_locator').strip("'"), + 'close_ad_button_locator': self.config.get('BrowserControl', 'close_ad_button_locator').strip("'"), + 'total_product_count_locator': self.config.get('BrowserControl', 'total_product_count_locator').strip("'"), + 'product_name_template': self.config.get('BrowserControl', 'product_name_template').strip("'"), + 'product_price_template': self.config.get('BrowserControl', 'product_price_template').strip("'"), + 'product_image_template': self.config.get('BrowserControl', 'product_image_template').strip("'"), + 'new_product_page_locator': self.config.get('BrowserControl', 'new_product_page_locator').strip("'"), + 'current_page_locator': self.config.get('BrowserControl', 'current_page_locator').strip("'"), + 'next_page_button_template': self.config.get('BrowserControl', 'next_page_button_template').strip("'"), + 'source_button_locator': self.config.get('BrowserControl', 'source_button_locator').strip("'"), + 'ck_source_editing_area_locator': self.config.get('BrowserControl', 'ck_source_editing_area_locator').strip("'"), + 'title_tab_locator': self.config.get('BrowserControl', 'title_tab_locator').strip("'"), + 'option_tab_locator': self.config.get('BrowserControl', 'option_tab_locator').strip("'"), + 'price_tab_locator': self.config.get('BrowserControl', 'price_tab_locator').strip("'"), + 'tag_tab_locator': self.config.get('BrowserControl', 'tag_tab_locator').strip("'"), + 'thumb_tab_locator': self.config.get('BrowserControl', 'thumb_tab_locator').strip("'"), + 'detail_tab_locator': self.config.get('BrowserControl', 'detail_tab_locator').strip("'"), + 'upload_tab_locator': self.config.get('BrowserControl', 'upload_tab_locator').strip("'"), + 'save_button_locator': self.config.get('BrowserControl', 'save_button_locator').strip("'"), } # OptionLocators 섹션 self.selectors['OptionLocators'] = { - 'option_excluded_selector_template': self.config.get('OptionLocators', 'option_excluded_selector_template'), - 'option_input_selector_template': self.config.get('OptionLocators', 'option_input_selector_template'), - 'single_option_locator': self.config.get('OptionLocators', 'single_option_locator'), - 'option_product_locator': self.config.get('OptionLocators', 'option_product_locator'), - 'total_options_selector': self.config.get('OptionLocators', 'total_options_selector'), - 'original_name_selector_template': self.config.get('OptionLocators', 'original_name_selector_template'), - 'edit_field_selector_template': self.config.get('OptionLocators', 'edit_field_selector_template'), - 'checkbox_selector_template': self.config.get('OptionLocators', 'checkbox_selector_template'), - 'image_selector_template': self.config.get('OptionLocators', 'image_selector_template'), - 'price_selector_template': self.config.get('OptionLocators', 'price_selector_template'), - 'delete_button_selector_template': self.config.get('OptionLocators', 'delete_button_selector_template'), - 'confirm_delete_button_locator': self.config.get('OptionLocators', 'confirm_delete_button_locator'), - 'add_button_selector_template': self.config.get('OptionLocators', 'add_button_selector_template'), - 'file_input_locator': self.config.get('OptionLocators', 'file_input_locator') + 'option_excluded_selector_template': self.config.get('OptionLocators', 'option_excluded_selector_template').strip("'"), + 'option_input_selector_template': self.config.get('OptionLocators', 'option_input_selector_template').strip("'"), + 'single_option_locator': self.config.get('OptionLocators', 'single_option_locator').strip("'"), + 'option_product_locator': self.config.get('OptionLocators', 'option_product_locator').strip("'"), + 'total_options_selector': self.config.get('OptionLocators', 'total_options_selector').strip("'"), + 'original_name_selector_template': self.config.get('OptionLocators', 'original_name_selector_template').strip("'"), + 'edit_field_selector_template': self.config.get('OptionLocators', 'edit_field_selector_template').strip("'"), + 'checkbox_selector_template': self.config.get('OptionLocators', 'checkbox_selector_template').strip("'"), + 'image_selector_template': self.config.get('OptionLocators', 'image_selector_template').strip("'"), + 'price_selector_template': self.config.get('OptionLocators', 'price_selector_template').strip("'"), + 'delete_button_selector_template': self.config.get('OptionLocators', 'delete_button_selector_template').strip("'"), + 'confirm_delete_button_locator': self.config.get('OptionLocators', 'confirm_delete_button_locator').strip("'"), + 'add_button_selector_template': self.config.get('OptionLocators', 'add_button_selector_template').strip("'"), + 'file_input_locator': self.config.get('OptionLocators', 'file_input_locator').strip("'"), } # TitleLocators 섹션 self.selectors['TitleLocators'] = { - 'product_name_input_locator': self.config.get('TitleLocators', 'product_name_input_locator'), - 'product_name_suggestion_input_locator': self.config.get('TitleLocators', 'product_name_suggestion_input_locator'), - 'product_name_search_button_locator': self.config.get('TitleLocators', 'product_name_search_button_locator'), - 'original_product_name_locator': self.config.get('TitleLocators', 'original_product_name_locator'), - 'product_name_warning_delete_button_locator': self.config.get('TitleLocators', 'product_name_warning_delete_button_locator'), - 'category_suggestion_button_locator': self.config.get('TitleLocators', 'category_suggestion_button_locator'), - 'category_main_selector_with_cp': self.config.get('TitleLocators', 'category_main_selector_with_cp'), - 'category_main_selector_with_ss': self.config.get('TitleLocators', 'category_main_selector_with_ss'), - 'category_main_selector_with_esm': self.config.get('TitleLocators', 'category_main_selector_with_esm'), - 'category_certified_text_locator': self.config.get('TitleLocators', 'category_certified_text_locator'), - 'category_text_with_certification_locator': self.config.get('TitleLocators', 'category_text_with_certification_locator'), - 'category_text_without_certification_locator': self.config.get('TitleLocators', 'category_text_without_certification_locator'), + 'product_name_input_locator': self.config.get('TitleLocators', 'product_name_input_locator').strip("'"), + 'product_name_suggestion_input_locator': self.config.get('TitleLocators', 'product_name_suggestion_input_locator').strip("'"), + 'product_name_search_button_locator': self.config.get('TitleLocators', 'product_name_search_button_locator').strip("'"), + 'original_product_name_locator': self.config.get('TitleLocators', 'original_product_name_locator').strip("'"), + 'product_name_warning_delete_button_locator': self.config.get('TitleLocators', 'product_name_warning_delete_button_locator').strip("'"), + 'category_suggestion_button_locator': self.config.get('TitleLocators', 'category_suggestion_button_locator').strip("'"), + 'category_main_selector_with_cp': self.config.get('TitleLocators', 'category_main_selector_with_cp').strip("'"), + 'category_main_selector_with_ss': self.config.get('TitleLocators', 'category_main_selector_with_ss').strip("'"), + 'category_main_selector_with_esm': self.config.get('TitleLocators', 'category_main_selector_with_esm').strip("'"), + 'category_text_locator': self.config.get('TitleLocators', 'category_text_locator').strip("'"), + 'category_text_locator_certified': self.config.get('TitleLocators', 'category_text_locator_certified').strip("'"), } diff --git a/src/cmb_diag.py b/src/cmb_diag.py index 6687d437..f7d51e88 100644 --- a/src/cmb_diag.py +++ b/src/cmb_diag.py @@ -1,7 +1,7 @@ from PySide6.QtWidgets import (QDialog, QFileDialog, QVBoxLayout, QHBoxLayout, QGridLayout, QTreeWidget, QTreeWidgetItem, QLabel, QLineEdit, QPushButton, - QSpinBox, QGroupBox, QFileDialog, QMessageBox, QCheckBox) + QSpinBox, QGroupBox, QFileDialog, QMessageBox, QComboBox) from PySide6.QtCore import Qt -from PySide6.QtGui import QFont +from PySide6.QtGui import QFont, QColor import sqlite3 import shutil import os, re @@ -32,12 +32,12 @@ class CMBSettingsDialog(QDialog): left_layout = QVBoxLayout() mid_layout = QVBoxLayout() - right_layout = QVBoxLayout() + self.right_layout = QVBoxLayout() # 카테고리 검색 및 단계 설정 버튼 - search_layout = QHBoxLayout() - search_layout.addWidget(QLabel("카테고리 검색:")) + search_layout = QGridLayout() + search_layout.addWidget(QLabel("카테고리 검색:"),0,0,1,1) self.search_input = QLineEdit() self.search_input.returnPressed.connect(self.search_category) self.search_btn = QPushButton("검색") @@ -46,23 +46,69 @@ class CMBSettingsDialog(QDialog): self.search_btn.setDefault(False) self.search_btn.clicked.connect(self.search_category) - search_layout.addWidget(self.search_input) - search_layout.addWidget(self.search_btn) + search_layout.addWidget(self.search_input,0,1,1,3) + search_layout.addWidget(self.search_btn,0,2,1,1) self.cmb_view_btn = QPushButton("모두 보기") self.cmb_view_btn.clicked.connect(self.toggle_cmb_view) - search_layout.addWidget(self.cmb_view_btn) + search_layout.addWidget(self.cmb_view_btn,0,3,1,1) + + + # 1레벨, 2레벨, 3레벨 콤보박스와 라벨 설정 + self.level1_combo = QComboBox() + self.level2_combo = QComboBox() + self.level3_combo = QComboBox() + self.reset_combo_btn = QPushButton("콤보리셋") + + # 기본적으로 "모두 보기" 옵션 추가 + self.level1_combo.addItem("모두 보기") + self.level2_combo.addItem("모두 보기") + self.level3_combo.addItem("모두 보기") + + # 레벨 필터링 라벨 추가 + # search_layout.addWidget(QLabel("1레벨:")) + search_layout.addWidget(self.level1_combo,1,1,1,2) + # search_layout.addWidget(QLabel("2레벨:")) + search_layout.addWidget(self.level2_combo,1,2,1,2) + # search_layout.addWidget(QLabel("3레벨:")) + search_layout.addWidget(self.level3_combo,1,3,1,2) + search_layout.addWidget(self.level3_combo,1,3,1,2) + search_layout.addWidget(self.reset_combo_btn,1,4,1,1) + + # 콤보박스의 신호 연결 + self.level1_combo.currentTextChanged.connect(self.update_level2_combo) + self.level1_combo.currentTextChanged.connect(self.filter_category_tree) + self.level2_combo.currentTextChanged.connect(self.update_level3_combo) + self.level2_combo.currentTextChanged.connect(self.filter_category_tree) + self.level3_combo.currentTextChanged.connect(self.filter_category_tree) + + # 콤보박스 리셋 + self.reset_combo_btn.clicked.connect(self.reset_comboboxes) + + # # 카테고리 레벨별 필터링을 위한 콤보박스 + # filter_label = QLabel("카테고리 필터:") + # filter_combo = QComboBox() + # filter_combo.addItem("모두 보기") + # filter_combo.addItem("Level 1") + # filter_combo.addItem("Level 2") + # filter_combo.addItem("Level 3") + # filter_combo.addItem("Level 4") + # filter_combo.currentIndexChanged.connect(self.filter_categories) + # search_layout.addWidget(filter_label,1,0,1,1) + # search_layout.addWidget(filter_combo) + left_layout.addLayout(search_layout, 1) # 카테고리 목록 테이블 self.category_tree = QTreeWidget() - self.category_tree.setHeaderLabels(["Level1", "Level2", "Level3", "Level4", "CMB 단계"]) - self.category_tree.setColumnCount(5) + self.category_tree.setHeaderLabels(["ID", "Level1", "Level2", "Level3", "Level4", "CMB 단계"]) + self.category_tree.setColumnCount(6) self.category_tree.setRootIsDecorated(False) self.category_tree.setAlternatingRowColors(True) self.category_tree.setSortingEnabled(True) # 정렬 기능 활성화 # 정렬 순서 추적 self.sort_order = Qt.AscendingOrder + # 헤더 클릭 시그널 연결 self.category_tree.header().sectionClicked.connect(self.sort_by_column) @@ -83,12 +129,21 @@ class CMBSettingsDialog(QDialog): apply_1_btn = QPushButton("1단계 적용") apply_2_btn = QPushButton("2단계 적용") apply_3_btn = QPushButton("3단계 적용") + remove_cmb_stage_button = QPushButton("선택 CMB 해제") + + self.select_toggle_button = QPushButton("전체 선택") + apply_1_btn.clicked.connect(lambda: self.apply_crmobi_stage(1)) apply_2_btn.clicked.connect(lambda: self.apply_crmobi_stage(2)) apply_3_btn.clicked.connect(lambda: self.apply_crmobi_stage(3)) + remove_cmb_stage_button.clicked.connect(self.remove_cmb_stage) + self.select_toggle_button.clicked.connect(self.toggle_select_all_filtered_items) + mid_layout.addWidget(apply_1_btn) mid_layout.addWidget(apply_2_btn) mid_layout.addWidget(apply_3_btn) + mid_layout.addWidget(remove_cmb_stage_button) + mid_layout.addWidget(self.select_toggle_button) # 닫기 버튼 close_btn = QPushButton("닫기") @@ -105,8 +160,14 @@ class CMBSettingsDialog(QDialog): # CMB 단계 설정 그룹 추가 self.cmb_settings_group = QGroupBox("CMB 단계 설정") + cmb_settings_layout = QVBoxLayout() + # CMB 단계를 설정 후 저장하는 버튼 + save_cmb_stage_button = QPushButton("CMB 단계 저장") + save_cmb_stage_button.clicked.connect(self.save_cmb_stage_to_db) + cmb_settings_layout.addWidget(save_cmb_stage_button) + # 각 단계별 설정 self.stage_widgets = [] for i in range(1, 4): @@ -154,12 +215,12 @@ class CMBSettingsDialog(QDialog): cost_spin.setSingleStep(1000) # QGroupBox 레이아웃 구성 - stage_group_box_layout.addWidget(min_amount_spin,0,0) - stage_group_box_layout.addWidget(min_amount_label,0,1) - stage_group_box_layout.addWidget(unit_amount_spin,1,0) - stage_group_box_layout.addWidget(unit_amount_label,1,1) - stage_group_box_layout.addWidget(cost_spin,2,0) - stage_group_box_layout.addWidget(cost_label,2,1) + stage_group_box_layout.addWidget(min_amount_spin,0,0,1,2) + stage_group_box_layout.addWidget(min_amount_label,1,1) + stage_group_box_layout.addWidget(unit_amount_spin,2,0,1,2) + stage_group_box_layout.addWidget(unit_amount_label,3,1) + stage_group_box_layout.addWidget(cost_spin,4,0,1,2) + stage_group_box_layout.addWidget(cost_label,5,1) stage_group_box.setLayout(stage_group_box_layout) # 전체 레이아웃에 QGroupBox 추가 @@ -169,13 +230,144 @@ class CMBSettingsDialog(QDialog): self.stage_widgets.append((min_amount_spin, unit_amount_spin, cost_spin)) self.cmb_settings_group.setLayout(cmb_settings_layout) - right_layout.addWidget(self.cmb_settings_group) - main_layout.addLayout(right_layout,2) + self.right_layout.addWidget(self.cmb_settings_group) + main_layout.addLayout(self.right_layout,3) self.setLayout(main_layout) # DB 읽어와서 테이블에 표시 self.load_db_to_table() + self.set_column_widths() + self.update_cmb_settings_from_db() + self.load_level1_categories() + + def load_level1_categories(self): + """1레벨 카테고리를 DB에서 로드하여 콤보박스에 추가""" + query = "SELECT DISTINCT category1 FROM categories WHERE category1 IS NOT NULL" + self.cursor.execute(query) + rows = self.cursor.fetchall() + + for row in rows: + self.level1_combo.addItem(row[0]) + + def update_level2_combo(self): + """1레벨 선택 시, 2레벨 콤보박스를 업데이트""" + selected_level1 = self.level1_combo.currentText() + self.level2_combo.clear() + self.level2_combo.addItem("모두 보기") + + if selected_level1 == "모두 보기": + return + + query = "SELECT DISTINCT category2 FROM categories WHERE category1 = ? AND category2 IS NOT NULL" + self.cursor.execute(query, (selected_level1,)) + rows = self.cursor.fetchall() + + for row in rows: + self.level2_combo.addItem(row[0]) + + def update_level3_combo(self): + """2레벨 선택 시, 3레벨 콤보박스를 업데이트""" + selected_level1 = self.level1_combo.currentText() + selected_level2 = self.level2_combo.currentText() + self.level3_combo.clear() + self.level3_combo.addItem("모두 보기") + + if selected_level2 == "모두 보기": + return + + query = "SELECT DISTINCT category3 FROM categories WHERE category1 = ? AND category2 = ? AND category3 IS NOT NULL" + self.cursor.execute(query, (selected_level1, selected_level2)) + rows = self.cursor.fetchall() + + for row in rows: + self.level3_combo.addItem(row[0]) + + def reset_comboboxes(self): + """1레벨, 2레벨, 3레벨 콤보박스를 초기화하고 QTreeWidget을 전체 항목으로 필터링합니다.""" + # 각 레벨 콤보박스 초기화 + self.level1_combo.setCurrentIndex(0) + self.level2_combo.clear() + self.level3_combo.clear() + + # QTreeWidget 필터링 초기화 (모든 항목 표시) + self.load_db_to_table() # 이 메서드는 전체 데이터를 다시 로드하는 메서드입니다. + + def filter_category_tree(self): + """선택된 1레벨, 2레벨, 3레벨 카테고리를 기준으로 트리뷰를 필터링""" + selected_level1 = self.level1_combo.currentText() + selected_level2 = self.level2_combo.currentText() + selected_level3 = self.level3_combo.currentText() + + # 기본 쿼리와 조건을 설정 + query = '''SELECT id, category1, category2, category3, category4, crmobi_stage FROM categories WHERE 1=1''' + args = [] + + # 선택된 값에 따라 필터 추가 + if selected_level1 != "모두 보기": + query += " AND category1 = ?" + args.append(selected_level1) + if selected_level2 != "모두 보기": + query += " AND category2 = ?" + args.append(selected_level2) + if selected_level3 != "모두 보기": + query += " AND category3 = ?" + args.append(selected_level3) + + self.cursor.execute(query, args) + rows = self.cursor.fetchall() + + # 트리뷰에 표시 + self.category_tree.clear() + for row_data in rows: + row_id, category1, category2, category3, category4, crmobi_stage = row_data + formatted_id = str(row_id).zfill(4) + top_item = QTreeWidgetItem([ + formatted_id, + category1 or "", category2 or "", + category3 or "", category4 or "", + f"{crmobi_stage}" if crmobi_stage > 0 else "미적용" + ]) + top_item.setCheckState(0, Qt.Unchecked) + + # 단계별 배경색 설정 QColor(R,G,B,A) + if crmobi_stage == 1: + color = QColor(152, 251, 152, 204) # 옐로우그린 + elif crmobi_stage == 2: + color = QColor(135, 206, 235, 204) # 스카이블루 + elif crmobi_stage == 3: + color = QColor(255, 192, 203, 204) # 라이트핑크 + else: + color = None + + # 행 전체에 배경색 적용 + if color: + for col in range(6): # 열의 개수에 따라 반복 + top_item.setBackground(col, color) + + self.category_tree.addTopLevelItem(top_item) + + + def update_cmb_settings_from_db(self): + """DB의 crmobi_stages 테이블에서 값을 읽어와 각 단계별 설정 위젯에 반영합니다.""" + try: + # CrMoBi 단계 설정을 crmobi_stages 테이블에서 가져옴 + self.cursor.execute("SELECT stage, threshold, increment_unit, extra_cost FROM crmobi_stages") + stages = self.cursor.fetchall() + + # 각 단계별 설정 값을 위젯에 적용 + for stage in stages: + stage_index = stage[0] - 1 # 단계가 1부터 시작하므로 인덱스를 맞추기 위해 -1 + min_amount, unit_amount, extra_cost = stage[1], stage[2], stage[3] + + # 위젯 리스트에서 해당 단계를 찾아서 설정 + self.stage_widgets[stage_index][0].setValue(min_amount) + self.stage_widgets[stage_index][1].setValue(unit_amount) + self.stage_widgets[stage_index][2].setValue(extra_cost) + + self.logger.debug("CrMoBi 단계 설정이 위젯에 반영되었습니다.") + except Exception as e: + self.logger.error(f"CrMoBi 단계 설정을 위젯에 반영하는 중 오류 발생: {e}", exc_info=True) def create_tables(self): """초기 DB를 생성하고 CrMoBi 단계 테이블도 추가합니다.""" @@ -191,6 +383,7 @@ class CMBSettingsDialog(QDialog): # 테이블 생성 cursor.execute(''' CREATE TABLE IF NOT EXISTS categories ( + id INTEGER PRIMARY KEY AUTOINCREMENT, category1 TEXT, category2 TEXT, category3 TEXT, @@ -237,6 +430,9 @@ class CMBSettingsDialog(QDialog): ''') # 초기 데이터 설정 (원하는 경우) + cursor.execute('DELETE FROM crmobi_stages') + conn.commit() + for i in range(1, 4): cursor.execute(''' INSERT INTO crmobi_stages (stage, threshold, increment_unit, extra_cost) @@ -254,7 +450,7 @@ class CMBSettingsDialog(QDialog): self.category_tree.clear() # 기본 쿼리와 조건을 설정 - query = '''SELECT category1, category2, category3, category4, crmobi_stage FROM categories WHERE 1=1''' + query = '''SELECT id, category1, category2, category3, category4, crmobi_stage FROM categories WHERE 1=1''' args = [] # 검색어가 있을 경우 WHERE 조건 추가 @@ -269,65 +465,152 @@ class CMBSettingsDialog(QDialog): self.cursor.execute(query, args) rows = self.cursor.fetchall() - - for row_data in rows: - top_item = QTreeWidgetItem([str(data) if data else "" for data in row_data[:4]]) - crmobi_stage = row_data[4] - top_item.setCheckState(0, Qt.Unchecked) - top_item.setText(4, f"{crmobi_stage}" if crmobi_stage > 0 else "미적용") - # 단계별 배경색 설정 + # id 기준 오름차순 정렬을 위해 정렬 + rows = sorted(rows, key=lambda x: int(x[0])) # x[0]는 id 열 + + for row_data in rows: + row_id, category1, category2, category3, category4, crmobi_stage = row_data + formatted_id = str(row_id).zfill(4) + top_item = QTreeWidgetItem([formatted_id, category1 or "", category2 or "", category3 or "", category4 or "", f"{crmobi_stage}" if crmobi_stage > 0 else "미적용"]) + top_item.setCheckState(0, Qt.Unchecked) + + # id 값을 정수로 설정하여 정렬 시 정수 기준으로 처리되도록 함 + top_item.setData(0, Qt.UserRole, int(row_id)) + + # 단계별 배경색 설정 QColor(R,G,B,A) if crmobi_stage == 1: - top_item.setBackground(4, Qt.yellow) + color = QColor(152, 251, 152, 204) # 옐로우그린 elif crmobi_stage == 2: - top_item.setBackground(4, Qt.green) + color = QColor(135, 206, 235, 204) # 스카이블루 elif crmobi_stage == 3: - top_item.setBackground(4, Qt.red) - + color = QColor(255, 192, 203, 204) # 라이트핑크 + else: + color = None + + # 행 전체에 배경색 적용 + if color: + for col in range(6): # 열의 개수에 따라 반복 + top_item.setBackground(col, color) + self.category_tree.addTopLevelItem(top_item) + # 초기 정렬 기준을 id 열로 설정하고 오름차순 정렬 + self.category_tree.setSortingEnabled(True) + self.category_tree.sortByColumn(0, Qt.AscendingOrder) # ID 열을 기준으로 오름차순 정렬 + + def set_column_widths(self): + """ID 열 너비를 일정하게 설정""" + current_id_width = self.category_tree.columnWidth(0) + self.category_tree.setColumnWidth(0, int(current_id_width / 1.5)) # ID 열을 초기 설정 크기로 유지 + + def sort_by_column(self, index): """클릭된 열을 기준으로 오름차순/내림차순으로 정렬""" - self.category_tree.sortByColumn(index, self.sort_order) - + # 정렬 역할을 UserRole로 설정하여 ID 필드가 정수로 정렬되도록 설정 + self.category_tree.setSortingEnabled(False) # 정렬을 일시적으로 비활성화 + self.category_tree.sortItems(index, self.sort_order) + self.category_tree.setSortingEnabled(True) # 정렬을 다시 활성화 + # 정렬 순서를 토글 self.sort_order = Qt.DescendingOrder if self.sort_order == Qt.AscendingOrder else Qt.AscendingOrder def apply_crmobi_stage(self, stage): - """선택된 카테고리에 CrMoBi 단계를 적용합니다.""" + """선택된 카테고리에 CrMoBi 단계를 적용하고 DB에 저장.""" for i in range(self.category_tree.topLevelItemCount()): item = self.category_tree.topLevelItem(i) if item.checkState(0) == Qt.Checked: - category_values = [item.text(j) for j in range(4)] - + category_values = [item.text(j) for j in range(1, 5)] # ID 열 제외 # DB 업데이트 self.cursor.execute('''UPDATE categories - SET crmobi_stage = ? - WHERE category1 = ? AND category2 = ? AND category3 = ? AND category4 = ?''', + SET crmobi_stage = ? + WHERE category1 = ? AND category2 = ? AND category3 = ? AND category4 = ?''', [stage] + category_values) - - # 트리뷰 업데이트 - item.setText(4, str(stage)) - if stage == 1: - item.setBackground(4, Qt.yellow) - elif stage == 2: - item.setBackground(4, Qt.green) - elif stage == 3: - item.setBackground(4, Qt.red) self.conn.commit() # 변경사항 저장 self.load_db_to_table() # 트리 새로고침 - - def toggle_cmb_settings(self, checked): - """CMB 단계 설정 영역 표시/숨기기""" - self.cmb_settings_group.setVisible(checked) + + def remove_cmb_stage(self): + """선택된 카테고리의 CMB 단계를 해제하고 DB에 반영.""" + for i in range(self.category_tree.topLevelItemCount()): + item = self.category_tree.topLevelItem(i) + if item.checkState(0) == Qt.Checked: + category_id = int(item.text(0)) # ID 열에서 값 가져오기 + # DB에서 CMB 단계를 해제 + self.cursor.execute("UPDATE categories SET crmobi_stage = 0 WHERE id = ?", (category_id,)) + self.conn.commit() + self.load_db_to_table() # 트리 새로고침 + + def toggle_cmb_settings(self, checked): + """CMB 단계 설정 영역 표시/숨기기, 공간을 완전히 제거 또는 복원합니다.""" sender = self.sender() + if checked: + # 공간에 cmb_settings_group 추가 + self.right_layout.addWidget(self.cmb_settings_group) + self.cmb_settings_group.show() sender.setText("CMB 단계 설정 ▼") else: + # cmb_settings_group 숨기기 및 제거 + self.cmb_settings_group.hide() + self.right_layout.removeWidget(self.cmb_settings_group) sender.setText("CMB 단계 설정 ▶") - + + # 레이아웃을 다시 갱신하여 공간을 완전히 반영 + self.layout().update() + def toggle_select_all_filtered_items(self): + """버튼의 텍스트에 따라 전체 선택 또는 전체 해제를 수행합니다.""" + if self.select_toggle_button.text() == "전체 선택": + # 전체 체크 + for i in range(self.category_tree.topLevelItemCount()): + item = self.category_tree.topLevelItem(i) + item.setCheckState(0, Qt.Checked) + # 버튼 텍스트를 "전체 해제"로 변경 + self.select_toggle_button.setText("전체 해제") + else: + # 전체 체크 해제 + for i in range(self.category_tree.topLevelItemCount()): + item = self.category_tree.topLevelItem(i) + item.setCheckState(0, Qt.Unchecked) + # 버튼 텍스트를 "전체 선택"으로 변경 + self.select_toggle_button.setText("전체 선택") + + def save_cmb_stage_to_db(self): + """사용자가 설정한 CMB 단계를 crmobi_stage 테이블에 저장합니다.""" + try: + # 각 CMB 단계의 설정을 불러옵니다 + for i, (min_amount_spin, unit_amount_spin, cost_spin) in enumerate(self.stage_widgets, start=1): + stage = i + threshold = min_amount_spin.value() + increment_unit = unit_amount_spin.value() + extra_cost = cost_spin.value() + + # 기존 데이터가 있는지 확인 + self.cursor.execute("SELECT COUNT(1) FROM crmobi_stages WHERE stage = ?", (stage,)) + exists = self.cursor.fetchone()[0] + + # 데이터를 업데이트 또는 삽입 + if exists: + self.cursor.execute(''' + UPDATE crmobi_stages + SET threshold = ?, increment_unit = ?, extra_cost = ? + WHERE stage = ? + ''', (threshold, increment_unit, extra_cost, stage)) + else: + self.cursor.execute(''' + INSERT INTO crmobi_stages (stage, threshold, increment_unit, extra_cost) + VALUES (?, ?, ?, ?) + ''', (stage, threshold, increment_unit, extra_cost)) + + # 변경사항 저장 + self.conn.commit() + QMessageBox.information(self, "저장 성공", "CMB 단계 설정이 성공적으로 저장되었습니다.") + + except Exception as e: + QMessageBox.critical(self, "저장 오류", f"저장 중 오류가 발생했습니다: {e}") + self.logger.error(f"CMB 단계 저장 중 오류: {e}", exc_info=True) + def reset_db(self): """사용자 DB를 삭제하고 초기 DB를 로드합니다.""" if os.path.exists(self.user_db_path): @@ -386,7 +669,7 @@ class CMBSettingsDialog(QDialog): if search_text: # 검색어가 있는 경우 필터링하여 로드 query = ''' - SELECT category1, category2, category3, category4, crmobi_stage + SELECT id, category1, category2, category3, category4, crmobi_stage FROM categories WHERE category1 LIKE ? OR category2 LIKE ? OR category3 LIKE ? OR category4 LIKE ? ''' @@ -395,7 +678,7 @@ class CMBSettingsDialog(QDialog): else: # 검색어가 없는 경우 전체 로드 query = ''' - SELECT category1, category2, category3, category4, crmobi_stage + SELECT id, category1, category2, category3, category4, crmobi_stage FROM categories ''' self.cursor.execute(query) @@ -405,18 +688,29 @@ class CMBSettingsDialog(QDialog): rows = self.cursor.fetchall() for row_data in rows: - top_item = QTreeWidgetItem([str(data) if data else "" for data in row_data[:4]]) - crmobi_stage = row_data[4] - top_item.setCheckState(0, Qt.Unchecked) - top_item.setText(4, f"{crmobi_stage}" if crmobi_stage > 0 else "미적용") + # top_item = QTreeWidgetItem([str(data) if data else "" for data in row_data[:4]]) + row_id, category1, category2, category3, category4, crmobi_stage = row_data + formatted_id = str(row_id).zfill(4) + top_item = QTreeWidgetItem([formatted_id, category1 or "", category2 or "", category3 or "", category4 or "", f"{crmobi_stage}" if crmobi_stage > 0 else "미적용"]) - # 단계별 배경색 설정 + crmobi_stage = row_data[5] + top_item.setCheckState(0, Qt.Unchecked) + top_item.setText(5, f"{crmobi_stage}" if crmobi_stage > 0 else "미적용") + + # 단계별 배경색 설정 QColor(R,G,B,A) if crmobi_stage == 1: - top_item.setBackground(4, Qt.yellow) + color = QColor(152, 251, 152, 204) # 옐로우그린 elif crmobi_stage == 2: - top_item.setBackground(4, Qt.green) + color = QColor(135, 206, 235, 204) # 스카이블루 elif crmobi_stage == 3: - top_item.setBackground(4, Qt.red) + color = QColor(255, 192, 203, 204) # 라이트핑크 + else: + color = None + + # 행 전체에 배경색 적용 + if color: + for col in range(6): # 열의 개수에 따라 반복 + top_item.setBackground(col, color) self.category_tree.addTopLevelItem(top_item) @@ -489,7 +783,7 @@ class CustomSpinBox(QSpinBox): # 폰트 설정 font = QFont() - font.setPointSize(12) # 폰트 크기 설정 + font.setPointSize(10) # 폰트 크기 설정 font.setBold(True) # 폰트 굵게 설정 self.setFont(font) diff --git a/src/cmb_settings.db b/src/cmb_settings.db deleted file mode 100644 index 957537ca..00000000 Binary files a/src/cmb_settings.db and /dev/null differ diff --git a/src/initialDB.db b/src/initialDB.db index 957537ca..2540833d 100644 Binary files a/src/initialDB.db and b/src/initialDB.db differ diff --git a/src/userDB.db b/src/userDB.db index 5ebb74c3..5fb9a19e 100644 Binary files a/src/userDB.db and b/src/userDB.db differ diff --git a/src/퍼센티 다양한 카테고리 엑셀 수집(스스 기준).xlsx b/src/퍼센티 다양한 카테고리 엑셀 수집(스스 기준).xlsx index 28e03973..baf31d03 100644 Binary files a/src/퍼센티 다양한 카테고리 엑셀 수집(스스 기준).xlsx and b/src/퍼센티 다양한 카테고리 엑셀 수집(스스 기준).xlsx differ diff --git a/test/ele_test.py b/test/ele_test.py index e51309ce..44ba1398 100644 --- a/test/ele_test.py +++ b/test/ele_test.py @@ -11,7 +11,8 @@ class CategoryHandler: async def handle_category_action(self): # #productMainContentContainerId 내부에서 클래스 이름 "ant-select ant-select-outlined css-1li46mu ant-select-single ant-select-show-arrow"를 포함한 요소 중 두 번째 요소 찾기 print("[DEBUG] handle_category_action: Locating category container element...") - category_locator = "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=1" + # category_locator = "div#productMainContentContainerId div.ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow >> nth=0" + category_locator = "#productMainContentContainerId .ant-select.ant-select-outlined.css-1li46mu.ant-select-single.ant-select-show-arrow:nth-of-type(1)" try: await self.page.wait_for_selector(category_locator, timeout=5000) diff --git a/title.py b/title.py index cd638ba7..6b7ec6e3 100644 --- a/title.py +++ b/title.py @@ -23,7 +23,6 @@ class TitleHandler: self.category_main_selector_with_cp = self.locator_manager.get_locator('TitleLocators', 'category_main_selector_with_cp') self.category_main_selector_with_ss = self.locator_manager.get_locator('TitleLocators', 'category_main_selector_with_ss') self.category_main_selector_with_esm = self.locator_manager.get_locator('TitleLocators', 'category_main_selector_with_esm') - self.certified_text_locator = self.locator_manager.get_locator('TitleLocators', 'certified_text_locator') self.category_text_locator = self.locator_manager.get_locator('TitleLocators', 'category_text_locator') self.category_text_locator_certified = self.locator_manager.get_locator('TitleLocators', 'category_text_locator_certified') @@ -128,7 +127,7 @@ class TitleHandler: except Exception as e: self.logger.error(f"카테고리 추천받기 버튼 클릭 중 오류 발생: {e}", exc_info=True) - async def get_category(self, market='ss') -> str: + async def get_category_ori(self, market='ss') -> str: """ 카테고리를 가져오는 메서드로 인증 필요 여부에 따라 카테고리 선택자를 다르게 처리합니다. @@ -138,27 +137,27 @@ class TitleHandler: try: self.logger.debug(f"마켓 : {market} - 카테고리 텍스트를 가져오는 중입니다.") if market == 'ss': - main_category_element = await self.page.query_selector(self.category_main_selector_with_ss) + main_category_element = self.page.locator(self.category_main_selector_with_ss) self.logger.debug(f"선택 마켓 : 스마트스토어 , selector : {self.category_main_selector_with_ss}, element : {main_category_element}") elif market == 'cp': - main_category_element = await self.page.query_selector(self.category_main_selector_with_cp) + main_category_element = self.page.locator(self.category_main_selector_with_cp) self.logger.debug(f"선택 마켓 : 쿠팡 , selector : {self.category_main_selector_with_cp}, element : {main_category_element}") elif market == 'esm': - main_category_element = await self.page.query_selector(self.category_main_selector_with_esm) + main_category_element = self.page.locator(self.category_main_selector_with_esm) self.logger.debug(f"선택 마켓 : ESM , selector : {self.category_main_selector_with_esm}, element : {main_category_element}") if not main_category_element: self.logger.error("카테고리 메인 선택자를 찾을 수 없습니다.") return "" - certified_text_element = await main_category_element.query_selector(self.certified_text_locator) + certified_text_element = main_category_element.locator(self.certified_text_locator) if certified_text_element: - certified_text = await certified_text_element.inner_text() + certified_text = certified_text_element.inner_text() if "인증" in certified_text: - category_text_element = await main_category_element.query_selector(self.category_text_locator_certified) + category_text_element = main_category_element.locator(self.category_text_locator_certified) self.logger.debug(f"카테고리 인증 필요 발생: {category_text}") else: category_text_element = certified_text_element - category_text = await category_text_element.inner_text() if category_text_element else "" + category_text = category_text_element.inner_text() if category_text_element else "" self.logger.debug(f"카테고리 텍스트: {category_text}") return category_text else: @@ -166,4 +165,60 @@ class TitleHandler: return "" except Exception as e: self.logger.error(f"카테고리 텍스트 가져오기 중 오류 발생: {e}", exc_info=True) - return "" \ No newline at end of file + return "" + + + async def get_category(self, market='ss') -> str: + """ + 카테고리를 가져오는 메서드로 인증 필요 여부에 따라 카테고리 선택자를 다르게 처리합니다. + + Returns: + str: 카테고리 텍스트 + """ + try: + self.logger.debug(f"마켓 : {market} - 카테고리 텍스트를 가져오는 중입니다.") + + if market == 'ss': + category_locator = self.category_main_selector_with_ss + elif market == 'cp': + category_locator = self.category_main_selector_with_cp + elif market == 'esm': + category_locator = self.category_main_selector_with_esm + + self.logger.debug(f"category_locator : {category_locator}") + + await self.page.wait_for_selector(category_locator, timeout=5000, state="attached") # 요소가 나타날 때까지 대기 + main_category_element = self.page.locator(category_locator) # 대기 후 동기적으로 요소 가져오기 + self.logger.debug(f"main_category_element : {main_category_element}") + + if not await main_category_element.count(): + self.logger.error("카테고리 메인 선택자를 찾을 수 없습니다.") + return "" + + # 인증 텍스트 요소 선택 + category_text_element = main_category_element.locator(self.category_text_locator) + + self.logger.debug(f"category_text_element : {category_text_element}") + + if await category_text_element.count(): + category_text = await category_text_element.inner_text() + + if "인증" in category_text: + self.logger.debug(f"카테고리 인증 필요 발생 category_text = {category_text}") + category_text_certified_element = main_category_element.locator(self.category_text_locator_certified) + + if await category_text_certified_element.count(): + category_text = await category_text_certified_element.inner_text() + self.logger.debug(f"인증 필요 카테고리 text = {category_text}") + else: + self.logger.debug(f"카테고리 text = {category_text}") + + return category_text + + else: + self.logger.error("카테고리 인증 요소를 찾을 수 없습니다.") + return "" + + except Exception as e: + self.logger.error(f"카테고리 텍스트 가져오기 중 오류 발생: {e}", exc_info=True) + return ""