Skip to content

핵심 API 레퍼런스 ​

Mbbrowser 브라우저의 제어권을 가져온 후 가장 중요한 작업은 사용자의 의도대로 페이지를 조작하도록 Selenium에 명령을 내리는 것입니다. 이 장에서는 실무에서 80% 이상 사용되는 핵심 API들을 쉬운 용어로 설명합니다.


1. 탐색 및 페이지 제어 ​

URL 열기 ​

python
driver.get("https://www.amazon.com")
  • 쉬운 설명: 브라우저에게 "이 주소로 가라"고 말하는 것입니다.
  • 스크립트는 페이지 로드가 완료(onload 이벤트 발생)될 때까지 여기서 대기한 후 다음 코드를 실행합니다.

페이지 로드 대기 ​

네트워크 속도는 상황마다 다릅니다. 페이지 렌더링이 끝나기 전에 다음 코드가 실행되면 요소를 찾지 못해 오류가 발생합니다. 가장 안정적인 방법은 스마트 대기(3장 참조)를 사용하는 것입니다.

페이지 정보 가져오기 ​

python
title = driver.title                  # 페이지 제목 가져오기
url   = driver.current_url           # 현재 URL 가져오기
html  = driver.page_source           # 전체 페이지 HTML 소스 가져오기

뒤로, 앞으로, 새로고침 ​

python
driver.back()     # 뒤로 가기 (브라우저 뒤로 가기 버튼과 동일)
driver.forward()  # 앞으로 가기
driver.refresh()  # 페이지 새로고침 (F5)

2. 페이지 요소 찾기 (Locating Elements) ​

IMPORTANT

요소를 찾는 것은 모든 조작의 전제 조건입니다. 요소를 찾지 못하면 클릭도, 입력도 할 수 없습니다.

위치 지정 방식 (Locator) 빠른 가이드 ​

Selenium 4는 By 클래스를 사용하여 위치 지정을 표준화합니다.

python
from selenium.webdriver.common.by import By
위치 지정 방법코드 예시최적의 사용 사례
IDBy.ID, "username"가장 빠르고 안정적입니다. 우선순위 1순위.
CSS 선택자By.CSS_SELECTOR, "#username"유연하며 가장 보편적으로 사용됩니다.
XPathBy.XPATH, "//input[@name='user']"복잡한 구조를 찾을 때 필수적이지만 작성이 복잡합니다.
클래스 이름 (Class Name)By.CLASS_NAME, "btn-primary"간단한 경우에 유용하지만 이름 중복에 주의해야 합니다.
태그 이름 (Tag Name)By.TAG_NAME, "input"단독으로는 거의 사용되지 않습니다.
링크 텍스트 (Link Text)By.LINK_TEXT, "로그인"링크를 클릭할 때 편리합니다.
Name 속성By.NAME, "password"양식(Form) 요소에서 흔히 사용됩니다.

단일 요소 찾기 ​

python
# id가 "username"인 요소 하나 찾기 (찾지 못하면 NoSuchElementException 발생)
element = driver.find_element(By.ID, "username")

# CSS 선택자와 일치하는 첫 번째 버튼 찾기
btn = driver.find_element(By.CSS_SELECTOR, ".login-form button[type='submit']")

여러 요소 찾기 (리스트 반환) ​

python
# 모든 상품 목록 아이템 찾기
items = driver.find_elements(By.CSS_SELECTOR, ".product-item")
print(f"총 {len(items)}개의 상품을 찾았습니다.")

# 각 요소를 순회하며 텍스트 출력
for item in items:
    print(item.text)

브라우저에서 선택자(Selector)를 찾는 방법 (꿀팁) ​

  1. Mbbrowser에서 대상 페이지를 엽니다.
  2. 조작하려는 버튼이나 입력창에서 **마우스 오른쪽 버튼 클릭 → 검사(Inspect)**를 선택합니다.
  3. 개발자 도구의 HTML 코드에서 마우스 오른쪽 버튼 클릭 → Copy → Copy selector (CSS 선택자) 또는 Copy XPath를 선택합니다.
  4. 이를 Selenium 코드에 붙여넣습니다.

