[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' 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[{index}]/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[{index}]/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[{index}]/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[{index}]/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' ; is_all_option_checked_selector = '#productMainContentContainerId .ant-checkbox-indeterminate' is_all_option_checked_selector = '//*[@id="productMainContentContainerId"]/div[1]/div[2]/div/div/div[2]/div/div[1]/div/div/div[2]/div/div/div[4]/div[2]/div[1]/label/span[1]/input' ai_option_btn_selector = 'div#productMainContentContainerId div:nth-child(2) > div > div > div.ant-row.ant-row-middle.css-1li46mu > div:nth-child(4) > button[type=\"button\"]' original_name_selector_template = 'div#productMainContentContainerId li:nth-child({index}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span' edit_field_selector_template = 'div#productMainContentContainerId li:nth-child({index}) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input' checkbox_selector_template = '#productMainContentContainerId li:nth-child({index}) input[type="checkbox"]' image_selector_template = '#productMainContentContainerId li:nth-child({index}) img.sc-gbvfcU.ezktkd' price_selector_template = '#productMainContentContainerId li:nth-child({index}) 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({index}) > 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({index}) > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img' file_input_locator = 'input[type="file"]' low_order_button_locator = 'button:has-text("가격 낮은 순")' AtoZ_button_locator = 'button:has-text("A-Z")' [DetailLocators] 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 = '---' # 필요한 만큼 추가 가능 [TitleLocators] # 상품명 관련 선택자 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_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_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_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_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_css_path = 'div#productMainContentContainerId div:nth-child(2) > button[type="button"]' # 카테고리 선택자 - 인증 여부에 따른 분기 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' # 관리자 로그인 관련 선택자 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"]' # 광고 다이얼로그 관련 선택자 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 = '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()="세부사항 수정 및 업로드"]]' 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' # 옵션 입력 필드 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 = 가구, 농기구 [가구] threshold_1 = 100000 # 10만원 extra_margin_1 = 10000 # 2만원 초과마다 1만원 추가 unit_1 = 20000 threshold_2 = 200000 # 20만원 extra_margin_2 = 15000 # 2만원 초과마다 1.5만원 추가 unit_2 = 20000 [농기구] threshold_1 = 100000 # 10만원 extra_margin_1 = 5000 # 2만원 초과마다 0.5만원 추가 unit_1 = 20000 threshold_2 = 200000 # 20만원 extra_margin_2 = 10000 # 2만원 초과마다 1만원 추가 unit_2 = 20000