[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[{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(., '옵션 상품등록')] 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' checkbox_selector_template = '#productMainContentContainerId li:nth-child({i}) input[type="checkbox"]' image_selector_template = '#productMainContentContainerId li:nth-child({i}) img.sc-gbvfcU.ezktkd' 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"] [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 = "### 마켓정책으로 인해 모든 옵션이 노출되지 않을수도 있습니다." 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_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 = '#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) [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 # 상세페이지 소스 관련 선택자 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' [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