버튼을 찾는 순간에는 맞았어도 클릭할 때는 페이지가 바뀌었을 수 있다. 이름이 바뀌거나 폼이 이동하고 같은 자리에 다른 노드가 생기기도 한다. 나는 관찰에서 얻은 ref를 영구 주소로 쓰지 않고 현재 문서와 실제 노드를 다시 확인하게 했다.

참조에 어느 관찰의 것인지 붙인다

ElementRef는 tabId·frameId·documentEpoch·snapshotId·refId를 함께 갖는다. 숫자 하나로 화면 전체의 임의 노드를 가리키는 방식이 아니다. 드라이버의 context는 현재 탭과 프레임, 문서 세대와 snapshot이 맞는지 먼저 확인한다.

같은 URL을 다시 열어도 예전 문서와 같은 것은 아니다. 현재 페이지의 이름이 똑같다고 이전 ref를 다시 쓰지 않는다. 참조의 소속과 수명을 구체적으로 묶어야 탭 복원과 재시작 뒤에도 설명 자료 보존과 행동 참조 재사용을 구별할 수 있다.

실제 노드의 의미가 바뀌었는지도 본다

페이지 내부의 참조 저장소에는 node와 signature가 있다. signature는 태그와 입력 종류, 역할과 이름, 링크와 폼 동작, 일부 상태를 묶는다. 노드가 여전히 연결돼 있어도 그 의미가 바뀌면 오래된 대상으로 거절한다.

모든 DOM 속성이나 비즈니스 의미를 완벽히 감시하는 지문은 아니다. 현재 함수가 포함한 조건의 범위다. 하지만 참조 번호만 같다는 이유로 다른 폼과 이름을 가진 요소를 그대로 누르는 것보다는 더 구체적인 경계다. 변경되지 않아야 하는 값과 최신 관찰에서 다시 볼 값을 나누는 출발점이었다.

존재와 행동 가능성도 다시 나눈다

참조를 찾은 뒤 visible과 disabled, sensitive 같은 조건을 확인한다. 실제 행동 지점의 가림과 프레임 소속도 별도 경로에서 이어진다. 노드가 메모리에 남아 있다는 사실로 입력할 수 있다는 결론을 내리지 않는다.

Broker는 전달 전에 현재 실행 세대도 확인한다. 오래된 작업에서 늦게 온 조작이 새 화면에 들어가지 않게 하는 조건이다. 이 검사들은 같은 문제를 반복해서 보는 것이 아니라 작업·문서·노드·화면 지점이라는 서로 다른 수명을 확인한다. 어느 단계에서 멈췄는지 알 수 있어야 복구도 정확해진다.

입력 뒤 확인에는 그 시점의 참조가 필요하다

fill과 선택 같은 동작의 응답에는 새 관찰이 들어올 수 있다. page API는 그 응답을 받아 기존 observation을 바꾸고 새로 맞는 ref로 verifyField를 한다. 입력이 바뀌었는데 예전 snapshot을 계속 쓰는 방식으로 확인하지 않는다.

일부 내부 값 확인은 입력 자체로 signature가 달라지는 상황을 따로 다룬다. 이것을 일반 클릭의 오래된 참조 검사 해제로 넓히면 안 된다. 읽기 검증과 행동 검증은 목적이 다르다. 나는 예외가 어떤 연산에만 적용되는지 현재 코드에서 확인하고 공개 설명의 범위를 제한했다. 호출자가 번호만 새 값으로 고쳐 만드는 것도 새 관찰이 아니다. 호스트가 실제 노드를 연결해 발급한 참조가 필요하다.

오래된 참조를 거절한 시험을 읽었다

숨긴 선택 label 시험은 먼저 ref를 얻고 연결된 입력을 비활성으로 바꾼 뒤 옛 ref의 클릭을 거절하는지 본다. page API 시험은 입력 응답에서 새 관찰을 받고 새 참조로 값을 확인한다. 참조가 새로워지는 경로와 오래된 참조를 막는 경로를 따로 확인한다.

이 글은 해당 시험과 현재 드라이버·페이지 연산·Broker를 읽은 제작 기록이다. 사용자의 실제 문서를 바꾸며 새 경합 시험을 수행한 것은 아니다. 모든 페이지 변경을 잡는다는 보장도 하지 않는다. 특정 상태 변경을 재현한 근거와 아직 시험하지 않은 변경은 구별한다.

업무 화면의 수정 버전과 비슷한 질문이다

회사 자료를 저장할 때 오래된 화면에서 읽은 버전과 현재 자료가 같은지 확인하는 것처럼 브라우저 조작도 읽은 시점과 행동 시점 사이를 봐야 한다. 화면이 빠르다는 이유로 이 구간의 변화를 없던 일로 취급할 수는 없다.

나는 불필요하게 모든 자료를 매번 새로 만드는 대신 실제 행동의 근거가 되는 참조는 짧게 유지했다. 설명은 재사용할 수 있어도 실행 조건은 현재성을 확인한다. 이 구분이 있어야 에이전트가 편하게 이어 쓰면서도 예전 번호 하나로 새 화면을 조작하지 않는 구조가 된다.