AI가 스스로 고치는 Selenium Self‑Healing 테스트를 만들었습니다 (방법은 여기)

발행: (2025년 12월 11일 오전 03:33 GMT+9)
9 min read
원문: Dev.to

Source: Dev.to

Selenium Self-Healing Demo

모든 QA 자동화 엔지니어가 직면하는 문제

완벽한 Selenium 테스트를 금요일에 작성합니다. 월요일 아침에 테스트가 실패합니다. 개발자가 버튼 ID를 submit-btn에서 submit-button으로 바꿨기 때문이죠. 테스트가 깨졌고, 새로운 기능을 테스트하기보다 로케이터를 고치는 데 시간을 소비하고 있습니다.

익숙한가요? 저도 여러 번 겪었습니다. 그래서 AI가 자동으로 깨진 로케이터를 고쳐주는 프레임워크를 만들었습니다—이제 유지보수 악몽은 끝났습니다.

테스트가 스스로 회복한다면?

전통적인 테스트:
테스트 실행 → 요소를 찾을 수 없음 → 테스트 실패 → 수동으로 고침

셀프‑힐링 테스트:
테스트 실행 → 요소를 찾을 수 없음 → AI가 페이지 분석 → AI가 새로운 로케이터 찾음 → 테스트 계속 진행

두 번째 시나리오가 이제 가능해졌으며, 어떻게 구현하는지 정확히 보여드리겠습니다.

나의 솔루션: AI‑구동 셀프‑힐링

다음 요소들을 결합한 프레임워크를 만들었습니다:

  • 가독성 높은 테스트를 위한 Behavior‑Driven Development (BDD)
  • 브라우저 자동화를 위한 Selenium
  • 지능형 로케이터 수정을 위한 로컬 AI

가장 좋은 점? 무료 오픈‑소스 도구만으로 여러분의 머신에서 완전히 실행됩니다.

실제 예시

Gherkin 시나리오

Scenario: Search Wikipedia
    Given I navigate to "https://www.wikipedia.org"
    When I search for "Selenium"
    Then the page should contain "Selenium"

의도적으로 잘못된 로케이터

private readonly By _searchBox = By.Id("searchBox");  // Wrong!
// The real ID is "searchInput"

테스트 실행 시:

  1. By.Id("searchBox") 로 요소 찾기 시도 → ❌ 실패
  2. AI가 페이지 HTML을 분석 → 적절한 로케이터 찾음
  3. 테스트가 새로운 로케이터 사용 → ✅ 성공

인간 개입 없이 테스트가 스스로 회복됩니다.

실제 동작 방식

아키텍처

  1. Layer 1 – 테스트 (BDD) – 테스트는 누구나 읽을 수 있는 Gherkin으로 작성됩니다.
  2. Layer 2 – 셀프‑힐링 엔진 – 로케이터가 실패하면 페이지 HTML을 캡처하고 컨텍스트와 함께 AI에 전송합니다.
  3. Layer 3 – AI – 로컬에서 실행(e.g., Ollama 또는 GPT)되며 제공된 설명을 기반으로 새로운 로케이터를 제안합니다.

코드 흐름

// Step 1: Normal element finding
try
{
    return driver.FindElement(locator);
}
catch (NoSuchElementException)
{
    // Element not found - activate self‑healing
}

// Step 2: Ask AI for help
var pageHTML = driver.PageSource;
var suggestion = await aiClient.GetSuggestedLocator(
    pageHTML,
    failedLocator,
    "Search box"  // Human description
);

// Step 3: Try AI's suggestion
var element = driver.FindElement(By.XPath(suggestion));
// Success!

전체 과정은 약 2~3초가 소요됩니다.

이 접근법이 효과적인 이유

  • 컨텍스트 인식: AI가 “로그인 버튼”과 같은 요소 설명을 이해하고 관련 매치를 찾아냅니다.
  • 학습 필요 없음: HTML에 대한 모델의 일반 지식을 활용하므로 별도 머신러닝 학습이 필요 없습니다.
  • 무료·프라이빗: 모든 것이 로컬에서 실행되므로 API 비용이 없고, 데이터가 네트워크를 떠나지 않습니다(특히 Ollama 사용 시).
  • 언어에 구애받지 않음: React, Angular, Vue, 순수 HTML 등 어디서든 동작합니다. AI는 렌더링된 HTML만 읽으면 됩니다.

