파이썬 Selenium ActionChains 사용법 move_to_element click key_down key_up 완벽 정리
🖱️ 마우스와 키보드를 자유롭게 제어하는 Selenium 중급 기술 가이드
웹 자동화는 단순히 버튼 클릭이나 입력란에 텍스트를 넣는 수준을 넘어 더 정교한 동작 제어가 필요할 때가 많습니다.
특히 로그인 후 메뉴를 펼쳐야 한다든지, 드래그 앤 드롭이나 단축키 입력처럼 사용자의 행동을 그대로 재현해야 하는 경우가 대표적이죠.
이럴 때 꼭 필요한 기능이 바로 ActionChains입니다.
ActionChains는 마우스와 키보드 동작을 시퀀스로 기록하고 실행할 수 있어, 사람처럼 웹을 제어하는 자동화 시나리오를 가능하게 만듭니다.
이번 글에서는 Selenium 중급 기능인 move_to_element, click, key_down, key_up의 사용법을 중심으로 알아보겠습니다.
실제 코드 예제와 함께 어떤 상황에서 활용하면 좋은지, 그리고 주의해야 할 점은 무엇인지도 함께 다루어 보겠습니다.
이를 통해 단순 반복 클릭 자동화에서 벗어나, 사람 손길에 가까운 정교한 웹 자동화를 구현할 수 있을 것입니다.
📋 목차
🖱️ move_to_element로 요소에 마우스 이동하기
웹 페이지 자동화에서 특정 요소 위로 마우스를 가져다 놓는 동작은 생각보다 자주 필요합니다.
예를 들어 드롭다운 메뉴를 펼치거나, 마우스를 올려야 버튼이 활성화되는 경우가 그렇습니다.
이때 사용하는 것이 move_to_element() 메서드입니다.
이 메서드는 원하는 요소를 찾아 마우스를 그 위치로 이동시키는 동작을 수행합니다.
사용법은 매우 직관적입니다.
먼저 ActionChains 객체를 만들고, 이동하고자 하는 요소를 지정한 뒤 perform()을 호출하면 됩니다.
아래는 기본적인 예제 코드입니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://example.com")
menu = driver.find_element("id", "menu-item")
actions = ActionChains(driver)
actions.move_to_element(menu).perform()
위 코드를 실행하면 브라우저가 열리고, menu-item 요소 위로 마우스가 이동하게 됩니다.
이 동작을 통해 드롭다운 메뉴를 자연스럽게 펼치거나, 마우스를 올려야 표시되는 팝업 요소를 제어할 수 있습니다.
💡 TIP: move_to_element()는 보이지 않는 요소에는 동작하지 않기 때문에, 요소가 화면에 표시되도록 scrollIntoView() 같은 스크립트를 병행하면 더 안정적인 자동화를 구현할 수 있습니다.
즉, move_to_element()는 단순한 마우스 이동이 아니라 사람의 행동을 모사하는 데 중요한 역할을 합니다.
정교한 자동화 시나리오를 작성할 때 반드시 익혀 두어야 할 핵심 기능입니다.
👆 click 메서드로 클릭 이벤트 제어하기
웹 자동화에서 가장 기본이 되는 동작은 클릭입니다.
일반적으로 element.click() 메서드를 사용하지만, ActionChains의 click()은 조금 더 세밀한 제어를 제공합니다.
특히 요소 위로 마우스를 이동한 후 자연스러운 클릭을 실행하거나, 복잡한 시퀀스 동작 속에서 클릭을 포함시킬 때 유용합니다.
사용법은 매우 간단합니다.
아래 예제처럼 특정 요소를 클릭하거나, 요소 없이 단순히 현재 마우스 위치를 클릭하는 것도 가능합니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://example.com")
button = driver.find_element("id", "submit-btn")
actions = ActionChains(driver)
# 특정 요소 클릭
actions.click(button).perform()
# 현재 위치 클릭
actions.move_by_offset(100, 200).click().perform()
첫 번째 예제는 submit-btn 요소를 직접 클릭하는 방식이고, 두 번째는 좌표 이동 후 현재 위치를 클릭하는 방식입니다.
이처럼 click()은 단독 동작뿐만 아니라 다른 동작과 조합할 수 있어 활용도가 높습니다.
- 🖱️요소 클릭 → 특정 버튼이나 링크 클릭
- 📍좌표 클릭 → 절대/상대 좌표로 지정된 위치 클릭
- ⚡복합 동작과 함께 연속 실행
⚠️ 주의: 클릭하려는 요소가 페이지에 완전히 로드되지 않았다면 ElementNotInteractableException 오류가 발생할 수 있습니다. 이를 방지하려면 WebDriverWait을 통해 요소가 클릭 가능 상태인지 먼저 확인하세요.
따라서 click()은 단순한 이벤트 실행 이상의 의미를 가지며, 다양한 상황에서 유연하게 적용할 수 있는 ActionChains의 핵심 메서드라 할 수 있습니다.
⌨️ key_down과 key_up으로 키보드 입력 처리하기
웹 자동화를 하다 보면 단순한 텍스트 입력을 넘어 Ctrl+C, Ctrl+V 같은 단축키 조합이나 특정 키를 누른 상태에서 동작을 수행해야 할 때가 있습니다.
이럴 때 사용하는 것이 key_down()과 key_up()입니다.
각각 키를 누르는 동작과 떼는 동작을 의미하며, 두 메서드를 함께 사용하면 실제 사용자가 키보드를 조작하는 것과 같은 효과를 낼 수 있습니다.
아래 예제는 텍스트 상자에 “Hello World”를 입력한 뒤, 전체 선택(CTRL+A) 후 복사(CTRL+C)를 수행하는 코드입니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://example.com")
input_box = driver.find_element("id", "text-field")
input_box.send_keys("Hello World")
actions = ActionChains(driver)
# 전체 선택 (CTRL + A)
actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
# 복사 (CTRL + C)
actions.key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()
위 코드에서 보듯이 key_down()으로 Ctrl 키를 누른 상태를 유지하고, 원하는 키를 입력한 후 key_up()으로 해제합니다.
이 방식을 이용하면 Ctrl+Shift+T 같은 복합 단축키도 문제없이 구현할 수 있습니다.
💬 key_down()과 key_up()은 send_keys()와 함께 사용할 때 진가를 발휘합니다. 단일 키 입력만 필요하다면 send_keys()가 더 간단할 수 있지만, 복합 키 조합에는 ActionChains가 필수적입니다.
이처럼 key_down()과 key_up()은 단축키 자동화, 입력 제어, 브라우저 단축키 시뮬레이션 등 다양한 활용이 가능하므로 Selenium 중급 이상의 단계에서는 반드시 익혀야 하는 기능입니다.
⚙️ ActionChains로 시퀀스 동작 만들기
ActionChains의 가장 큰 장점은 여러 동작을 하나의 시퀀스로 묶어 실행할 수 있다는 점입니다.
단순히 마우스 이동이나 클릭 같은 개별 동작을 넘어서, move_to_element → click → key_down → key_up과 같이 실제 사용자 행동을 그대로 재현하는 시나리오를 만들 수 있습니다.
시퀀스를 작성할 때는 ActionChains 객체를 생성한 후 여러 동작을 순서대로 연결(chain)하면 됩니다.
마지막에 perform()을 호출하면 누적된 모든 동작이 순차적으로 실행됩니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
driver = webdriver.Chrome()
driver.get("https://example.com")
menu = driver.find_element("id", "menu")
input_box = driver.find_element("id", "input-field")
actions = ActionChains(driver)
# 시퀀스 예시: 메뉴에 마우스 올리기 → 클릭 → 텍스트 입력 → 단축키 조합 실행
(actions.move_to_element(menu)
.click()
.send_keys_to_element(input_box, "Selenium Test")
.key_down(Keys.CONTROL)
.send_keys("a")
.key_up(Keys.CONTROL)
.perform())
위 코드에서는 메뉴에 마우스를 올리고 클릭한 후, 입력창에 텍스트를 입력하고 Ctrl+A 단축키로 전체 선택까지 실행합니다.
이 모든 과정이 단일 시퀀스로 실행되므로, 마치 사람이 직접 조작하는 것처럼 자연스러운 흐름을 만들 수 있습니다.
💎 핵심 포인트:
ActionChains는 개별 동작보다는 시퀀스 자동화에 진가를 발휘합니다. 여러 동작을 한 번에 실행하면 코드 가독성도 높아지고, 유지보수도 훨씬 쉬워집니다.
즉, ActionChains는 단순한 이벤트 실행기가 아니라 사용자 행동을 시뮬레이션하는 강력한 도구입니다.
이 기능을 제대로 이해하고 활용하면, 복잡한 자동화 테스트나 시뮬레이션 작업을 훨씬 효율적으로 처리할 수 있습니다.
💡 실제 자동화 시나리오 예시
지금까지 move_to_element, click, key_down, key_up의 개별 기능을 살펴보았습니다.
이제 이를 조합해 실제로 활용할 수 있는 시나리오를 만들어 보겠습니다.
아래는 로그인 후 검색창에 텍스트를 입력하고, 검색 결과 중 첫 번째 항목을 클릭하는 자동화 예제입니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 로그인 입력창 찾기
username = driver.find_element("id", "username")
password = driver.find_element("id", "password")
login_btn = driver.find_element("id", "login-btn")
# 로그인 입력 및 버튼 클릭
username.send_keys("my_id")
password.send_keys("my_password")
login_btn.click()
time.sleep(2) # 로그인 후 페이지 로딩 대기
# 검색창 및 첫 번째 결과 요소 찾기
search_box = driver.find_element("id", "search")
first_result = driver.find_element("css selector", ".result-item:first-child")
actions = ActionChains(driver)
# 검색어 입력 후 엔터 실행
(actions.move_to_element(search_box)
.click()
.send_keys("Selenium ActionChains")
.key_down(Keys.ENTER)
.key_up(Keys.ENTER)
.perform())
time.sleep(2) # 검색 결과 로딩 대기
# 첫 번째 결과 클릭
actions.move_to_element(first_result).click().perform()
이 시나리오에서는 로그인, 검색어 입력, 검색 실행, 결과 선택까지의 일련의 과정을 ActionChains를 활용해 매끄럽게 처리합니다.
실제 사용자 경험과 유사하게 동작하므로 테스트 자동화나 웹 크롤링에서 안정적으로 활용할 수 있습니다.
| 동작 | 설명 |
|---|---|
| move_to_element | 검색창, 결과 항목 등 요소로 마우스 이동 |
| click | 검색창 활성화 및 결과 클릭 |
| key_down / key_up | 엔터 입력을 통해 검색 실행 |
이처럼 개별 메서드들을 유기적으로 조합하면 실제 사용자와 거의 동일한 수준의 자동화를 구축할 수 있습니다.
이를 활용하면 단순 테스트뿐 아니라 업무 효율화, QA 자동화, 데이터 수집 등 다양한 목적에 맞게 확장할 수 있습니다.
❓ 자주 묻는 질문 (FAQ)
move_to_element와 element.click()의 차이는 무엇인가요?
click() 메서드는 어떤 상황에서 더 유용한가요?
key_down과 send_keys의 차이는 뭔가요?
ActionChains를 사용할 때 가장 흔히 발생하는 오류는 무엇인가요?
복잡한 동작 시퀀스를 만들면 성능에 문제가 생기나요?
Selenium ActionChains로 드래그 앤 드롭도 가능한가요?
키보드 입력 자동화에서 한글 입력도 지원되나요?
ActionChains는 어떤 경우에 꼭 필요할까요?
🚀 Selenium ActionChains로 완성하는 자연스러운 웹 자동화
이번 글에서는 Selenium의 ActionChains를 활용해 move_to_element, click, key_down, key_up 기능을 다루었습니다.
이 네 가지 메서드는 단순한 이벤트 실행을 넘어 실제 사용자 행동을 그대로 재현할 수 있도록 도와줍니다.
마우스를 특정 요소 위로 올려 드롭다운을 열고, 클릭을 통해 인터랙션을 실행하며, 키보드 단축키 조합으로 입력 제어까지 가능하게 해줍니다.
또한 ActionChains의 강력한 기능인 시퀀스 실행을 통해 여러 동작을 하나의 흐름으로 묶어, 마치 사람이 브라우저를 직접 다루는 것처럼 자연스러운 자동화를 구현할 수 있습니다.
이러한 특징 덕분에 ActionChains는 QA 자동화, 반복 테스트, 업무 효율화, 웹 크롤링 등 다양한 분야에서 필수적인 도구로 활용되고 있습니다.
앞으로 Selenium을 통해 더 복잡한 자동화를 진행할 계획이라면, ActionChains는 반드시 익혀야 할 중급 이상의 핵심 기능입니다.
기본 문법을 넘어 시퀀스를 적절히 조합하고, 예외 처리를 통해 안정성을 확보한다면 훨씬 강력하고 유연한 자동화 환경을 구축할 수 있을 것입니다.
🏷️ 관련 태그 : Selenium, 파이썬자동화, 웹테스트, ActionChains, move_to_element, click, key_down, key_up, QA자동화, 웹크롤링