1. 교육 내용
1) 예외 처리
-. 페이지 접속 실패
: WebDriverException - 네트워크 상태 확인 및 url 오타 및 경로 재 확인
-. 엘리먼트 로딩 / 인식 실패
: NoSuchElementException - 엘리먼트 지정자 재 확인
2) 에러 레벨
-. WARNING: 경고
-. SEVERE : 심각한 오류
-. INFO : 정보
3) request 모듈
-. 파이썬 코드에서 웹피이지 요청을 보내고 응답을 받아오는 모듈
-. GET 방식 : 서버에서 데이터를 읽어 올때 사용
-. POST 방식 : 서버로 데이터를 생성하거나 업데이트 할 때 사용
* 셀레니움은 프론트 단의 상태 확인 , requests는 서버 단의 상태 확인(네트워크 등)
4) pyautogui 모듈
-. 브라우저에 한정되지 않고 마우스와 키보드를 자동으로 제어 할수 있는 모듈 (좌표 참고)
-. 스크린 샷 촬영, 이미지 인식 가능
5) 테스트 결과 리포트 작성
-. 파일 입출력 기능
- f=open('파일경로/파일명', 모드), 파일을 열어주는 기능
- r모드 : 파일 읽기(파일이 없는 경우 오류 발생)
- w모드 : 파일 쓰기(파일이 없는 경우 파일을 만듦, 파일이 있으면 내용을 덮어씀)
- x모드 : 파일 쓰기(파일이 없는 경우 파일을 만듦)
- a모드 : 파일 추가(파일이 있으면 맨 끝에 내용을 추가함)
<과제 : 웹자동화 시나리오 후 테스트 리포트 구현하기>
import time
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
#테스트 시 필요한 항목 준비하기
#현재 시간 구하기
now=time.strftime("%Y_%m_%d_%Hh_%Mm")
#성공한 TC ID 넣는 리스트
result_pass_list=[]
#실패한 TC ID 넣는 리스트
result_fail_list=[]
#실패한 이유를 가지고 있는 리스트
fail_reason_list=[]
#전체 TC 개수
tc_count=4
#경로에 폴더 없으면 만들기
if not os.path.exists("lotteon_test_result"):
os.makedirs("lotteon_test_result")
#파일 열고 날짜쓰기
f=open(f'lotteon_test_result/{now}_test_result.text', 'w', encoding="utf-8")
f.write(f"테스트 수행 일자 - {now}\n")
#TC1 홈페이지 접속 결과 확인
tc_id='TC_001'
driver=webdriver.Chrome()
driver.set_window_position(0,0)
driver.set_window_size(1920,1080)
driver.implicitly_wait(10)
t_url=driver.current_url
print('[TC1]PASS: 롯데온 접속 성공')
result_pass_list.append(tc_id)
else:
print('[TC1]FAIL: 롯데온 접속 실패')
result_fail_list.append(tc_id)
fail_reason_list.append('롯데온 접속 실패')
# #TC2 비유효한 글자 검색
tc_id='TC-002'
elem=driver.find_element(By.CSS_SELECTOR, '#headerSearchId')
elem.click()
elem.send_keys('ㄹㄹㄻㅇㅁ')
elem=driver.find_element(By.CSS_SELECTOR, '#mainLayout > header > div > div.main.innerContent > div.searchAreaWrap > div > button')
elem.click()
driver.implicitly_wait(5)
elem=driver.find_element(By.CSS_SELECTOR, "#content > div.srchResultWrap > section > div.srchResultArea.srchResultAreaFilterNone > div > section > p")
if "ㄹㄹㄻㅇㅁ의 검색결과가 없습니다." in elem.text:
print("[TC2]PASS: 비유효한 상품 검색 성공")
result_pass_list.append(tc_id)
else:
print('[TC2]FAIL: 비유효한 상품 검색 실패')
result_fail_list.append(tc_id)
fail_reason_list.append('비유효한 영화 이름 검색 실패')
#TC3 입생로랑 립스틱 검색
tc_id='TC_003'
elem=driver.find_element(By.CSS_SELECTOR, '#mainLayout > header > div > div.main.innerContent > h1 > a > img')
elem.click()
elem=driver.find_element(By.CSS_SELECTOR, '#headerSearchId')
elem.click()
elem.send_keys("입생로랑 립스틱")
elem=driver.find_element(By.CSS_SELECTOR, '#mainLayout > header > div > div.main.innerContent > div.searchAreaWrap > div > button')
elem.click()
driver.implicitly_wait(5)
elem=driver.find_element(By.CSS_SELECTOR, "#content > section.srchTitleArea > h2 > strong")
if "입생로랑" in elem.text:
print("[TC3]PASS: 입생로랑 립스틱 검색 성공")
result_pass_list.append(tc_id)
else:
print('[TC3]FAIL: 입생로랑 립스틱 검색 실패')
result_fail_list.append(tc_id)
fail_reason_list.append('검색 실패')
#TC4 영문 검색
tc_id='TC_004'
elem=driver.find_element(By.CSS_SELECTOR, '#mainLayout > header > div > div.main.innerContent > h1 > a > img')
elem.click()
elem=driver.find_element(By.CSS_SELECTOR, '#headerSearchId')
elem.click()
elem.send_keys("adidas cap")
elem=driver.find_element(By.CSS_SELECTOR, '#mainLayout > header > div > div.main.innerContent > div.searchAreaWrap > div > button')
elem.click()
driver.implicitly_wait(5)
elem=driver.find_element(By.CSS_SELECTOR, "#content > section.srchTitleArea > h2 > strong")
if "adidas" in elem.text:
print("[TC4]PASS: adidas 검색 성공")
result_pass_list.append(tc_id)
else:
print('[TC4]FAIL: adidas 검색 실패')
result_fail_list.append(tc_id)
fail_reason_list.append('검색 실패')
#PASS 테스트 결과 기록
f.write('\n[Result-pass]\n')
for pass_cnt in range(len(result_pass_list)):
f.write(f"{result_pass_list[pass_cnt]} : PASS \n")
#Fail 테스트 결과 기록
f.write('\n[Result-fail]\n')
for fail_cnt in range(len(result_fail_list)):
f.write(f'{result_fail_list[fail_cnt]} : FAIL \n')
f.write(f'\t{fail_reason_list[fail_cnt]}\n')
#결과 요약
f.write('\n[테스트 결과 요약]\n')
f.write(f'PASS TC COUNT : {len(result_pass_list)}\n')
f.write(f'FAIL TC COUNT : {len(result_fail_list)}\n')
f.write(f'COMPLETED TEST COUNT : {len(result_pass_list)+len(result_fail_list)}\n')
f.write(f'PROGRESS OF TEST : {((len(result_pass_list)+len(result_fail_list))/tc_count)*100}%\n')
f.write(f'PASS RATE :{(len(result_pass_list)/tc_count)*100}')
f.close()
▶lotteon_test_result 디렉토리가 생성되고 아래 테스트 파일이 생김
* 자동 로그인 테스트 시나리오를 구현하려고 했지만 막혀있었다... 우회하는 방법에 대해서 고민히 필요하다..
현직자의 라이브 세션과 피드백, 실무PT
업계 선배에게 실무 노하우를 배우고 내 실무에 적용해 성과를 만들어보세요.
comento.kr
'5.자동화 > [교육 일지] QA 셀레니움 웹자동화' 카테고리의 다른 글
[코멘토 실무PT 후기 챌린지_QA자동화 강의 5주차 강의] (1) | 2024.01.27 |
---|---|
[코멘토 실무PT 후기 챌린지_QA자동화 강의 3주차 강의] (0) | 2024.01.16 |
[코멘토 실무PT 후기 챌린지_QA자동화 강의 2주차 강의] (1) | 2024.01.09 |
[코멘토 실무PT 후기 챌린지_QA자동화 강의 1주차 강의] (1) | 2023.12.30 |