Use send_keys on an editable, keyboard-interactable element for ordinary typing. Use Selenium’s Actions API when you need to target the active element, combine keyboard input with other actions, or hold a modifier key across multiple steps. Call perform() to run an Actions sequence.
Choose the right Selenium keyboard method
| Task | Use | Why |
|---|---|---|
| Type text into a text field or editable area | Element send_keys |
Directly sends input to the element you located. |
| Send input to the focused element or combine input with other actions | Actions sendKeys |
Supports active-element input and, in bindings that provide it, a designated element. |
| Keep Shift, Control, or another modifier pressed while sending another key | Actions keyDown and keyUp |
Explicitly controls when the modifier is pressed and released. |
Selenium’s Keyboard actions documentation describes keyboard input in terms of pressing a key down and releasing a pressed key. Its element interactions guide describes text inputs and contenteditable elements as typical keyboard-interactable targets.
As an Amazon Associate I earn from qualifying purchases.
Type text with element send_keys
Locate the intended field, ensure it is ready for input, and call its send_keys method. For example, in Python:
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
from selenium.webdriver.common.by import By
search = driver.find_element(By.NAME, "q")
search.send_keys("selenium keyboard actions")
This is the simplest approach for normal form entry. Use the locator appropriate to the page and your test, and make sure the field is in the intended state before typing. A target that cannot receive keyboard input can produce an invalid element state error; Selenium documents that outcome in its element interaction guidance.
#1 Best Overall
Send keys through the Actions API
Use an Actions sequence when keyboard input belongs alongside pointer or other input actions, or when you want to send keys to the currently active element. The API offers designated-element forms in supported bindings; check the reference for your language and make focus explicit if the test depends on a particular field. The Selenium Project’s Actions API overview explains the broader sequence model.
Python: send text to the active element
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).send_keys("hello").perform()
Python: send text to a designated element
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
field = driver.find_element(By.NAME, "q")
ActionChains(driver).send_keys_to_element(field, "hello").perform()
The designated-element method’s spelling can vary by binding. Use the method supported by your installed Selenium language binding rather than assuming method names are identical across Java, Python, .NET, Ruby, and JavaScript.
Rank #2
Hold and release modifier keys explicitly
When a modifier must remain down while another key is sent, use separate key-down and key-up actions. In Python:
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
ActionChains(driver)
.key_down(Keys.SHIFT)
.send_keys("a")
.key_up(Keys.SHIFT)
.send_keys("b")
.perform()
This sequence holds Shift for a, releases it, then sends b; Selenium’s documented example produces Ab. Always release modifiers your sequence presses so later steps do not inherit an unintended keyboard state.
Rank #3
Equivalent syntax in other bindings
// Java
new Actions(driver)
.keyDown(Keys.SHIFT)
.sendKeys("a")
.keyUp(Keys.SHIFT)
.sendKeys("b")
.perform();
// JavaScript
await driver.actions()
.keyDown(Key.SHIFT)
.sendKeys('a')
.keyUp(Key.SHIFT)
.sendKeys('b')
.perform();
These examples illustrate binding-specific naming: Java uses Keys, while Selenium’s JavaScript API uses Key. Use the special-key constants supplied by your binding for keys such as Shift, arrows, Control, and Command. See the JavaScript Actions API reference for its method behavior and syntax.
Build shortcuts with platform-aware keys
For a copy or paste shortcut, choose the modifier for the operating system running the browser: Selenium’s official example uses Command on macOS and Control on other platforms. Then build the shortcut with the relevant key constants and call perform(). The same example pattern can combine arrow navigation, Shift selection, and the platform modifier; the precise result depends on the browser, page focus, and test environment.
Rank #4
Do not assume that passing a modifier and a letter together keeps the modifier held. In Selenium’s JavaScript Actions API, sendKeys(Key.SHIFT, 'a') sends each key with its own down/up pair, so Shift is released before the a keystroke. For a held modifier, use keyDown, send the intended key, then use keyUp.
Recommended Free Tools
Use special keys and navigation
Pass special-key constants from your binding instead of relying on literal text for non-character keys. For example, a Python sequence can use Keys.ARROW_LEFT, Keys.ENTER, or Keys.TAB when the test needs those keys:
Best Value
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
ActionChains(driver).send_keys(Keys.ARROW_LEFT).perform()
Use the constant names provided by your binding; their capitalization and exact spelling are not uniform across languages. Refer to the Selenium keyboard documentation for the relevant language examples.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Troubleshoot keyboard actions
- Invalid element state: The target may not be keyboard-interactable, editable, or ready to accept input. Check that it is a text input or editable element and that the page has reached the expected state before calling
send_keys. - Text goes to the wrong control: Actions input without a designated target goes to the active element. Locate and focus the intended element, or use the designated-element form supported by your binding.
- Shift or Control does not affect the next key: If you used Actions
sendKeyswith a modifier and a character, the modifier may be released as part of that key’s down/up pair. Use separatekeyDownandkeyUpcalls. - Shortcut behaves differently across machines: Select Command for macOS or Control for other platforms, and verify the browser, focus, and test environment used by your suite.
- Nothing happens after building a sequence: Ensure the sequence ends with
perform(); actions are executed when the built sequence is performed.
Or skip the browser setup
If your goal is to capture a page rather than automate keyboard interaction, ScreenshotNeo returns a screenshot or PDF from one GET request. Its API accepts consent banners like a visitor and removes 60+ known consent platforms, newsletter popups, and chat widgets before capture; each of those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the page verdict and billing status. Its MCP server offers take_screenshot, get_page_info, and capture_pdf for AI agents.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
See the ScreenshotNeo API documentation for request options. The Free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots. Sign up free for 1,000 screenshots a month, with no card required.
Free tools Windows power users keep installed
One-click scans. No signup required.
Frequently Asked Questions
Does Selenium send_keys work with contenteditable elements?
Selenium describes elements with contenteditable as typical keyboard-interactable targets, provided the element can currently receive input.
Do I need Actions for ordinary text entry?
No. For a ready, editable field, the element’s send_keys method is the direct option.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.




