본문 바로가기
자동화

파이썬 이미지 인식 기반 자동화 테스트

by 찬스도 2024. 1. 29.

얼마 전 오토핫키를 사용한 이미지 인식 봇을 만드는 방법을 글로 작성한 적이 있습니다. 개인적으로 오토핫키는 스크립트를 간단하고 빠르게 만들어 사용할 수 있어 급하게 간단히 매크로 스크립트가 필요할 때 애용합니다.

하지만, 오토핫키가 Windows 운영체제에서만 지원된다는 사실을 알게 되었습니다. MacOS를 사용하는 다른 팀원 분들께 의미 있는 노하우 공유를 위해 이번엔 파이썬을 이용한 이미지 인식 봇을 만드는 방법과 추가로 이미지 인식 기반 UI 자동화 테스트를 하는 방법에 대해 작성해 보겠습니다.

 

pyautogui

파이썬을 이용하여 자동화 테스트를 할 때 selenium라이브러리를 사용하기도 하지만,이번엔 pyautogui를 사용해 보았습니다. pyautogui는 마우스와 키보드를 제어할 수 있는 라이브러리이며 이미지를 인식하거나 스크린샷을 찍을 수도 있습니다. 추가로 pyautogui는 외부 모듈이므로 pip를 이용해 모듈을 설치하고 import한 뒤 사용할 수 있습니다.

 

마우스 제어

position 메소드는 마우스의 현재 위치를 좌표로 반환하여 mouse_position 변수에 할당합니다. 출력 결과는 아래와 같습니다.

좌표가 튜플 형태로 반환 되기 때문에 아래와 같이 각 요소에 접근하여 값을 사용할 수도 있습니다.

moveTo 메소드는 파라미터로 입력한 위치로 마우스를 이동 시킵니다. 위의 코드에서는 0, 0의 위치로 이동하게 됩니다.

해당 파라미터에는 변수도 입력이 가능해 위에서 확인한 mouse_position 튜플의 값을 사용할 수도 있습니다.

click 메소드는 마우스 클릭을 제어합니다. 파라미터가 비었을 때는 좌클릭을 하게되며 button=’right’ 값으로 우클릭을 할 수 있습니다. doubleclick()으로는 더블클릭 동작을 합니다.

click() 메소드에 파라미터로 좌표를 입력하면 마우스를 이동하는 코드를 별도로 작성하지 않아도 해당 좌표를 바로 클릭하게 됩니다.

dragTo 메소드는 마우스를 드래그 합니다. 매개변수로 x, y좌표와 초를 입력 받는데 x, y좌표는 마우스의 현재 위치를 기준으로 x, y까지 드래그하게 되며 초는 몇 초에 걸쳐 이동할지 정하는 변수입니다.

 

키보드 제어

typewrite 메소드는 매개변수로 받은 문자열을 입력합니다. interval이 없는 경우 한 번에 문자열을 입력하고, interval이 있는 경우 입력한 초 단위로 한 글자 씩 차례대로 입력합니다.

press 메소드는 매개변수로 받은 키를 누릅니다. 위의 코드에서는 ctrl 키를 한번 누르는 동작을 수행합니다. 알파벳이나 숫자 등 일반키 또한 매개변수로 사용할 수 있습니다.

keyDown 메소드는 키를 누른 채로 유지합니다. 반대로 keyUp 메소드는 키를 누른 것을 뗍니다. 기능키 조합을 제어할 때 주로 사용하는 조합으로 아래와 같이 조합할 수 있습니다.

ctrl을 누른 상태로 a를 누르고 ctrl을 뗍니다. Ctrl+a 조합을 누른 것으로 전체 선택하는 동작을 합니다.

 

스크린 샷 촬영

지금까지 테스트 자동화에서 사용해본 기능은 스크린 샷을 찍는 기능과 이미지를 인식 시키는 기능입니다.

