AutoPercenty3/옵션요소.txt

264 lines
22 KiB
Plaintext

이미지 번역 외 추가기능을 구현하려 해.
아래 추가정보를 참고해서만들어줘.
1. 단일옵션인지 아닌지를 먼저 판단해.
2. 단일옵션이 아닐경우 전체옵션체크박스의 상태를 확인해.
전체옵션 체크박스가 일부만 체크되어 있다면 해당상품은 옵션수정이 완료된 상품이기 때문에 옵션수정을 pass해야해.
3. 가격 낮은 순 정렬버튼을 1회 클릭
4. 단일 옵션이 아니면서, 전체 옵션체크박스가 전체체크가 되어 있다면 아래의 정보들을 참고해서 옵션정보를 수집해서 옵션 info 딕셔너리를 만들어.
총 옵션갯수, 각 옵션의 원본옵션명, 각옵션의 가격범위, 옵션이미지 존재 여부 등
5.수집된 옵션명을 vertexAI객체의 translate_options 메서드를 이용해 번역된 옵션값을 딕셔너리로 리턴받아와서 옵션info에 업데이트 해줘.
6. 번역된 옵션명을 각각의 옵션명 편집칸에 입력해줘.
7. 옵션이 3개 이상이면 가장 낮은 옵션을 1개 체크해제, 2개 이하라면 이 과정을 수행하지 않아.
8. 선택된 총 옵션갯수가 10개이상이 되지 않도록 10개 이상이면 나머지 옵션들을 체크해제해야해.
9. 옵션편집이 완료되면 저장 버튼을 클릭해야해.
전체 옵션체크박스의 요소에서 모든옵션이 체크된 상태일 경우 총 옵션의 갯수를 가져올수 있어.
가격 낮은 순 버튼 요소
<button type="button" class="ant-btn css-1li46mu ant-btn-default"><span>가격 낮은 순 </span><span role="img" aria-label="arrow-down" class="anticon anticon-arrow-down"><svg viewBox="64 64 896 896" focusable="false" data-icon="arrow-down" width="1em" height="1em" fill="currentColor" aria-hidden="true"><path d="M862 465.3h-81c-4.6 0-9 2-12.1 5.5L550 723.1V160c0-4.4-3.6-8-8-8h-60c-4.4 0-8 3.6-8 8v563.1L255.1 470.8c-3-3.5-7.4-5.5-12.1-5.5h-81c-6.8 0-10.5 8.1-6 13.2L487.9 861a31.96 31.96 0 0048.3 0L868 478.5c4.5-5.2.8-13.2-6-13.2z"></path></svg></span></button>
가격 낮은 순 버튼 css
#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-bklklh.iBKTwf > div.ant-row.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(2) > div > button:nth-child(3)
A-Z버튼 요소
<button type="button" class="ant-btn css-1li46mu ant-btn-default"><span>A-Z</span></button>
A-Z버튼 css
#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-bklklh.iBKTwf > div:nth-child(1) > div:nth-child(1) > div > div:nth-child(1) > button
전체 체크박스의 css
#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-bklklh.iBKTwf > div.ant-row.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > label > span.ant-checkbox.ant-checkbox-indeterminate.ant-wave-target.css-1li46mu > input
전체 체크박스가 모든옵션이 선택된 상태일 경우 요소
<label class="ant-checkbox-wrapper ant-checkbox-wrapper-checked css-1li46mu"><span class="ant-checkbox ant-wave-target css-1li46mu ant-checkbox-checked"><input class="ant-checkbox-input" type="checkbox"><span class="ant-checkbox-inner"></span></span><span>선택 8개 옵션명</span></label>
전체 체크박스가 모든옵션이 선택된 상태일 경우 css
#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-bklklh.iBKTwf > div.ant-row.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > label
전체 체크박스가 일부옵션이 선택된 상태일 경우 요소
<label class="ant-checkbox-wrapper css-1li46mu"><span class="ant-checkbox ant-checkbox-indeterminate ant-wave-target css-1li46mu"><input class="ant-checkbox-input" type="checkbox" aria-checked="mixed"><span class="ant-checkbox-inner"></span></span><span>선택 6개 옵션명</span></label>
전체 체크박스가 일부옵션이 선택된 상태일 경우 css
#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-bklklh.iBKTwf > div.ant-row.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > label
전체 체크박스가 모든옵션이 선택되지 않은 상태일 경우 요소
<label class="ant-checkbox-wrapper css-1li46mu"><span class="ant-checkbox ant-checkbox-indeterminate ant-wave-target css-1li46mu"><input class="ant-checkbox-input" type="checkbox" aria-checked="mixed"><span class="ant-checkbox-inner"></span></span><span>선택 6개 옵션명</span></label>
전체 체크박스가 모든옵션이 선택되지 않은 상태일 경우 css
#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-bklklh.iBKTwf > div.ant-row.ant-row-space-between.ant-row-middle.css-1li46mu > div:nth-child(1) > label
1번옵션 체크박스 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(1) > label > span > input
1번옵션의 원본옵션명 요소
<span class="sc-drFUgV dIaFuk Body3Regular14 CharacterSecondary45">8吨力机器整套+一字刀头 送脚踏开关</span>
1번옵션의 원본옵션명 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span
1번옵션의 옵션명편집칸 요소
<input class="ant-input css-1li46mu" type="text" value="힘 기계 완전한 세트 + 풋 스위치를 보내는 배열된 절단기 머리의 8 톤">
1번옵션의 옵션명편집칸 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input
1번옵션의 가격범위 요소
<sup data-show="true" class="ant-scroll-number ant-badge-count ant-badge-multiple-words" title="534,100원 - 534,100원">534,100원 - 534,100원</sup>
1번옵션의 가격범위 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > button > span > sup
2번옵션 체크박스 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(1) > label > span > input
2번옵션의 원본옵션명 요소
<span class="sc-drFUgV dIaFuk Body3Regular14 CharacterSecondary45">8吨力机器整套+一字刀头+十字刀头 送脚踏开关</span>
2번옵션의 원본옵션명 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span
2번옵션의 옵션명편집칸 요소
#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(2) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input
2번옵션의 옵션명편집칸 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input
2번옵션의 가격범위 요소
<sup data-show="true" class="ant-scroll-number ant-badge-count ant-badge-multiple-words" title="559,000원 - 559,000원">559,000원 - 559,000원</sup>
2번옵션의 가격범위 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > button > span > sup
3번옵션 체크박스 css
#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(3) > div > div:nth-child(1) > div > div:nth-child(1) > label > span > input
3번옵션의 원본옵션명 요소
<span class="sc-drFUgV dIaFuk Body3Regular14 CharacterSecondary45">8吨力机器整套+一字刀头+加强脚踏开关</span>
3번옵션의 원본옵션명 css
#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(3) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(3) > span
3번옵션의 옵션명편집칸 요소
<input class="ant-input css-1li46mu" type="text" value="힘 기계 완전한 세트 + 배열된 절단기 머리 + 강화된 발 스위치의 8 톤">
3번옵션의 옵션명편집칸 css
#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(3) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > span > input
3번옵션의 가격범위 요소
<sup data-show="true" class="ant-scroll-number ant-badge-count ant-badge-multiple-words" title="584,000원 - 584,000원">584,000원 - 584,000원</sup>
3번옵션의 가격범위 css
#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(3) > div > div:nth-child(1) > div > div:nth-child(3) > div:nth-child(1) > div:nth-child(2) > button > span > sup
1번옵션의 옵션이미지가 존재할 경우 옵션이미지 삭제버튼 요소
<div class="sc-igZIGL kQDmyq"><span class="sc-drFUgV dIaFuk FootnoteDescription ">삭제</span></div>
1번옵션의 옵션이미지가 존재할 경우 옵션이미지 삭제버튼 css
#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(1) > 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
1번옵션의 옵션이미지가 없을 경우 옵션이미지 추가버튼 요소
<img draggable="false" src="./ic_image_add.svg" class="sc-dRGYJT hmQUGb">
1번옵션의 옵션이미지가 없을 경우 옵션이미지 추가버튼 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img
1번옵션의 옵션이미지가 존재할 경우 옵션이미지의 요소
<img src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37ebe73994c46d385c454/8c3413f1-7aee-4238-9e68-195b9e3a582f.jpg" class="sc-gbvfcU ezktkd">
1번옵션의 옵션이미지가 존재할 경우 옵션이미지의 css
#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(1) > div > div:nth-child(1) > div > div:nth-child(2) > div > img
2번옵션의 옵션이미지가 존재할 경우 옵션이미지 삭제버튼 요소
<div class="sc-igZIGL kQDmyq"><span class="sc-drFUgV dIaFuk FootnoteDescription ">삭제</span></div>
2번옵션의 옵션이미지가 존재할 경우 옵션이미지 삭제버튼 css
#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(2) > 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
2번옵션의 옵션이미지가 없을 경우 옵션이미지 추가버튼 요소
<img draggable="false" src="./ic_image_add.svg" class="sc-dRGYJT hmQUGb">
2번옵션의 옵션이미지가 없을 경우 옵션이미지 추가버튼 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(2) > div > div > img
2번옵션의 옵션이미지가 존재할 경우 옵션이미지의 요소
<img src="https://file.percenty.co.kr/public/652bed8e865b1f32ea62bf1f/products/66f37ebe73994c46d385c454/a68eff8d-4f66-40f7-80ef-775babb9b46c.jpg" class="sc-gbvfcU ezktkd">
2번옵션의 옵션이미지가 존재할 경우 옵션이미지의 css
#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(2) > div > div:nth-child(1) > div > div:nth-child(2) > div > img
옵션이미지 삭제시 삭제 확인버튼 요소
<button type="button" class="ant-btn css-1li46mu ant-btn-primary ant-btn-dangerous"><span>삭제</span></button>
옵션이미지 삭제시 삭제 확인버튼 css
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
[단일상품 여부를 판단하는 셀레니움 코드]
def is_option_product(driver):
"""
웹페이지에서 현재 상품이 '단일 상품'인지 '옵션 상품'인지 확인합니다.
Parameters:
- driver: WebDriver 인스턴스
Returns:
- bool: 옵션 상품이면 True, 단일 상품이면 False
"""
try:
# '옵션 상품등록' 또는 '단일 상품등록' 선택 여부 확인
radio_group_css = "div#productMainContentContainerId div.ant-row.css-1li46mu > div"
radio_group_element = WebDriverWait(driver, 3).until(
EC.presence_of_element_located((By.CSS_SELECTOR, radio_group_css))
)
# 라디오 버튼의 선택 상태 확인
option_radio_xpath = "//label[span[text()='옵션 상품등록']]//input[@type='radio' and @value='false']"
single_radio_xpath = "//label[span[text()='단일 상품등록']]//input[@type='radio' and @value='true']"
option_radio_checked = radio_group_element.find_element(By.XPATH, option_radio_xpath).is_selected()
single_radio_checked = radio_group_element.find_element(By.XPATH, single_radio_xpath).is_selected()
if option_radio_checked and not single_radio_checked:
logger.debug("상품 유형: 다양한 옵션 상품")
return False
else:
logger.debug("상품 유형: 단일 상품")
return True
except Exception as e:
logger.error(f"상품 유형 확인 중 오류 발생: {e}", exc_info=True)
logger.debug("상품 유형 오류 발생으로 기본설정인 단일 상품등록으로 진행합니다.")
return False # 오류 발생 시 기본적으로 단일 상품으로 처리
[vertexAI.py]
def translate_options(self, original_data):
"""
옵션 데이터를 번역하고 파이썬의 딕셔너리로 반환한다.
:param original_data: 원본 옵션 데이터 (dict 형태)
:return: 번역된 옵션명 (파이썬의 dict 형태)
"""
# 데이터 정리
cleaned_data = {key: self.clean_special_chars(value) for key, value in original_data.items()}
# 원본 데이터를 프롬프트 템플릿에 넣는다.
option_prompt_template = self.prompt_data['option_prompt_template']
prompt = option_prompt_template.format(options=json.dumps(cleaned_data, ensure_ascii=False))
# Vertex AI 모델에 프롬프트 전달하여 응답 받기
response = self.model.generate_content(prompt)
# 중괄호 내부의 내용만 추출
start = response.text.find('{')
end = response.text.rfind('}') + 1
if start != -1 and end != -1:
json_text = response.text[start:end]
try:
translated_data = json.loads(json_text)
except json.JSONDecodeError as e:
raise ValueError(f"응답 데이터를 파이썬의 딕셔너리로 파싱하는 중 오류 발생: {e}")
else:
raise ValueError("응답 데이터에서 유효한 JSON 형식을 찾을 수 없습니다.")
return translated_data
[translate_options 의 original_data 형식]
original_data = {
"origin_option_1": "单管制冷大一匹DAKC-27B",
"origin_option_2": "双管制冷1.5匹DAKC-35A",
"origin_option_3": "三管制冷大三匹DAKC-65",
"origin_option_4": "单管制冷小一匹DAKC-18",
"origin_option_5": "DAKC-82",
"origin_option_6": "DAKC-130",
"origin_option_7": "DAKC-250"
}
[translate_options 의 return 형식]
{
"trans_option_1": "단관 1.0HP",
"trans_option_2": "쌍관 1.5HP",
"trans_option_3": "삼관 3.0HP",
"trans_option_4": "단관 0.5HP",
"trans_option_5": "DAKC-82",
"trans_option_6": "DAKC-130",
"trans_option_7": "DAKC-250"
}
옵션 선택여부 판별요소
1번옵션의 삭제편집 div
//*[@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[1]/div/div[1]/div/div[2]/div/div[2]
1번옵션이 선택해제되었을 경우 생성되는 "제외된 옵션" div
//*[@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[1]/div/div[1]/div/div[2]/div/div[3]
1번옵션이 선택해제되었을 경우 생성되는 "제외된 옵션" 요소
<div class="sc-dfauwV bXsMpn"><span class="sc-bKNmIE fZvctk">제외된 옵션</span></div>
2번옵션의 삭제편집 div
//*[@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[2]/div/div[1]/div/div[2]/div/div[2]
2번옵션이 선택해제되었을 경우 생성되는 "제외된 옵션" div
//*[@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[2]/div/div[1]/div/div[2]/div/div[3]
2번옵션이 선택해제되었을 경우 생성되는 "제외된 옵션" 요소
<div class="sc-dfauwV bXsMpn"><span class="sc-bKNmIE fZvctk">제외된 옵션</span></div>