Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby에서 Watir로 웹 브라우저 자동 제어하기: 완벽 가이드

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

입력 필드에 텍스트 입력하기

입력 필드를 채우는 과정은 두 단계로 이루어집니다:

  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를 사용하면 웹 브라우저를 원격으로 제어하여 반복 작업을 자동화하고, 웹 페이지에서 필요한 정보를 추출할 수 있습니다.

이 글이 도움이 되셨다면 주변에 공유해 주세요. 더 많은 분들이 유용하게 활용할 수 있습니다!

읽어주셔서 감사합니다.