본문 바로가기
[QA셀레니움웹자동화]

[코멘토 실무PT 후기 챌린지_QA자동화 강의 4주차 강의]

by 슬쨩! 2024. 1. 23.

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 디렉토리가 생성되고 아래 테스트 파일이 생김

 

 

* 자동 로그인 테스트 시나리오를 구현하려고 했지만 막혀있었다... 우회하는 방법에 대해서 고민히 필요하다..

 

https://bit.ly/3D9XCOz

 

현직자의 라이브 세션과 피드백, 실무PT

업계 선배에게 실무 노하우를 배우고 내 실무에 적용해 성과를 만들어보세요.

comento.kr