Ruby 코드만으로 웹 브라우저를 직접 조종할 수 있다는 사실을 알고 계셨나요?
Watir 젬(gem)을 사용하면 이것이 가능합니다.
게다가 최신 브라우저의 강력한 기능을 그대로 활용할 수 있습니다:
- 페이지의 보이는 영역을 스크린샷으로 캡처할 수 있습니다
- 개발자 도구를 열고 코드를 직접 입력할 필요 없이, 어떤 페이지에서든 JavaScript를 실행할 수 있습니다
- 링크를 찾아 클릭하고, 입력 필드에 텍스트를 자동으로 채워 넣을 수도 있습니다
이 모든 기능은 Watir와 Selenium 프로젝트 덕분에 사용할 수 있습니다.
지금부터 실제 코드 예제를 통해 하나씩 살펴보겠습니다!
브라우저 실행하기
먼저 다음과 같이 브라우저 객체를 생성합니다:
require 'watir' browser = Watir::Browser.new
이 코드를 실행하면 빈 Chrome 창이 열립니다(Chrome이 설치되어 있어야 합니다). 이제 이 창을 코드로 제어할 수 있습니다.
예를 들어, 다음과 같이 특정 URL로 이동할 수 있습니다:
browser.goto("rubyguides.com")
Chrome이 해당 URL로 이동하고, 마치 직접 주소창에 입력한 것처럼 페이지가 로드됩니다.
이제부터가 핵심입니다.
평소 마우스와 키보드로 웹사이트에서 하던 모든 작업을 코드로 수행할 수 있습니다.
예를 들어 링크를 찾아서 클릭하는 것도 가능합니다:
browser.link(text: "All Posts").click
Watir로 요소 찾는 방법
Watir는 요소의 속성을 기준으로 원하는 요소를 찾을 수 있습니다:
- text (텍스트)
- class (클래스)
- id (아이디)
각 요소는 HTML 태그 이름과 일치하는 메서드를 가지고 있습니다. H1 태그를 찾으려면 h1, 문단은 p, 이미지는 img 또는 images 메서드를 사용하면 됩니다.
예제:
browser.h1(text: "Ruby Post Index")
메서드 이름의 복수형을 사용하면 여러 요소를 한 번에 가져올 수도 있습니다.
예제:
browser.links browser.images browser.h2s
이렇게 하면 Watir::AnchorCollection 객체가 반환되며, each, map, inject 같은 Ruby 컬렉션 메서드를 그대로 사용할 수 있습니다.
예제:
browser.links.map(&:href)
타임아웃과 존재하지 않는 요소 처리하기
요소가 페이지에 존재하지 않는 경우가 발생할 수 있습니다. 아직 로드되지 않았거나, 페이지 구조가 변경되었을 수 있죠.
Watir가 요소를 찾지 못하면 어떻게 될까요?
타임아웃이 발생합니다.
기본값은 30초이며, 다음과 같이 변경할 수 있습니다:
Watir.default_timeout = 10
타임아웃이 만료되면 Watir::Exception::UnknownObjectException 예외가 발생합니다.
하지만 더 안전한 방법도 있습니다!
클릭이나 다른 작업을 수행하기 전에 요소가 존재하는지 먼저 확인하는 것입니다.
방법은 다음과 같습니다:
link = browser.link(text: 'Guides') if link.present? link.click end
스크린샷 찍는 방법
브라우저를 열고 페이지를 로드한 후에는 화면을 캡처할 수 있습니다.
다음과 같이 하면 됩니다:
browser.screenshot.save("/tmp/screen.png")
이 코드는 현재 뷰포트(viewport)의 이미지를 지정한 경로에 저장합니다.
JavaScript 스크립트 실행하기
브라우저에서 JavaScript를 실행하여 페이지의 현재 상태를 변경하거나, 페이지에 정의된 JavaScript 함수를 호출할 수 있습니다.
실행 방법:
browser.execute_script "alert('bacon')"
# nil
결과는 어떨까요?
"bacon"이라는 문구가 담긴 알림 창이 나타납니다 🙂
코드를 실행하고 결과값까지 받아올 수도 있습니다:
browser.execute_script "return 1 + 1" # 2
입력 필드에 텍스트 입력하기
입력 필드를 채우는 과정은 두 단계로 이루어집니다:
- 요소를 찾는다
- 키를 전송한다
예제:
browser.input(id: "search").send_keys("orange juice")
텍스트를 입력한 후에는 검색 버튼 등 제출(submit) 버튼을 찾아 클릭하면 됩니다.
유용한 Watir 메서드와 팁
Watir는 개발 편의를 위한 다양한 메서드를 제공합니다.
현재 URL 가져오기:
browser.url
열려 있는 탭 목록 조회하기:
browser.windows
현재 창 최대화하기:
browser.window.maximize
현재 페이지의 텍스트와 HTML 가져오기:
browser.text browser.html
추가 팁: 부분 일치로 요소를 찾고 싶다면 정규표현식(regexp)을 활용할 수 있습니다.
예제:
browser.p(text: /ruby/)
마무리
이번 튜토리얼에서는 Ruby 젬인 Watir에 대해 알아보았습니다. Watir를 사용하면 웹 브라우저를 원격으로 제어하여 반복 작업을 자동화하고, 웹 페이지에서 필요한 정보를 추출할 수 있습니다.
이 글이 도움이 되셨다면 주변에 공유해 주세요. 더 많은 분들이 유용하게 활용할 수 있습니다!
읽어주셔서 감사합니다.