AI가 만든 Selenium 테스트, sleep을 늘려도 실패하는 이유
AI가 짜 준 Selenium 테스트가 가끔 실패해 sleep을 5초에서 10초로 늘렸더니, 한 번 통과하고 다음 실행에서 또 깨진다. 시간 대신 무엇을 기다리게 해야 할까?

- sleep은 시간을 보낼 뿐, 다음 동작에 필요한 화면 상태를 확인하지 않는다.
- 요소의 존재·표시·활성화와 클릭 뒤 결과를 각각 필요한 조건으로 기다려야 한다.
- AI에게 실패한 조건을 찾게 하고, 암시적 대기 혼용과 테스트 간 세션 공유도 검토해야 한다.
5초를 기다렸다는 사실은 버튼이 준비됐다는 뜻이 아니다
Selenium 테스트가 가끔 실패할 때 time.sleep(5)를 10초로 바꾸면 통과할 수는 있다. 하지만 코드가 기다린 것은 시간이지 버튼의 준비 상태가 아니다. 실행 환경이 더 느려지면 다시 실패하고, 빨리 준비된 실행에서도 정해진 시간을 전부 소비한다.
Selenium의 대기 문서는 페이지 로딩 완료 뒤에도 자바스크립트가 화면을 바꿀 수 있다고 설명한다. 페이지를 열었다는 사실만으로 다음 입력란이나 결과가 준비됐다고 판단할 수 없는 이유다. 명시적 대기는 필요한 조건을 반복해서 검사하고, 제한 시간 안에 참이 되면 다음 줄로 진행한다.
이 문제는 AI가 작성한 테스트의 검토 기준이기도 하다. Selenium의 David Burns는 9월 29일 공개한 글에서 코딩 에이전트가 오래된 Selenium 예제의 패턴을 재생산한다고 지적했다. 그가 꼽은 사례에는 고정 대기와 불안정한 XPath가 포함된다.
존재·표시·클릭 가능 조건은 서로 다르다
다음 동작이 무엇인지에 따라 기다릴 조건이 달라진다. Python의 expected_conditions는 이를 구별한다.
| 조건 | 확인하는 상태 |
|---|---|
presence_of_element_located | 요소가 DOM에 존재한다. 화면에 보일 필요는 없다. |
visibility_of_element_located | 요소가 표시되고 너비·높이가 0보다 크다. |
element_to_be_clickable | 요소가 보이고 활성화돼 있다. |
text_to_be_present_in_element | 지정한 요소에 기대한 문자열이 들어 있다. |
따라서 버튼을 찾았다고 바로 클릭하는 코드와, 버튼이 보이고 활성화될 때까지 기다리는 코드는 다르다. 클릭 가능 조건을 통과했다고 저장까지 끝난 것도 아니다. 버튼을 누르는 단계와 저장 결과를 읽는 단계에는 각각의 대기가 필요하다.
클릭 뒤에는 결과 메시지를 따로 기다린다
다음은 이미 열린 페이지의 driver를 사용하는 설명용 예제다. save-button, save-status, Saved는 실제 서비스의 요소와 완료 문구로 바꿔야 한다. 10초는 예제의 최대 대기시간이다.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
button = wait.until(
EC.element_to_be_clickable((By.ID, "save-button"))
)
button.click()
wait.until(
EC.text_to_be_present_in_element((By.ID, "save-status"), "Saved")
) 이 예제는 클릭 준비와 완료 표시를 분리하는 패턴이다. 이전 작업의 Saved 문구가 그대로 남는 화면이라면 새 저장의 완료를 구분할 조건으로 바꿔야 한다. 메시지의 존재만 확인해서는 이번 작업이 끝났는지 알 수 없다.
implicitly_wait를 함께 설정했는지도 살펴야 한다. 암시적 대기는 요소를 찾는 호출에 적용되며, 요소를 찾으면 바로 반환한다. 고정 sleep이 아니다. 공식 대기 문서는 명시적 대기와 섞으면 예상하기 어려운 대기시간이 생길 수 있다고 경고한다.
AI에게 시간을 늘리기 전에 실패한 조건을 찾게 한다
Selenium의 AI 에이전트 가이드는 실패할 때 아직 참이 아니었던 조건을 찾도록 요구한다. 실제 화면에서 locator를 확인하고, 개별 테스트를 실행해 수정한 뒤 여러 번 실행해 보는 절차도 제시한다. 한 번 통과했다는 이유만으로 간헐적 실패가 사라졌다고 판단해서는 안 된다.
테스트가 다른 테스트의 상태를 이어받는지도 별도 문제다. Selenium은 테스트마다 새 WebDriver로 시작하는 방식을 권장한다. 이전 테스트의 세션에 기대고 있다면 대기 조건만 고쳐서는 시작 상태의 차이를 없앨 수 없다.
수정안을 받을 때는 “몇 초 늘렸는가”보다 “어떤 상태가 돼야 다음 줄이 실행되는가”를 읽어야 한다. 클릭할 준비와 작업의 완료가 코드에 구체적으로 드러나야 실패 지점도 좁힐 수 있다.