HOWTO · Python
Selenium Python의 send_keys() 메서드
이 자습서는 Selenium Python에서 send_keys() 메서드를 사용하는 방법을 보여줍니다.
이 페이지의 내용
send_keys()는 Selenium의 WebElement에 정의된 메서드로, 이미 찾아낸 요소 — 보통 텍스트 상자, 양식 필드, 편집 가능한 컨트롤 — 에 텍스트와 키보드 입력을 보냅니다. 요소를 확보한 뒤 element.send_keys("your text")를 호출하면 각 문자가 그 안에 입력되고, element.send_keys(Keys.ENTER)는 Enter처럼 이름이 붙은 키를 보냅니다. 양식을 채우고, 검색을 실행하고, 애플리케이션이 입력된 텍스트에 어떻게 반응하는지 확인하는 표준적인 방법입니다.
Selenium Python에서 send_keys()가 하는 일
send_keys()는 WebElement에 정의되어 있으므로 driver.find_element(By.NAME, "q").send_keys("selenium")처럼 이미 찾아낸 요소에 대해 항상 호출합니다. 이 메서드는 하나 이상의 값을 받는 가변 인자 시그니처, 즉 send_keys(*value)를 가지며, 각 값은 주어진 순서대로 입력할 문자열입니다. Enter, Tab, Backspace, 수정자 키 같은 특수 키는 selenium.webdriver.common.keys.Keys에 있고, 각 상수는 유니코드 사적 사용 영역의 문자 하나일 뿐이므로 일반 문자열에 섞어 넣거나 element.send_keys("text", Keys.ENTER)처럼 별도 인자로 전달할 수 있습니다. element.send_keys("selenium" + Keys.ENTER)는 텍스트를 입력한 다음 Enter를 누릅니다.
실제 사용에서는 두 가지 세부 사항이 중요합니다.
send_keys()는 타이핑을 흉내 냅니다. 입력만 전달할 뿐이고, 그 다음에 무슨 일이 일어날지는 애플리케이션 자체의 로직이 결정합니다. 로그인이 거부되든, 검색이 실행되든, 필드가 메시지를 표시하든 그것은 테스트가 관찰하는 애플리케이션 동작이지send_keys()가 수행하는 작업이 아닙니다.- 요소가 입력을 받을 수 있어야 합니다. 텍스트 필드, 텍스트 영역,
contenteditable요소, 파일 입력(텍스트로 된 파일 경로를 받습니다)은 동작하지만, 일반<div>에 키를 보내면 이벤트는 전달되어도 보통 아무 변화도 일어나지 않습니다.
페이지를 열고 요소 찾기
키를 보내기 전에 드라이버를 시작하고, 페이지를 열고, 대상 요소를 찾아야 합니다. from selenium import webdriver와 from selenium.webdriver.common.by import By를 사용하면 최소 설정은 driver = webdriver.Chrome(), driver.get("https://www.google.com/"), 그리고 search_box = driver.find_element(By.NAME, "q")입니다. 현재 Selenium(버전 4)은 driver.find_element(By.*, "...")로 요소를 찾으며, 예전의 find_element_by_id, find_element_by_name 같은 메서드는 제거되었습니다.
필드를 동적으로 렌더링하는 페이지에서는 추측하지 말고 요소를 기다리세요. selenium.webdriver.support.ui의 WebDriverWait와 selenium.webdriver.support의 expected_conditions as EC를 사용해 WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.NAME, "q")))를 호출하면 요소가 준비되는 즉시 그것을 반환합니다. 요소를 찾기 전에 고정된 time.sleep()을 두는 방식은 요소가 늦게 렌더링되면 테스트가 여전히 실패하므로 불안정합니다.
가능하면 가장 안정적인 로케이터를 우선하세요. 요소 ID가 첫 번째이고, 그다음이 name 또는 CSS 선택자이며, 구조 기반 조회에는 XPath를 사용합니다. 이 글의 브라우저 스니펫은 pip install selenium과 설치된 브라우저를 가정하며, 드라이버는 Selenium Manager를 통해 해결됩니다. Selenium 4용으로 작성되었고, 여기서 실행된 것이 아니라 필요에 맞게 바꿔 쓸 수 있도록 인라인 구문으로 제시됩니다.
텍스트와 키보드 키 보내기
필드를 채우려면 텍스트를 send_keys()에 전달하고, 양식을 제출하려면 Keys.ENTER를 덧붙이거나 두 번째 호출로 보냅니다(Keys는 selenium.webdriver.common.keys에 있습니다). 위에서 찾은 Google 페이지에서 search_box.send_keys("This is filed by Selenium send keys")는 검색어를 입력하고 search_box.send_keys(Keys.ENTER)는 그것을 제출합니다. send_keys() 안에서 보낸 수정자 키 — 예를 들어 Keys.CONTROL + "a" — 는 키를 함께 누르지만, 같은 수정자를 다시 보내거나 Keys.NULL을 보내 명시적으로 해제하기 전까지 눌린 상태로 남습니다. Keys.chord(Keys.CONTROL, "a")는 조합 뒤에 Keys.NULL을 붙이기 때문에 수정자가 저절로 해제되는 형태입니다.
스크린샷은 Google 검색 필드에 입력된 텍스트를 보여줍니다.
Keys 상수는 문자 하나이므로 문자열을 직접 만들어 보면 chord가 정확히 무엇을 추가하는지 알 수 있습니다. 다음 예제를 실행해 보세요. 코드 안의 주석과 출력 값은 원문 예제와 바이트 단위로 동일하게 유지되므로 영어로 표시됩니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
select_all = "\ue009" + "a" # Keys.CONTROL + "a"
field_value = "selenium" + "\ue007" # text + Keys.ENTER
print(len(select_all), len(field_value))
2 9
각 Keys 상수는 문자 하나로 계산되므로 "selenium" + Keys.ENTER는 아홉 번의 키 이벤트, 즉 여덟 개의 문자와 Enter를 보냅니다.
입력 유효성 검사와 결과 확인
send_keys()는 스스로 아무 검사도 수행하지 않으며, 유효성 검사는 애플리케이션이 합니다. 유효성 검사를 테스트하려면 값을 보내고, 애플리케이션을 동작시킨 다음, 표시되는 결과를 읽어 오면 됩니다. 로그인 양식에서는 email = driver.find_element(By.NAME, "email"), email.send_keys("not-an-email"), email.send_keys(Keys.ENTER) 순서로 진행한 뒤 두 가지 일반적인 확인을 합니다. email.get_attribute("value")는 필드를 다시 읽는데, 텍스트 입력은 내용을 요소의 .text가 아니라 value에 보관합니다. 그리고 driver.find_element(By.CSS_SELECTOR, ".error-message").text는 애플리케이션이 렌더링하는 응답을 읽습니다.
같은 패턴으로 일반적인 시나리오를 모두 다룰 수 있습니다. 이메일 필드에는 형식을 깨는 값을 보내 애플리케이션이 거부하는지 확인하고, 비밀번호 필드에는 각 규칙을 깨는 값을 보내 해당 메시지가 나오는지 확인하며, 검색창에는 검색어를 보내 애플리케이션이 반환하는 결과가 관련성이 있는지 확인합니다. 모든 경우에 send_keys()는 키 입력을 제공할 뿐이고, 애플리케이션이 어떻게 반응하는지는 여러분의 단언문이 확인합니다.
텍스트 지우기 또는 바꾸기
필드를 덮어쓰는 방법은 두 가지입니다.
element.clear()는 하나의 WebDriver 명령으로 편집 가능한 필드를 비웁니다.- 키보드 편집은 한 번에 한 키 입력씩 텍스트를 삭제하거나 선택합니다.
Keys.BACKSPACE는 캐럿 앞의 문자를 지우고,Keys.DELETE는 뒤의 문자를 지우며,Keys.CONTROL + "a"는 전체를 선택해 다음send_keys()호출이 그것을 대체하게 합니다.
필드가 키 입력마다 반응할 때 이 구분이 중요합니다. 자동 완성이나 실시간 포매터는 실제 키 이벤트가 필요할 수 있는 반면 clear()는 한 번의 업데이트만 발생시킵니다. Google 검색 상자에서 편집 순서는 search_box.send_keys("For test purpose")로 값을 입력하고, search_box.send_keys(3 * Keys.BACKSPACE)로 마지막 세 문자를 지우고(“For test purp"가 남습니다), search_box.clear()로 필드를 비운 뒤, search_box.send_keys("testing second key")로 새 텍스트를 입력하는 것입니다. 호출 사이의 time.sleep(3)으로 브라우저에서 각 단계를 지켜볼 수 있고, 끝나면 driver.quit()가 브라우저를 닫습니다.
첫 번째 단계 — 텍스트가 필드에 입력됩니다.
두 번째 단계 — Backspace로 세 문자가 지워져 “For test purp"가 남습니다.
세 번째 단계 — clear()가 필드를 비우고 새 텍스트를 다시 입력합니다.
send_keys() 문제 해결
입력이 요소에 도달하지 않으면 다음 사항을 순서대로 확인하세요.
NoSuchElementException: 로케이터가 일치하지 않거나, 페이지 렌더링이 끝나지 않았거나, 요소가<iframe>이나 shadow DOM 안에 있습니다.WebDriverWait로 기다리고, 프레임 안의 콘텐츠에는driver.switch_to.frame(...)을 사용하세요.StaleElementReferenceException: 요소를 찾은 뒤 페이지가 다시 렌더링된 경우이므로 입력 직전에 요소를 다시 찾으세요.ElementNotInteractableException: 요소가 숨겨져 있거나, 비활성화되어 있거나, 가려져 있습니다. 화면에 보이도록 스크롤하고,element_to_be_clickable을 기다리며,disabled와readonly속성을 확인하세요 — 읽기 전용 필드는 입력을 거부합니다.InvalidElementStateException: 대상을 편집할 수 없는 경우입니다. 예를 들어 편집 불가능한 요소에clear()를 호출한 경우입니다.- 아무것도 나타나지 않음: 포커스가 다른 곳에 있을 수 있습니다. 먼저 요소를 클릭하거나
ActionChains(driver).move_to_element(el).click().send_keys(text)로 구동하세요.element.get_attribute("value")를 읽어 실제로 무엇이 도착했는지 확인하세요. - 단축키와 특수 키:
Keys상수나Keys.chord()를 사용하세요.send_keys()는 물리적 키 입력이 아닌 문자를 보내므로, IME 조합이 필요한 문자 체계에서는 IME 조합을 구동하지 않습니다.