pip install selenium | Install Python |
npm install selenium-webdriver | Install Node.js |
pip install webdriver-manager | Install driver manager |
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# Auto-install driver
driver = webdriver.Chrome(
service=Service(ChromeDriverManager().install())
)
# Or with options
options = webdriver.ChromeOptions()
options.add_argument("--headless")
options.add_argument("--no-sandbox")
options.add_argument("--disable-dev-shm-usage")
driver = webdriver.Chrome(options=options) from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager
driver = webdriver.Firefox(
service=Service(GeckoDriverManager().install())
) const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const options = new chrome.Options();
options.addArguments('--headless');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build(); from selenium.webdriver.common.by import By
# Single element
driver.find_element(By.ID, "id")
driver.find_element(By.NAME, "name")
driver.find_element(By.CLASS_NAME, "class")
driver.find_element(By.TAG_NAME, "tag")
driver.find_element(By.LINK_TEXT, "Link Text")
driver.find_element(By.PARTIAL_LINK_TEXT, "Partial")
driver.find_element(By.CSS_SELECTOR, "div.class")
driver.find_element(By.XPATH, "//div[@id='id']")
# Multiple elements
driver.find_elements(By.CLASS_NAME, "items") # By ID
"#id"
# By class
".class"
# By attribute
"[name='value']"
"input[type='text']"
# Combination
"div.class#id"
"form input[type='submit']"
# Pseudo-classes
"li:first-child"
"li:nth-child(2)"
"li:last-child" # By ID
"//*[@id='id']"
# By text
"//button[text()='Submit']"
"//button[contains(text(), 'Sub')]"
# By attribute
"//input[@name='email']"
"//input[contains(@class, 'btn')]"
# Parent/sibling
"//div/parent::*"
"//div/following-sibling::p"
# Index
"(//div[@class='item'])[1]" element = driver.find_element(By.ID, "id")
# Click
element.click()
# Type text
element.send_keys("Hello")
element.clear()
element.send_keys("New text")
# Submit form
element.submit()
# Get attribute
value = element.get_attribute("value")
href = element.get_attribute("href")
# Get text
text = element.text
# Check state
element.is_displayed()
element.is_enabled()
element.is_selected() from selenium.webdriver.common.keys import Keys
element.send_keys(Keys.ENTER)
element.send_keys(Keys.TAB)
element.send_keys(Keys.ESCAPE)
element.send_keys(Keys.BACKSPACE)
element.send_keys(Keys.CONTROL, "a") # Select all
element.send_keys(Keys.CONTROL, "c") # Copy
element.send_keys(Keys.CONTROL, "v") # Paste from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
# Hover
actions.move_to_element(element).perform()
# Double click
actions.double_click(element).perform()
# Right click
actions.context_click(element).perform()
# Drag and drop
actions.drag_and_drop(source, target).perform()
# Click and hold
actions.click_and_hold(element).perform()
actions.release().perform()
# Chain multiple actions
actions.move_to_element(element)\
.click()\
.send_keys("text")\
.perform() from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
# Select by value
select.select_by_value("value1")
# Select by visible text
select.select_by_visible_text("Option 1")
# Select by index
select.select_by_index(1)
# Get selected option
selected = select.first_selected_option
all_options = select.options
# Deselect (multi-select)
select.deselect_all() checkbox = driver.find_element(By.ID, "checkbox")
# Check if selected
if not checkbox.is_selected():
checkbox.click()
# Uncheck
if checkbox.is_selected():
checkbox.click()
# Radio button
radio = driver.find_element(By.CSS_SELECTOR, "input[value='option1']")
radio.click() # Global wait for all elements
driver.implicitly_wait(10) # seconds from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
# Wait for element visible
element = wait.until(
EC.visibility_of_element_located((By.ID, "id"))
)
# Wait for element clickable
element = wait.until(
EC.element_to_be_clickable((By.ID, "id"))
)
# Wait for element present
element = wait.until(
EC.presence_of_element_located((By.ID, "id"))
)
# Wait for text
wait.until(
EC.text_to_be_present_in_element((By.ID, "id"), "expected text")
) from selenium.webdriver.support import expected_conditions as EC
EC.title_is("Page Title")
EC.title_contains("Title")
EC.url_contains("path")
EC.url_to_be("https://example.com")
EC.visibility_of_element_located(locator)
EC.invisibility_of_element_located(locator)
EC.element_to_be_clickable(locator)
EC.element_to_be_selected(locator)
EC.alert_is_present()
EC.frame_to_be_available_and_switch_to_it(locator) def element_has_class(element, class_name):
return class_name in element.get_attribute("class")
wait.until(lambda d: element_has_class(
d.find_element(By.ID, "id"), "active"
)) from selenium.webdriver.common.alert import Alert
# Wait for and switch to alert
alert = wait.until(EC.alert_is_present())
# Or directly
alert = driver.switch_to.alert
# Get alert text
text = alert.text
# Accept (OK)
alert.accept()
# Dismiss (Cancel)
alert.dismiss()
# Send keys (prompt)
alert.send_keys("input text")
alert.accept() # Execute JavaScript
driver.execute_script("alert('Hello');")
# Return value
result = driver.execute_script("return document.title;")
# Pass arguments
element = driver.find_element(By.ID, "id")
driver.execute_script("arguments[0].click();", element)
# Scroll into view
driver.execute_script("arguments[0].scrollIntoView();", element)
# Scroll to position
driver.execute_script("window.scrollTo(0, 500);")
# Scroll to bottom
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# Set value
driver.execute_script("arguments[0].value = 'text';", element)
# Remove attribute
driver.execute_script("arguments[0].removeAttribute('disabled');", element) # Save screenshot
driver.save_screenshot("screenshot.png")
# Get as base64
base64_img = driver.get_screenshot_as_base64()
# Get as PNG bytes
png_bytes = driver.get_screenshot_as_png()
# Element screenshot
element = driver.find_element(By.ID, "id")
element.screenshot("element.png") # Close current window
driver.close()
# Quit browser
driver.quit()
# Context manager (Python)
from selenium import webdriver
with webdriver.Chrome() as driver:
driver.get("https://example.com")
# automatically quit on exit