파이썬 Selenium ActionChains 활용법 드래그앤드롭 슬라이더 키 콤보 완벽 가이드
🚀 웹 자동화에서 가장 많이 쓰이는 ActionChains 예제를 한눈에 배우세요
웹 브라우저를 자동으로 제어할 수 있는 파이썬 Selenium은 크롤링이나 테스트 자동화 분야에서 이미 필수 도구처럼 자리잡았습니다.
하지만 버튼 클릭이나 텍스트 입력 같은 단순 동작을 넘어, 드래그앤드롭, 슬라이더 조절, 키보드 단축키 입력까지 가능하다는 사실을 알고 계셨나요.
이런 고급 동작을 구현할 때 꼭 필요한 것이 바로 ActionChains 클래스입니다.
막상 사용하려 하면 문서만으로는 이해가 쉽지 않아 어려움을 겪는 경우가 많습니다.
그래서 이 글에서는 실무에서 자주 활용되는 예제를 중심으로 설명하여 바로 따라 해볼 수 있도록 정리했습니다.
ActionChains를 활용하면 웹 애플리케이션 테스트 자동화의 범위가 훨씬 넓어집니다.
특히 복잡한 UI 요소를 다루거나 사용자의 실제 동작을 시뮬레이션해야 할 때 강력한 도구가 됩니다.
이 글에서는 드래그앤드롭, 슬라이더 조절, 키보드 단축키 입력 같은 대표적인 시나리오를 다루며, 코드를 그대로 실행할 수 있도록 예제를 제공합니다.
앞으로 Selenium을 활용해 보다 정교한 자동화를 하고 싶다면 꼭 참고하시길 바랍니다.
📋 목차
🖱️ 드래그앤드롭 기능 구현
웹 페이지 상에서 파일 업로드, 위젯 이동, 리스트 정렬 등은 대부분 드래그앤드롭 방식으로 이루어집니다.
Selenium의 ActionChains를 활용하면 사용자의 마우스 동작을 그대로 흉내 낼 수 있어 이런 기능을 자동화하기에 최적화되어 있습니다.
단순한 클릭과는 달리, 요소를 집어 올리고 다른 위치에 놓는 과정을 코드로 작성해야 하기 때문에 ActionChains의 체인 방식 호출이 중요합니다.
아래 예제는 특정 요소를 선택해서 다른 영역으로 드롭하는 방법을 보여줍니다.
특히 테스트 자동화 과정에서 UI 요소의 위치 이동을 검증하거나, 시뮬레이션 기반의 작업을 수행할 때 유용하게 활용됩니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
driver = webdriver.Chrome()
driver.get("https://jqueryui.com/droppable/")
driver.switch_to.frame(0) # 프레임 전환
source = driver.find_element("id", "draggable")
target = driver.find_element("id", "droppable")
actions = ActionChains(driver)
actions.drag_and_drop(source, target).perform()
위 코드를 실행하면, 드래그 가능한 요소가 목표 영역으로 이동하게 됩니다.
ActionChains의 drag_and_drop() 메서드를 사용하면 내부적으로 클릭-홀드-이동-릴리즈 과정을 순차적으로 처리해 주기 때문에 훨씬 간단하게 구현할 수 있습니다.
💡 TIP: 일부 웹사이트는 drag_and_drop 메서드가 정상 동작하지 않을 수 있습니다. 이 경우 click_and_hold → move_to_element → release 조합을 직접 사용하면 더 안정적으로 동작합니다.
🎚️ 슬라이더 조절 자동화
가격 범위 설정, 이미지 밝기 조절, 필터 강도 선택 같은 UI는 대개 슬라이더로 구현됩니다.
Selenium의 ActionChains를 사용하면 사용자가 마우스로 끌어 움직이는 동작을 그대로 재현할 수 있습니다.
핸들을 집어 올린 뒤, 픽셀 단위로 이동시키고, 원하는 위치에서 놓는 순서가 핵심입니다.
또한 일부 슬라이더는 접근성 이벤트(키보드 화살표 입력)로도 값이 바뀌므로 상황에 맞춰 마우스 이동과 키 입력을 혼합하는 전략이 안정적입니다.
🧭 픽셀 오프셋으로 슬라이더 이동
가장 직관적인 방식은 핸들을 click_and_hold로 집고, move_by_offset(x, 0)으로 오른쪽(또는 왼쪽)으로 이동한 다음 release하는 것입니다.
테스트 환경마다 해상도와 확대 비율이 달라질 수 있으므로, 오프셋 값을 고정하기보다 목표 값 대비 비율을 계산해 픽셀로 환산하는 편이 재사용성이 좋습니다.
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://jqueryui.com/slider/")
# 슬라이더는 iframe 안에 있으므로 프레임 전환
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR, ".demo-frame")))
handle = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".ui-slider-handle")))
track = driver.find_element(By.ID, "slider")
track_width = track.size["width"]
target_ratio = 0.6 # 60% 위치로 이동(예시)
x_offset = int(track_width * target_ratio)
actions = ActionChains(driver)
actions.click_and_hold(handle).move_by_offset(x_offset, 0).release().perform()
⌨️ 키보드 화살표로 미세 조정
접근성 표준을 준수한 슬라이더는 포커스가 가면 왼쪽/오른쪽 화살표로 값이 변합니다.
마우스 오프셋으로 대략적인 위치까지 이동한 뒤, 키 입력으로 세밀하게 보정하면 크로스 브라우저 환경에서 더욱 안정적인 테스트를 만들 수 있습니다.
from selenium.webdriver.common.keys import Keys
handle.click() # 포커스 주기
for _ in range(5):
handle.send_keys(Keys.ARROW_RIGHT)
🧩 input[type=range]인 경우의 대안
HTML5 input[type=range] 요소는 스타일이 다양해 드래그가 불안정할 때가 있습니다.
이 경우 JavaScript로 값과 이벤트를 직접 트리거해 UI와 모델 상태를 동시에 반영하도록 만들 수 있습니다.
프레임워크에 따라 input.dispatchEvent(new Event(“input”))과 change 이벤트를 함께 호출하면 뷰가 즉시 갱신됩니다.
range = driver.find_element(By.CSS_SELECTOR, "input[type='range']")
driver.execute_script("""
const el = arguments[0];
el.value = 75; // 0~100 범위 예시
el.dispatchEvent(new Event('input', { bubbles: true }));
el.dispatchEvent(new Event('change', { bubbles: true }));
""", range)
- 🧱슬라이더가 iframe 내부인지 먼저 확인하고, 필요 시 프레임 전환
- 📐트랙 너비 기준 비율→픽셀 변환으로 해상도 차이 대응
- 🎯오프셋으로 대략 이동 후 화살표 키로 미세 조정
⚠️ 주의: CSS 트랜지션이 긴 슬라이더는 이동 직후 값이 늦게 갱신될 수 있습니다. WebDriverWait으로 표시 값 또는 aria-valuenow가 기대치와 일치할 때까지 대기하세요.
⌨️ 키보드 콤보 입력
사용자가 실제로 입력하는 것처럼 Ctrl+C, Ctrl+V 같은 단축키나 Shift+Click 같은 키보드-마우스 조합을 자동화해야 할 때가 있습니다.
이때도 Selenium의 ActionChains를 활용하면 체계적으로 구현할 수 있습니다.
특히 복잡한 텍스트 편집기, 파일 업로드 창, 단축키 기반 UI를 테스트할 때 필수적인 기술입니다.
🖋️ 복합 키 조합 입력
ActionChains에서는 key_down()과 key_up()을 통해 키보드 이벤트를 조합할 수 있습니다.
아래 예제는 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://www.google.com")
search_box = driver.find_element("name", "q")
search_box.send_keys("Selenium ActionChains")
actions = ActionChains(driver)
actions.key_down(Keys.CONTROL).send_keys("a").key_up(Keys.CONTROL).perform()
actions.key_down(Keys.CONTROL).send_keys("c").key_up(Keys.CONTROL).perform()
🖱️ Shift+클릭 조합
멀티 선택 UI에서는 Shift 키를 누른 상태에서 마우스 클릭을 해야 연속된 항목을 선택할 수 있습니다.
ActionChains는 마우스 이벤트와 키보드 이벤트를 함께 묶어 처리할 수 있습니다.
first_item = driver.find_element("css selector", ".list-item:first-child")
last_item = driver.find_element("css selector", ".list-item:last-child")
actions = ActionChains(driver)
actions.click(first_item)
actions.key_down(Keys.SHIFT).click(last_item).key_up(Keys.SHIFT).perform()
🧩 send_keys vs ActionChains
element.send_keys()는 단순 입력에 적합하지만, 복합 조합에는 ActionChains가 더 유연합니다.
특히 여러 키의 누름/해제를 정밀하게 제어할 수 있고, 마우스 이벤트와 함께 엮어낼 수 있다는 점에서 차이가 있습니다.
💎 핵심 포인트:
키보드 단축키 자동화는 단순 입력 이상의 시뮬레이션을 가능하게 하며, 복잡한 사용자 행동을 테스트할 때 강력한 도구가 됩니다.
⚠️ 주의: 일부 OS/브라우저 환경에서는 Ctrl/Command 키 차이가 있습니다. macOS 테스트 시 Keys.COMMAND를 사용하는 것이 안전합니다.
⚡ ActionChains의 동작 원리
ActionChains는 Selenium에서 사용자의 마우스와 키보드 동작을 순차적으로 기록하고, 마지막에 perform()을 호출했을 때 실행하는 방식으로 동작합니다.
즉, 사용자의 행동을 하나씩 즉시 수행하는 것이 아니라, 이벤트 시나리오를 큐(queue)에 저장해 두었다가 실행하는 구조입니다.
이 덕분에 여러 동작을 체인처럼 연결하여 복잡한 사용자 상호작용을 재현할 수 있습니다.
🧭 큐 기반 실행 방식
ActionChains 객체는 사용자의 동작을 append 하듯 쌓아 두고, perform()을 호출하면 한 번에 브라우저에 전달합니다.
이 과정에서 WebDriver는 각 이벤트를 순서대로 해석해 실제 브라우저에서 실행합니다.
actions = ActionChains(driver)
actions.move_to_element(menu).click().send_keys("Test").perform()
위 예제는 요소로 이동 → 클릭 → 키 입력을 차례대로 수행하는 시나리오입니다.
여러 동작을 연결해 하나의 연속된 사용자 행동처럼 구현할 수 있습니다.
🔄 상태 유지와 초기화
ActionChains는 하나의 객체를 반복해서 사용하면 이전 동작이 누적될 수 있습니다.
따라서 독립적인 동작을 수행하려면 새로운 ActionChains 객체를 생성하는 것이 안전합니다.
예상치 못한 버그를 피하려면, 매번 필요한 순간에 fresh 객체를 만들어 사용하는 것이 권장됩니다.
💬 ActionChains는 ‘동작을 기록하고 실행하는 매크로’처럼 이해하면 쉽습니다. 모든 행동은 perform() 시점에 실제화됩니다.
📐 마우스 이동 방식
ActionChains의 move_to_element나 move_by_offset 메서드는 브라우저의 좌표 시스템을 기반으로 동작합니다.
따라서 화면 확대 비율이나 스크롤 상태가 테스트에 영향을 줄 수 있습니다.
항상 요소가 뷰포트에 노출되도록 스크롤을 먼저 맞추는 습관이 필요합니다.
- 🧱ActionChains는 이벤트 큐 기반 실행
- 📌새로운 동작에는 항상 새 객체 생성 권장
- 🎯좌표 기반 이동은 스크롤/배율 영향을 받음
💡 실무 활용 팁과 주의사항
Selenium의 ActionChains를 프로젝트에 적용할 때는 단순히 동작 구현을 넘어, 안정성과 유지보수성까지 고려하는 것이 중요합니다.
테스트 환경이 바뀌면 예기치 못한 실패가 발생할 수 있으므로, 다음의 팁을 기억하면 훨씬 더 견고한 자동화를 만들 수 있습니다.
🕒 안정적인 실행을 위한 대기 처리
요소가 화면에 표시되지 않았거나 아직 DOM이 로드 중인 상태에서 ActionChains를 실행하면 실패할 확률이 큽니다.
따라서 WebDriverWait을 통해 반드시 요소의 가시성과 상호작용 가능 여부를 확인한 후 동작을 실행하는 습관이 필요합니다.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "target"))
)
actions = ActionChains(driver)
actions.click(element).perform()
🖥️ 크로스 브라우저 호환성
Chrome에서는 잘 동작하지만, Firefox나 Edge에서는 동일한 코드가 예상과 다르게 작동하는 경우가 있습니다.
특히 drag_and_drop 같은 고급 동작은 브라우저별로 차이가 존재할 수 있습니다.
따라서 주요 브라우저에서 테스트를 병행하고, 필요하다면 자바스크립트 이벤트 호출을 통해 보완하는 것이 좋습니다.
🔒 보안 및 접근성 고려
실무에서는 단순 UI 테스트를 넘어 보안성 및 접근성 검증도 필요합니다.
키보드 이벤트를 활용할 때는 스크린리더 환경이나 접근성 표준을 함께 고려하면 더 좋은 품질의 자동화를 만들 수 있습니다.
또한 자동화 코드가 민감한 데이터 입력을 포함한다면, 반드시 보안 로그나 마스킹 처리를 적용해야 합니다.
- 🕒WebDriverWait으로 요소 준비 확인
- 🌐브라우저별 차이를 대비해 크로스 테스트 수행
- 🔒보안 및 접근성 표준 함께 고려
💎 핵심 포인트:
ActionChains는 단순히 동작을 자동화하는 수준을 넘어, 테스트 신뢰성과 실무 품질을 좌우하는 핵심 도구입니다.
❓ 자주 묻는 질문 (FAQ)
ActionChains는 꼭 필요한가요?
drag_and_drop이 안 될 때 해결 방법은?
슬라이더 값 조정은 어떤 방식이 가장 안정적일까요?
키보드 단축키 입력은 send_keys로도 가능한가요?
perform()은 언제 호출해야 하나요?
모바일 환경에서도 ActionChains가 동작하나요?
iframe 안의 요소도 조작할 수 있나요?
macOS에서는 Ctrl 키 대신 무엇을 사용하나요?
📝 Selenium ActionChains로 웹 자동화를 완성하는 방법
이번 글에서는 파이썬 Selenium의 ActionChains를 활용해 드래그앤드롭, 슬라이더 조절, 키보드 단축키 입력 같은 고급 동작을 구현하는 방법을 살펴보았습니다.
단순한 입력과 클릭을 넘어서 실제 사용자의 행동을 시뮬레이션할 수 있다는 점에서, ActionChains는 웹 자동화 테스트에서 매우 중요한 역할을 합니다.
실무에서는 테스트 안정성과 크로스 브라우저 호환성을 확보하는 것이 핵심이며, WebDriverWait을 통한 대기 처리와 프레임 전환, 보안/접근성 고려까지 병행해야 합니다.
이러한 팁을 적용한다면 더 견고하고 확장성 있는 자동화 환경을 구축할 수 있습니다.
앞으로 Selenium을 활용해 다양한 웹 애플리케이션을 자동화하거나 테스트 효율을 높이고자 한다면, ActionChains 활용법은 반드시 익혀야 할 필수 스킬입니다.
드래그앤드롭, 슬라이더, 키 콤보 입력 같은 예제를 직접 실습하며 자신만의 자동화 시나리오에 적용해 보시기 바랍니다.
🏷️ 관련 태그 : Selenium, 파이썬자동화, 웹테스트, ActionChains, 드래그앤드롭, 슬라이더조절, 키보드단축키, QA자동화, 테스트자동화, 웹크롤링