본문 바로가기

개인공부/python

나 혼자 하는 프로젝트 3탄 - 업무자동화(RPA) 데스크탑 1장 - 환경설정, 마우스 이동과 액션

테스크탑 작업을 자동화 하려면, 먼저 현재 사용중인 VS CODE에 라이브러리를 추가해 주어야 한다.

pyautogui 라이브러리를 현재 컴퓨터에 출력되는 화면 정보를 수치화하여, 키보드, 마우스를 원하는 위치로 이동, 입력 하는데 아주 유용한 라이브러리 이다.

pyautogui.size()를 통해 현재 사용중인 컴퓨터 화면은 해상도 정보를 얻을 수 있다.

 

갑자기 예전에 마비노기란 게임을 할때 사용했던 오토 스크립트 프로그램이 생각난다.

이 프로젝트를 끝낼때 쯤이면, 스스로 만들 수 있겠지...

 

마우스를 이동시키려면 pyautogui.moveTo() 로 좌표를 설정하여 마우스를 해당 좌표로 보낼 수 있다.

당연히 사용자에 따라 화면 해상도가 다르기 때문에, 움직이는 위치는 다를 수 있지만, 마우스가 좌측 상단으로 이동하는 걸 볼수 있다.

그런 사람은 없겠지만, duration= 값을 전달하면, 마우스가 값이 커짐에 따라 좀더 천천히 이동하게 된다.

pyautogui.move()를 사용하게 되면, 현재 마우스 포인터의 위치를 (0,0)으로 설정한 뒤 마우스를 해당 좌표로 움직이게 된다. 각 마우스의 위치를 pyautogui.position()을 통해 좌표를 출력해 보면, motoTo()로 이동한 좌표에서 각 100 증가한 좌표값으로 마우스가 이동한 걸 확인할 수 있다.

이렇게 이동한 마우스의 좌표값을 따로 불러올 수 있으며, 이는 추후 다양한 방법으로 활용 가능하다.

이제 마우스의 액션을 추가해보자.

실제 마우스로 할 수 있는 액션은 "클릭", "더블클릭", "클릭 유지", "클릭 유지 해제" 정도 이다. 물론 복합적으로 사용하면 다중선택이라던지, 파일복사라던지 할 수 있지만, 1차원적인 액션부터 하나하나 살펴보자.

제일 먼저 해볼 액션은 VS CODE 프로그램의 메뉴로 마우스를 이동 시키기는 것이다.

그러기 위해선 해당 좌표를 먼저 확인해야 하는데, pyautogui.sleep()을 통해 대기시간을 주고 파일을 실행 후 해당 위치로 마우스로 이동시키면, 3초 뒤에 마우스의 현재 위치가 터미널창에 나타나게 된다.

이제 pyautogui.click()을 이용해 좌표를 설정해주면, 해당 좌표로 마우스가 이동 후 클릭되는걸 확인 할 수 있다.

click()은 mouseDown()과 mouseUp()이 합쳐진 동작이다.

mouseDown()과 mouseUp()은 드래그 앤 드랍 또는 드래그를 통한 범위 선택을 할때 이용 할 수 있다.

doubleClick()을 통해 파일을 열수도 있으며, 해당 버튼을 많이 눌러야 하는 경우에는 click()에 clicks= 값을 전달하여, 클릭 회수를 설정해 줄 수 있다.

mouseDown()과 mouseUp()을 이용해 그림판에 예쁜 사선을 그려 보았다.

이러한걸 또 한줄에 작성할 수 있게 drag()가 있다. 이때 duration 설정을 해주지 않으면 너무 빠르게 움직이기 때문에 컴퓨터가 인식을 못하는 경우가 생긴다.

 

dragTo()를 사용하면 상대좌표가 아닌 절대 좌표로 이동 시킬 수 있다.

나머지 마우스의 오른쪽 버튼과 휠도 클릭하게 만들 수 있다.

scroll()을 사용하여 마우스 가운데 휠 움직임을 조작할 수 있는데, 이때 전달되는 값에 따라 이동 방향이 결정된다.

스크롤 되는 수치는 개인의 컴퓨터 환경에 따라 달라질 수 있으니, 테스트 해 본 뒤 정적값을 찾아야 한다.

 

pyautogui에서 자체적으로 제공하는 아주 유용한 기능이 있는데 바로 mouseInfo()이다.

해당 코드를 실행하면 새로운 창이 열리면서, 마우스 포인터의 위치에 따른 정보를 제공해 준다.

Color 관련된 부분에 데이터가 안나오는 경우에는 반드시 Pillow 라이브러리를 추가로 설치해 주어야 한다.

F1(Copy All 단축키)를 누르고 원하는 위치에 마우스로 움직여두면, 3초 뒤에 해당 좌표의 정보가 자동으로 클립보드에 복사되어 진다. 이제 코드로 돌아와서 붙여넣기를 하면 아무런 수고없이 해당 위치의 좌표와 컬러정보까지 가져올 수 있다.

또한 XY Origin 을 설정해 주면, 스크린 해상도에 따른 절대값이 아닌, 지정한 좌표에 따른 상대값도 쉽게 구할 수 있다.

만약 프로그램을 작성하여 마우스가 움직이고 있을때, 급하게 종료해야 할 경우 어떻게 해야 할까?

for문을 통해 마우스가 총 10번 움직이도록 설정해 보았다.

만약 급하게 종료해야 할 경우, 마우스를 화면은 모서리 끝으로 가져가면, 해당 for문은 아래와 같은 에러메세지를 보여주며 강제로 종료되게 된다.

fail-safe 라고 한다.

이를 강제로 실행하게도 할 수 있는데,

FAILSAFE 값을 False로 설정해 두면, 강제로 종료되는 걸 막을 수 있다. (추천하지 않는 방법이다)

또한 자동화 코드를 작성할때 모든 for문과 if문에 sleep()을 추가하게 되면 굉장히 번거롭다.

이렇게 PUASE()를 이용하면 자동화 스크립트의 전체 속도를 조절하는데 유용하다.