Selenium

[Selenium] 값 비교

MASSO 2023. 1. 5. 04:25
728x90

오늘은 셀레니움으로 값 비교를 해보았다.
체크해볼 사항은 아래와 같다.

  분류 사전 조건 절차 기대 결과
1. 구매하기   1. 구매하기 선택 팝업 내 구매 수량 "01"로 노출
2. 구매하기   1. 구매하기 선택
2. 수량 증가 버튼[+] 1번 선택
구매 수량 "02"로 증가
3.  구매하기   1. 구매하기 선택
2. 수량 증가 버튼[+] 1번 선택
3. 수량 감소 버튼[-] 1번 선택
구매 수량 "01"로 감소
import selenium
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.maximize_window()
url = "https://www.amoremall.com/kr/ko/display/main"
driver.get(url)
time.sleep(2)

driver.maximize_window() : 창 크기 최대화
이번 실습은 금액 비교를 위해 이커머스 사이트에서 진행~

driver.find_element(By.XPATH,'//*[@id="__next"]/section[2]/div[2]/div/div[2]/button[2]').click()
time.sleep(1)

팝업이 나오니 먼저 닫아준다.

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section[3]/div[2]/div/div[1]/div/a').click()
time.sleep(1)

상품 상세 페이지로 이동하는 방법도 여러 가지 있지만,

나는 그냥 메인에 뜨는 추천 상품 선택해서 상세 페이지로 진입했다.

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/button[3]').click()
time.sleep(1)

상세 페이지에서 구매하기 선택

그럼 이 팝업이 나오게 될 텐데, 표시되어 있는 부분을 비교하여 PASS, FAIL 값을 받아올 것이다.

gaesu = driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[1]/span')
if gaesu.text == "01":
    print("1. PASS")

else:
    print("1. FAIL")
time.sleep(2)

1번 TC의 결과를 확인해보자.
XPATH가 너무 길어 gaesu라는 변수로 만들어주었다. 변수.text로 해당 요소의 문자열을 추출할 수 있다.
*find_element(By.XPATH,'').text 자체로 변수를 만들어줘도 되고, 안 만들어도 된다.
만약 구매하기 팝업의 디폴트 gaesu 값이 "01"이라면 기대 결과와 부합하여 PASS가 나올 것이다.

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[1]/button[2]').click()
time.sleep(1)

이제 증가 버튼을 한 번 눌러준 후

if gaesu.text == "02":
    print("2. PASS")

else:
    print("2. FAIL")
time.sleep(2)

2번 TC의 결과를 확인해보자.
만약 gaesu의 값이 "01"인 상태에서 증가 버튼을 한 번 눌렀을 때 gaesu의 값이 "02"로 변한다면 기대 결과와 부합하여 PASS가 나올 것이다.

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[1]/button[1]').click()
time.sleep(1)

이 상태에서 감소 버튼을 한 번 눌러준 후

if gaesu.text == "03":
    print("3. PASS")

else:
    print("3. FAIL")
time.sleep(2)

3번 TC의 결과를 확인해보자.
만약 gaesu의 값이 "02"인 상태에서 감소 버튼을 한 번 눌렀을 때 gaesu의 값이 "03"으로 변한다면 기대 결과와 부합하여 PASS가 나올 것이다.

결과는 이렇게 나온다.
*3번의 경우 FAIL의 경우를 보기 위해 "01"(2-1)이 아닌 "03"과 비교했기에 FAIL이 나오게 된다.

추가로 금액 비교까지 해보았다.

금액은 요 부분!
개수는 모든 화면이 동일할 테니 문자열 그대로 사용했지만, 금액은 문자열을 사용하면 각 페이지마다 if문을 따로 만들어줘야 할 텐데.. 그건 좀 말이 안 되는 것 같았고....ㅎㅎ; 딱 생각난 것이 형변환이다.


이번에 확인해볼 TC는 아래와 같다.

  분류 사전 조건 절차 기대 결과
1. 구매하기   1. 구매하기 선택 팝업 내 금액 정상 노출
2. 구매하기   1. 구매하기 선택
2.. 개수 증가 버튼[+] 1번 선택
팝업 내 금액 정상 증가

 

import selenium
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.maximize_window()
url = "https://www.amoremall.com/kr/ko/display/main"
driver.get(url)
time.sleep(2)

driver.find_element(By.XPATH,'//*[@id="__next"]/section[2]/div[2]/div/div[2]/button[2]').click()
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section[3]/div[2]/div/div[1]/div/a').click()
time.sleep(1)

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/button[3]').click()
time.sleep(1)

구매하기 팝업 진입하는 부분은 동일하다.

onega = driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[2]/span/strong').text
onega1 = onega.replace(",","",)
onega2 = int(onega1)
if onega2 == onega2*1:
    print("1. PASS")

else:
    print("1. FAIL")
time.sleep(2)

위 코드 내 'onega'의 type을 확인해보면 문자열이라고 나온다.
A모레몰의 경우 해당 요소의 text에 ','(ex. 35,100원)이 붙어있기에 replace 함수로 ','를 제거한 후 int로 바꿔주었다.
*스크립트 상에는 없지만 int로 형변환 후 'onega2'의 type을 확인해보면 int로 나오는 것을 확인할 수 있다!
이제 onega2는 정수(int) 타입이 되었으므로 계산이 가능해질 것이다.
디폴트 상태의 개수가 1개이기 때문에 기존 onega2의 값과 onega2*1의 결과를 비교하여 동일하면 PASS, 그렇지 않으면 FAIL이 출력되게끔 작성했다.

driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[1]/button[2]').click()

1번 확인이 끝났으니 증가 버튼을 눌러준다.

gyesan = driver.find_element(By.XPATH,'//*[@id="__next"]/section/section[1]/section/section/section/div/div[1]/div/div[2]/div[4]/section[2]/div[2]/div/div/div[1]/div/div/div/div[2]/span/strong').text
gyesan1 = gyesan.replace(",","",)
gyesan2 = int(gyesan1)
time.sleep(1)

if gyesan2 == onega2*2:
    print("1. PASS")

else:
    print("1. FAIL")
time.sleep(2)

driver.close()

이제 개수를 2개로 늘렸을 때 금액이 정상적으로 증가되는지 확인해야 한다.
onega2에는 이미 개수가 1개일 때의 값(원가)이 들어가있기 때문에 gyesan2이라는 변수를 하나 더 만들어 마찬가지로 ',' 제거 후 int로 변환시켜주었다.
if문은 개수를 증가시켰을 때의 값(gyesan2)과 원가*2(onega2*2)를 서로 비교하여 결과값을 출력해주도록 작성했다.
 
 

그럼 이렇게 결과가 출력된다.
테스트해보니 다른 상품 상세 페이지에서도 정상 작동하더라........ 뿌듯........!

728x90

'Selenium' 카테고리의 다른 글

[Selenium] 실험1  (0) 2023.09.09
[Selenium] 크롬 창 종료 현상?  (0) 2023.06.16
[Selenium] 엑셀 파일 읽기/쓰기  (0) 2023.01.21
[Selenium] 뮤트하기  (0) 2023.01.08
[Selenium] 타이틀 비교  (0) 2023.01.04