[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' product_cost_for_single_locator = '//*[@id="productMainContentContainerId"]/div/div[2]/div/div/div[2]/div[1]/div/div/div/div/div[2]/table/tbody/tr[2]/td[2]/div/div/div/div[2]/input' standard_selling_price_for_single_locator = '//*[@id="productMainContentContainerId"]/div/div[2]/div/div/div[2]/div[1]/div/div/div/div/div[2]/table/tbody/tr[2]/td[3]/div/div/div[1]/div/div[2]/input' ordering_by_name_locator = 'button:has-text("이름순 정렬")' ordering_by_option_locator = 'button:has-text("옵션탭 순서 정렬")' [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\"]' ai_option_btn_selector = 'button:has-text("AI 옵션명 다듬기")' 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' image_selector_template = 'div#productMainContentContainerId li:nth-child({index}) > div > div:nth-child(1) > div > div:nth-child(2) > div > img' ; price_selector_template = '#productMainContentContainerId li:nth-child({index}) sup' price_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[1]/div[2]/button/span/sup' # 옵션 상자 ; option_box_selector = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc' ; option_box_selector = '//*[@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' option_box_selector = 'div#productMainContentContainerId li > div > div:nth-child(1) > div > div:nth-child(2) > div' ; excluded_option_marker = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc:nth-child({index}) > .sc-dfauwV.bXsMpn' excluded_option_marker = '.bXsMpn.sc-dfauwV' ; delete_button_selector = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc:nth-child({index}) span:has-text("삭제")' ; delete_button_selector = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc:nth-child({index}) div.sc-igZIGL.kQDmyq' ; delete_button_selector = '.kQDmyq.sc-igZIGL' ; delete_button_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[2]/div[1]/div/span' delete_button_selector_template = 'div#productMainContentContainerId 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 > span' fallback1_delete_button_selector_template = 'div#productMainContentContainerId 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 > span' delete_dialog_selector = 'div.sc-ddjGPC.jbwEYW' confirm_delete_button_selector = 'button.ant-btn-primary.ant-btn-dangerous:has-text('삭제')' ; confirm_delete_button_selector = '.ant-modal.css-1li46mu.ant-modal-confirm.ant-modal-confirm-confirm button:has-text("삭제")' ; confirm_delete_button_selector = 'xpath=/html/body/div[8]/div/div[2]/div/div[2]/div/div/div/div[2]/button[2]' add_button_selector2 = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc:nth-child({index}) > .sc-dRGYJT.hmQUGb' add_button_selector = 'div#productMainContentContainerId li:nth-child({index}) > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img' ; add_button_selector = 'div.hmQUGb.sc-dRGYJT' ; add_button_selector = 'div#productMainContentContainerId div.lesrZh.sc-bYHUQc:nth-child({index}) > .sc-krITIZ.ckztYT' ; file_upload_button_selector = '.ant-modal-content button:has-text("클릭 or 드레그로 파일 업로드")' file_upload_button_selector = 'span.ant-upload-btn input[type="file"]' ; confirm_upload_button_selector = '.ant-modal-content button:has-text("이미지 삽입")' confirm_upload_button_selector = 'button.ant-btn-primary span:text('이미지 삽입')' low_order_button_locator = 'button:has-text("가격 낮은 순")' AtoZ_button_locator = 'button:has-text("A-Z")' one_to_nine_button_locator = 'button:has-text("1-99")' [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_dialog_locator = 'div[role="dialog"]' 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_list_locator = 'div#root div.jrsOcn.sc-jBeBSR' product_parent_locator = 'div#root .sc-iEXKAA.fmZMIG' product_name_inner_locator = 'div#root .sc-ktPPKK.ezbvYT:nth-child(1) span' product_price_inner_locator = 'div#root .sc-ktPPKK.ezbvYT:nth-child(5) span' product_image_inner_locator = 'div#root .sc-kzqdkY.hSRRnW' product_name_for_ed_template = '//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div/div/div/div[2]/table/tbody/tr[{index}]/td[2]/div/div/div/div[2]/div[2]/span' product_price_for_ed_template = '//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div/div/div/div[2]/table/tbody/tr[{index}]/td[2]/div/div/div/div[2]/div[2]/div[1]/div[2]/span[2]' product_image_for_ed_template = '//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div/div/div/div[2]/table/tbody/tr[{index}]/td[2]/div/div/div/div[1]/span/div/div[1]/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("신규 상품 등록")' registered_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)' total_product_count_locator = '//*[@id="root"]/div/div/div/div/main/div/div[2]/div[2]/div[2]/div/div[1]/label/span[2]' total_product_count_for_registed_locator = '//*[@id="root"]/div/div/div/div/main/div/div[2]/div[3]/div[2]/div/div/div/div/div[1]/table/thead/tr/th[2]/div/span' ; total_product_count_for_registed_locator = 'div#root 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("저장하기")'