3. 대기 메커니즘 (프로그램 중단 방지 도구) ​

CAUTION

time.sleep(N)은 가장 비효율적인 대기 방식입니다. 네트워크가 빠를 때는 시간을 낭비하고, 느릴 때는 여전히 오류가 발생할 수 있습니다. Selenium의 스마트 대기 기능을 사용하세요.

명시적 대기 (Explicit Wait - 강력 권장) ​

특정 조건이 충족될 때까지만 기다리고, 조건이 맞으면 즉시 다음으로 넘어갑니다. 지정된 시간(N초)이 지나도 조건이 충족되지 않으면 오류를 발생시킵니다.

python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# id가 "username"인 요소가 보일 때까지 최대 15초간 대기
wait = WebDriverWait(driver, 15)
username_input = wait.until(
    EC.visibility_of_element_located((By.ID, "username"))
)

자주 사용하는 대기 조건 EC.xxx:

대기 조건설명
EC.presence_of_element_located요소가 DOM에 존재할 때 (보이지 않아도 됨).
EC.visibility_of_element_located요소가 존재하고 실제로 화면에 보일 때 (권장).
EC.element_to_be_clickable요소가 보이고 클릭이 가능할 때.
EC.text_to_be_present_in_element특정 요소 내에 지정한 텍스트가 나타날 때.
EC.url_contains현재 URL에 특정 문자열이 포함될 때.
EC.alert_is_present알림창(팝업)이 나타날 때.

활용 예시: 로그인 후 페이지 이동 대기

python
# 로그인 버튼 클릭
driver.find_element(By.ID, "loginBtn").click()

# URL에 "/dashboard"가 포함될 때까지 대기 (성공적인 이동을 의미)
wait = WebDriverWait(driver, 20)
wait.until(EC.url_contains("/dashboard"))
print("로그인 후 페이지 이동 성공!")

암시적 대기 (Implicit Wait - 전역 설정, 비권장) ​

python
driver.implicitly_wait(10)  # 전역 설정: 모든 find_element 호출 시 최대 10초 대기.

4. 사람처럼 조작하기 (Interaction) ​

텍스트 입력 ​

python
# 입력창을 지우고 계정 입력
import time

input_box = driver.find_element(By.ID, "username")
input_box.clear()           # 기존 내용 지우기
input_box.send_keys("mbbrowser_user")  # 텍스트 입력

# 실제 사람처럼 타이핑하기 (글자마다 약간의 지연 추가)
def human_type(element, text, delay=0.08):
    """사람의 타이핑 속도를 흉내 내어 글자마다 지연 시간을 둡니다."""
    for char in text:
        element.send_keys(char)
        time.sleep(delay)

클릭하기 ​

python
btn = driver.find_element(By.CSS_SELECTOR, "button[type='submit']")
btn.click()

키보드 키 입력 시뮬레이션 ​

python
from selenium.webdriver.common.keys import Keys

# 엔터키 입력 (검색창 등에서 흔히 사용)
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("Mbbrowser")
search_box.send_keys(Keys.RETURN)

# 전체 선택 + 삭제
input_box.send_keys(Keys.CONTROL + "a")  # Ctrl+A
input_box.send_keys(Keys.DELETE)          # Del

드롭다운 선택 ​

python
from selenium.webdriver.support.ui import Select

# 보이는 텍스트로 선택
select = Select(driver.find_element(By.ID, "country"))
select.select_by_visible_text("USA")

# value 속성값으로 선택
select.select_by_value("US")

# 인덱스로 선택 (0부터 시작)
select.select_by_index(2)

호버 (마우스 올리기) ​

python
from selenium.webdriver.common.action_chains import ActionChains

menu_item = driver.find_element(By.ID, "topMenu")
ActionChains(driver).move_to_element(menu_item).perform()  # 마우스를 요소 위로 이동

드래그 앤 드롭 ​

python
source = driver.find_element(By.ID, "drag_item")
target = driver.find_element(By.ID, "drop_zone")
ActionChains(driver).drag_and_drop(source, target).perform()

5. 요소 정보 가져오기 ​

python
el = driver.find_element(By.ID, "user-info")

# 화면에 보이는 텍스트 가져오기
text = el.text