설정 방법 (사실 매우 간단)

Step 1 – 사전 요구사항 설치

  • .NET 9 SDK (무료)
  • Ollama(무료, 로컬 AI) 혹은 OpenAI API 키
  • Chrome 브라우저

Step 2 – AI 모델 다운로드

ollama pull qwen3-coder:480b-cloud

Step 3 – 데모 실행

dotnet restore
dotnet build
dotnet test

세 가지 명령만으로 AI 셀프‑힐링을 직접 확인할 수 있습니다.

구축하면서 배운 점

  • AI는 컨텍스트가 필요: “search box”와 같은 설명을 제공하는 것이 정확한 제안을 얻는 핵심입니다.
  • 로컬 AI도 충분히 훌륭: Qwen3‑Coder 같은 무료 모델이 로케이터 수정에 매우 잘 동작합니다.
  • 재시도 로직이 중요: 여러 재시도 전략을 구현해 성공률을 약 70 %에서 95 %로 끌어올렸습니다.
  • Temperature 설정이 핵심: 낮은 temperature(예: 0.1)를 사용하면 일관되고 재현 가능한 로케이터 제안을 얻을 수 있습니다.

언제 사용하면 좋은가?

적합한 사용 사례

  • 자주 깨지는 회귀 테스트 스위트
  • UI가 빠르게 변하는 애플리케이션
  • “마법” 같은 데모가 필요한 상황
  • QA 인력이 제한된 팀

비추천 상황

  • 프로덕션 모니터링(속도 문제)
  • 성능 테스트(AI가 오버헤드 발생)
  • 픽셀‑정밀 요소 선택이 필수인 경우
  • 절대로 오탐이 발생하면 안 되는 테스트

기술 상세

AI 연동

간단한 HTTP 클라이언트가 Ollama API와 통신합니다:

var response = await httpClient.PostAsync(
    "http://localhost:11434/api/generate",
    jsonContent
);

프롬프트 예시

You are a Selenium expert.
This locator failed: By.Id('searchBox')
Element description: Search input box
Here's the HTML: [truncated HTML]
Suggest a new locator that will work.
Return only the locator, nothing else.

캐싱 전략

같은 페이지에서 같은 로케이터가 두 번 실패하면 이전 AI 제안을 재사용해, 반복 실패 시 힐링 시간을 약 90 % 단축합니다.

오류 처리

모든 AI 시도가 실패하면 테스트는 일반적인 오류 메시지와 함께 정상적으로 실패합니다—묵인된 실패는 없습니다.

프레임워크 확장하기

  • 새 사이트 추가: 영어로 된 피처 파일을 하나 만들면 셀프‑힐링이 자동으로 적용됩니다.
  • 다른 AI 사용: 설정 파일 하나만 바꾸면 OpenAI로 전환할 수 있습니다:
{
  "Provider": "OpenAI",
  "ApiKey": "sk-your-key",
  "Model": "gpt-4o"
}
  • 힐링 로직 커스터마이징: 엔진은 확장 가능하도록 설계되어 있어, 특정 요소 유형에 대한 맞춤 전략을 추가할 수 있습니다.

직접 해보세요

전체 프레임워크는 다음을 포함합니다:

  • 자세히 주석 달린 코드
  • 작동하는 데모 테스트
  • 설정 가이드
  • 문서화

모두 초보자를 위해 설계되었습니다. Selenium 테스트를 한 번도 작성해 본 적이 없어도 10분 안에 실행할 수 있습니다. 저장소에는 의도적으로 잘못된 로케이터를 넣은 Wikipedia 검색 테스트가 포함돼 있어, AI가 실시간으로 이를 고치는 모습을 확인할 수 있습니다.

GitHub Repo:

Back to Blog

관련 글

더 보기 »