screenshot 메소드로 스크린 샷을 찍을 수 있습니다. 주로 자동화 테스트 중 Fail이 발생했을 때 현재 화면을 기록하는 용도로 사용합니다. 파라미터로 파일이 저장 될 경로와 파일명.확장자명과 스크린 샷을 찍을 범위를 region 변수로 설정합니다.

selenium으로 브라우저를 띄울 때 위치와 크기를 0, 0, 1920, 1080으로 고정하여 띄우고 브라우저 전체를 촬영하도록 0, 0, 1920, 1080 범위를 찍습니다.

이미지 인식

이미지를 인식하기 위해서는 먼저 인식하고 싶은 이미지를 구해야 합니다.

 

원티드 홈에서 회원가입/로그인 버튼을 인식할 수 있도록 동그라미 친 부분의 이미지를 따줍니다.

 

이 이미지를 imgsrc 라는 폴더 내에 login.png라는 이름으로 저장해 두었습니다. 이제 이미지를 인식해 보겠습니다.

locateOnScreen 메소드는 전체 화면 상에서 ./imgsrc 경로의 login.png 이미지와 동일한 영역을 찾습니다. 찾지 못한다면 None을 반환하고, 찾는다면 Box 객체를 반환하여 img_position 변수에 할당합니다.

또한 튜플 형태이므로 position과 마찬가지로 Box 객체의 각 요소에 접근이 가능합니다.

position 메소드와 마찬가지로 튜플 형태로 찾은 이미지의 위치와 길이, 높이를 반환합니다. 로그인을 하기 위해서 해당 이미지의 위치를 클릭합니다.

해당 버튼을 클릭한 뒤 아래와 같은 원티드 서비스 로그인 페이지로 이동하였는지, 이미지를 인식하여 버튼의 정상 동작 여부 또한 검증이 가능합니다.

로그인 창을 이미지로 딴 뒤 해당 이미지를 인식 시킨 결과가 None이면 Fail이므로 스크린 샷을 촬영하고, 좌표를 반환 한다면 Pass인 것이죠.

 

이후 pyautogui의 키보드 제어와 마우스 제어 기능을 이용해 로그인 하고 로그인 결과를 확인하는 등 원하는 동작을 UI단에서 해볼 수 있습니다. 위에서 알려드린 메소드들 만으로도 충분히 테스트가 가능하다고 생각합니다.

마무리

이렇게 파이썬으로 키보드와 마우스를 제어하고 이미지를 인식해 UI 자동화 테스트를 하는 방법에 대해 공유해 보았습니다.

 

위에서 공유해 드린 메소드의 사용법은 간단하고 직관적이라서 누구나 조금만 관심을 가지고 연습해 본다면 충분히 해낼 수 있는 정도라고 생각합니다.

테스트 자동화 스크립트를 만드는 것은 그렇게 어렵지 않습니다. (정책적인 부분과 스크립트 유지보수가 어렵죠.) 대단한 툴이 필요한 것도 아닙니다. 간단한 한 줄짜리 파이썬 코드들이 모여 완성되는 것이니 처음 시도하시는 분들은 너무 막연하게 어렵다고 느끼지 않았으면 좋겠습니다.

이전까지는 selenium을 이용해 객체를 class나 id, xpath등으로 인식 시켜 자동화 스크립트를 만들어 보았지만 이런 방법은 객체의 위치나 정보가 바뀌면 스크립트가 무용지물이 된다는 것이었습니다.

이미지 인식 기반 방식은 객체의 위치 변경, 정보 수정 등에서 좀 더 자유롭습니다. 객체의 위치나 정보를 인식하는 것이 아니라 객체를 이미지로 인식하기 때문에, 객체의 디자인을 변경하지 않는 한 계속해서 사용할 수 있습니다.

두 가지 방법 모두 완벽한 방법은 아니므로 천천히 하나씩 익히며 그때 그때 자신에게 유리한 방법을 취하면 되겠습니다.

감사합니다.