이틀 동안 브라우저 자동화가 세 번 멈췄습니다. 셋 다 코드가 틀려서가 아니었고, 셋 다 브라우저 안이 아니라 밖에서 막혔습니다.
막힌 자리를 정리해 두면 다음에 같은 곳에서 시간을 안 들입니다. 그리고 셋을 나란히 놓으니 처리 방법이 세 가지뿐이라는 것도 보였습니다.

첫째 — 파일 선택 창
파일을 올리는 버튼을 누르면 운영체제 파일 창이 뜹니다. 그 순간 자동화는 끝입니다. 창은 브라우저 밖이라 클릭도 입력도 닿지 않고, 열린 채로 두면 그다음 명령도 안 먹습니다.
흔히 떠올리는 우회는 다 막혀 있습니다. 보안상 input.value 에 경로를 넣을 수 없고, 좌표 클릭은 창이 브라우저 밖이라 안 되고, 드래그·드롭을 흉내 내려면 결국 File 객체가 필요합니다.
그런데 파일 창을 여는 것은 사이트가 아니라 그 페이지 안의 코드입니다. 대개 이렇게 생겼습니다.
const input = document.createElement('input');
input.type = 'file';
input.onchange = handle;
input.click(); // ← 여기서 OS 창이 열린다
그러면 그 한 줄만 못 하게 막으면 됩니다.
const original = HTMLInputElement.prototype.click;
HTMLInputElement.prototype.click = function () {
if (this.type === 'file') return; // 파일 창만 안 연다
return original.apply(this, arguments);
};
이렇게 두고 버튼을 누르면 창은 안 뜨는데 input 은 DOM 에 그대로 남습니다. 그 요소에 파일을 넣으면 사이트가 보기에 사람이 고른 것과 같습니다. 자동화 도구를 쓰신다면 이 지점이 setInputFiles 가 하는 일입니다.
함정 하나 — 위 코드에서 보이듯 input 은 버튼을 누르는 순간 만들어집니다. 미리 찾아 두려고 DOM 을 뒤지면 아무것도 없습니다. 가로채기를 먼저 걸고, 버튼을 누르고, 그다음에 찾아야 합니다.
둘째 — 화면 녹화 권한
돌아가는 화면을 영상으로 남겨야 했는데 screencapture 가 could not create image from display 로 거부했습니다. 운영체제 권한 문제라 코드로 넘을 수 없습니다.
권한을 켜면 되지만, 켜려면 터미널을 다시 시작해야 하고 그러면 하던 작업이 끊깁니다.
여기서 방향을 바꿨습니다. 밖에서 못 찍으면, 찍히는 쪽이 스스로 찍게 합니다. 그 화면이 제가 고칠 수 있는 프로그램이라면 「N밀리초마다 자기 창을 저장하라」는 옵션을 하나 넣는 편이 빠릅니다. 실제로 그렇게 하니 프레임당 비용도 오히려 낮아졌습니다. 창 밖에서 화면 전체를 뜨는 것보다 안에서 위젯 하나를 그리는 것이 싸기 때문입니다.
밖에서 관측하려다 막히면, 안에서 내보내게 만드는 쪽을 봅니다.
셋째 — 도메인 차단
세 번째는 못 넘었습니다.
쓰고 있던 브라우저 확장이 특정 도메인 전체를 막고 있었습니다. 사이트 권한을 열어도 같았습니다. 사용자가 켜는 권한과 별개인 내장 차단 목록이었기 때문입니다.
여기서 시간을 더 쓰면 안 됩니다. 새 탭에서도, 다른 하위 도메인에서도 같은 응답이면 그건 설정이 아니라 정책입니다.
대신 사람이 들이는 시간을 줄이는 쪽으로 갔습니다. 붙여넣을 본문을 클립보드에 담아 두고, 이미지가 든 폴더를 열어 두고, 어떤 값이 어디에 들어가는지 순서대로 적어 둡니다. 자동화는 못 해도, 사람이 그 자리에서 들이는 시간은 줄일 수 있습니다.
셋을 나란히 놓으면
처리 방법이 세 가지뿐이었습니다.
| 막힌 것 | 어디가 경계인가 | 처리 |
|---|---|---|
| 파일 선택 창 | 페이지 코드가 OS 창을 연다 | 경계를 옮긴다 — 창이 열리기 전에 안에서 가로챈다 |
| 화면 녹화 권한 | 운영체제가 화면을 안 준다 | 안쪽으로 옮긴다 — 찍히는 프로그램이 스스로 저장하게 한다 |
| 도메인 차단 | 도구의 정책이다 | 인정하고 비용을 줄인다 — 사람 몫으로 남기되 준비를 다 해 둔다 |
뚫는 것은 셋 중에 없습니다. 경계를 옮기거나, 안쪽으로 옮기거나, 인정하거나입니다. 그리고 어느 쪽인지는 대개 두세 번 시도해 보면 갈립니다. 같은 응답이 세 번 나오면 그건 세 번째입니다.
덤 — 같은 자리에서 만난 함정 셋
파일은 올라갔는데 그다음에 걸린 것들입니다. 사이트마다 다르고, 어느 문서에도 안 적혀 있습니다.
- 미디어를 붙인 뒤에는 작성자를 못 바꾸는 곳이 있습니다. 개인 계정에서 회사 계정으로 바꾸려면 첨부를 지우라고 합니다. 순서를 뒤집어야 합니다 — 작성자를 먼저 고르고 파일을 붙입니다.
- 본문에 주소를 넣으면 링크 카드가 첨부를 밀어내는 곳이 있습니다. 영상을 붙였는데 주소를 쓰는 순간 카드로 바뀌어 있었습니다. 카드를 지우고 파일을 다시 붙이면 됩니다.
- 임시 저장된 초안이 되살아납니다. 작성창을 열었는데 다른 작업의 글이 들어 있었습니다. 확인창이 뜨면 「이어서」가 아니라 「새로」를 고릅니다. 안 뜨는 곳도 있으니 붙여넣기 전에 창이 비어 있는지 봅니다.
셋 다 화면을 한 번 보면 알 수 있는 것들입니다. 반대로 말하면, 보지 않고 다음 단계로 넘어가면 그대로 나갑니다.
정리
자동화가 멈추면 코드부터 보게 됩니다. 그런데 이틀 동안 세 번 다 코드가 아니었습니다. 운영체제, 권한, 도구 정책이었습니다.
그래서 요즘은 막히면 먼저 묻습니다. 이 경계가 브라우저 안인가 밖인가. 안이면 고치고, 밖이면 옮기거나 인정합니다. 밖에 있는 것을 안에서 뚫으려고 하면 그 시간이 제일 오래 걸립니다.
여러분은 자동화가 막혔을 때, 그것이 코드 문제인지 경계 문제인지 무엇으로 가르십니까.
이 글은 https://blog.vexplor.com/post/automation-breaks-outside-the-browser 에 먼저 실렸습니다.