화면이 느려도 안 어긋나게
— 기다렸다 누르기
어제까지 잘 돌던 매크로가 오늘 아침에만 엉킵니다. 고친 것도 없는데 그렇습니다.
원인은 대개 하나입니다. 화면이 준비되는 데 걸리는 시간을 숫자로 못 박아 둔 것입니다.
이 글은 3초 기다리기 를 색 대기 와 이미지 찾기 로 바꾸는 방법입니다.
상황 — 어제는 됐는데 오늘은 안 됩니다
조회 버튼을 누른 뒤 결과가 뜨기를 기다렸다가, 결과 목록의 첫 줄을 더블클릭하는 매크로입니다.
만들 때 조회에 2초쯤 걸렸으므로 3초 기다리기 를 넣었습니다.
넉넉하게 잡았다고 생각했습니다.
그런데 월말이 되자 조회가 6초씩 걸립니다. 3초가 지난 시점에는 아직 빈 화면이므로, 더블클릭이 허공을 누릅니다. 매크로는 오류 없이 끝나고, 아무 일도 일어나지 않습니다.
반대 방향도 있습니다. 한가한 시간에는 조회가 0.4초에 끝나는데 매번 3초를 기다립니다. 100행짜리 표 반복이라면 그냥 버리는 시간만 4분이 넘습니다.
왜 고정 시간 대기가 깨지는가
고정 지연은 "화면이 준비됐다"를 확인하는 방법이 아니라, 준비됐을 것이라고 믿는 방법입니다. 매크로가 화면을 전혀 보고 있지 않습니다.
그런데 화면이 준비되는 데 걸리는 시간은 늘 흔들립니다. 서버가 바쁜 시간대, 사내망이 붐비는 시간, 다른 프로그램이 디스크를 쓰고 있는 순간, 노트북이 절전 모드로 성능을 낮춘 상태 — 전부 같은 작업을 몇 배로 늘립니다.
그래서 고정 지연으로 안정성을 사려면 숫자를 계속 키우는 수밖에 없습니다. 느려서 틀리는 문제를 느리게 만들어 푸는 셈이라 끝이 없습니다. 게다가 10초로 올려 둬도 11초 걸리는 날은 반드시 옵니다.
어떻게 바꾸는가
시간을 세는 대신 화면의 변화를 봅니다. 조회가 끝나면 결과 영역의 색이 바뀌거나, 그때만 보이는 그림이 나타납니다. 그것을 기다리게 합니다.
바꾸기 전
1 마우스 클릭 창 기준 (640, 180) 조회
2 지연 3초 기다리기 ← 여기가 깨진다
3 마우스 더블클릭 창 기준 (320, 260) 첫 줄 열기
바꾼 뒤
1 마우스 클릭 창 기준 (640, 180) 조회
2 색 대기 (320, 260) 흰색 아님 · 최대 60초 결과 줄이 그려질 때까지
3 마우스 더블클릭 창 기준 (320, 260) 첫 줄 열기
만드는 순서는 이렇습니다.
- 변화가 나타나는 지점을 하나 고릅니다. 결과 목록의 첫 줄 자리처럼, 조회 전에는 비어 있고 조회 후에는 내용이 생기는 곳이 좋습니다.
- 그 자리의 색을 캡처합니다. 동작 추가 창에서 Ctrl+Alt+C 를 누르면 마우스 자리의 좌표와 색이 들어옵니다.
- 조건을 "아니게 될 때까지"로 둡니다. 색 대기는 특정 색이 될 때까지도, 그 색이 아니게 될 때까지도 기다릴 수 있습니다. 빈 화면이 흰색이라면 "흰색이 아니게 될 때까지"가 곧 "결과가 그려질 때까지"입니다.
- 최대 대기 시간은 넉넉하게 줍니다. 60초로 둬도 손해가 없습니다. 조건이 맞으면 그 즉시 넘어가므로, 이 숫자는 "이만큼 기다린다"가 아니라 "이만큼까지는 기다려 준다"입니다.
- 좌표가 흔들리는 화면이라면 이미지 찾기를 씁니다. 화면을 드래그해 캡처한 그림을 지정한 영역에서 찾고, 원하면 찾은 자리를 바로 누릅니다. 버튼이 매번 같은 자리에 있지 않아도 됩니다.
색 대기와 이미지 찾기, 무엇을 쓸까
| 색 대기 | 이미지 찾기 | |
|---|---|---|
| 보는 것 | 한 점의 색 | 캡처해 둔 그림 |
| 좌표 | 지점을 알아야 합니다 | 영역 안에서 알아서 찾습니다 |
| 속도 | 빠릅니다 | 영역이 넓으면 느려집니다 |
| 잘 맞는 곳 | 버튼이 활성/비활성으로 바뀌는 것, 칸이 비워지는 것 | 자리가 바뀌는 버튼, 뜰 때마다 위치가 다른 알림창 |
| 그 자리를 클릭 | 클릭 동작을 따로 둡니다 | 찾은 자리를 바로 누를 수 있습니다 |
둘 다 애매하면 창 활성화가 답인 경우도 많습니다. 새 창이 뜨기를 기다리는 상황이라면, 창 제목으로 찾아 전경으로 가져오는 이 동작이 창이 아직 없을 때 지정한 초까지 알아서 기다려 줍니다.
판단이 필요하면 만약 ~이면 을 씁니다. 화면 색·창 존재·이미지로 판단해 블록 안을 실행하거나 건너뜁니다. "알림창이 떠 있으면 닫고 계속" 같은 처리를 여기에 넣으면 매크로가 훨씬 오래 버팁니다.
주의할 점
실행 중 커서를 따라다니는 상태창과 연타의 빨간 점은 화면 캡처에 잡히지 않습니다. 이미지 찾기를 가리지 않으므로 상태창이 화면 가운데 있어도 탐색이 방해받지 않습니다.
색 대기 지점으로 그라데이션이나 애니메이션이 있는 곳은 피합니다. 마우스를 올리면 밝아지는 버튼, 서서히 나타나는 영역은 같은 색이 안정적으로 나오지 않습니다. 단색으로 꽉 찬 영역의 가운데를 고릅니다.
이미지 찾기 그림은 작고 특징적으로 캡처합니다. 버튼 전체보다 그 안의 글자 부분만 잡는 편이 빠르고 덜 틀립니다. 창 테두리나 배경이 많이 들어가면 테마·배율이 바뀔 때 못 찾습니다.
잘 맞는지는 모의 실행으로 먼저 확인합니다. 실제 입력을 보내지 않고 로그만 남기므로, 색 조건과 이미지가 실제로 걸리는지 안전하게 볼 수 있습니다. 흔들리는 동작에는 실패 시 재시도 횟수를 줍니다.
그래도 빗나가면 실행 로그에서 마지막으로 성공한 지점을 봅니다. 실패한 줄은 붉게 표시되고 자동으로 선택되므로 몇 번째인지 세지 않아도 됩니다. 의심되는 줄은 Space 로 꺼 가며 범위를 좁힙니다.
매크로는 완료됐다는데 대상 프로그램이 전혀 반응하지 않는다면 기다림의 문제가 아니라 입력이 너무 빠른 경우입니다. 설정 > 실행에서 키·마우스를 누르고 있는 시간을 50~120ms 로 올려 보십시오.