# 특정 속성값 가져오기
href  = el.get_attribute("href")
value = el.get_attribute("value")
cls   = el.get_attribute("class")

# 상태 확인
el.is_displayed()   # 보이고 있는가?
el.is_enabled()     # 활성화되어 있는가? (사용 가능한 버튼인지 등)
el.is_selected()    # 체크박스/라디오 버튼이 선택되었는가?

# CSS 속성값 가져오기
color = el.value_of_css_property("color")

6. 쿠키 조작 ​

Mbbrowser 환경은 쿠키를 영구 저장하지만, 코드로도 제어할 수 있습니다.

python
# 모든 쿠키 가져오기
all_cookies = driver.get_cookies()
print(all_cookies)

# 쿠키 추가 (해당 도메인의 URL을 먼저 한 번 열어야 합니다)
driver.get("https://example.com")
driver.add_cookie({
    "name": "session_id",
    "value": "abc123",
    "domain": ".example.com"
})

# 특정 쿠키 삭제
driver.delete_cookie("session_id")

# 모든 쿠키 삭제
driver.delete_all_cookies()

7. 알림창(팝업) 처리 ​

python
# 알림창이 나타날 때까지 대기
wait.until(EC.alert_is_present())

# 알림창 개체로 전환
alert = driver.switch_to.alert

# 알림창의 텍스트 읽기
print(alert.text)

# 확인 클릭 (Accept)
alert.accept()

# 취소 클릭 (Dismiss)
alert.dismiss()

# 프롬프트 창에 텍스트 입력
alert.send_keys("내 입력 내용")
alert.accept()

8. 멀티 탭 / 멀티 창 조작 ​

python
# 새 탭 열기
driver.switch_to.new_window("tab")

# 모든 창 핸들 가져오기
handles = driver.window_handles
print(f"전체 탭 개수: {len(handles)}")

# 특정 탭으로 전환
driver.switch_to.window(handles[-1])   # 마지막에 열린(최신) 탭으로 전환

# 첫 번째 탭으로 전환
driver.switch_to.window(handles[0])

9. iframe 전환 ​

로그인 창이나 광고 등은 가끔 iframe 태그 내에 들어있습니다. 이 경우 iframe 안으로 제어권을 먼저 옮겨야 요소를 찾을 수 있습니다.

python
# CSS 선택자로 iframe을 찾아 그 안으로 전환
iframe = driver.find_element(By.CSS_SELECTOR, "iframe#loginFrame")
driver.switch_to.frame(iframe)

# 이제 iframe 내부의 요소를 조작할 수 있습니다
driver.find_element(By.ID, "username").send_keys("my_user")

# 작업이 끝나면 다시 메인 페이지로 돌아옵니다
driver.switch_to.default_content()

10. 스크린샷 ​

python
# 전체 화면 스크린샷 저장
driver.save_screenshot("screenshot.png")

# 특정 요소만 스크린샷 저장
element = driver.find_element(By.ID, "product-image")
element.screenshot("product.png")

# 바이너리 데이터로 직접 가져오기 (DB 저장 등에 유용)
png_bytes = driver.get_screenshot_as_png()

11. JavaScript 주입 (고급) ​

요소가 클릭되지 않거나(다른 요소에 가려짐), JS에 의해 차단된 경우 JS를 직접 실행하여 우회할 수 있습니다.

python
# JS를 이용한 강제 클릭
driver.execute_script("arguments[0].click();", element)

# 특정 요소 위치로 스크롤 이동
driver.execute_script("arguments[0].scrollIntoView();", element)

# 페이지 맨 아래로 스크롤
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# 입력창의 값을 강제로 수정 (Read-only 필드 우회 등)
driver.execute_script("arguments[0].value = 'new_value';", input_element)

# JS 실행 결과값 가져오기
title = driver.execute_script("return document.title;")

TIP

이 정도 API만 마스터해도 거의 모든 시나리오를 처리할 수 있습니다! 다음 장 실전 사례 가이드에서는 자동 로그인, 데이터 수집, 병렬 처리 등 실무에서 즉시 활용 가능한 4가지 템플릿을 제공합니다.