Selenium元素操作
Selenium 元素操作全攻略(2025 最新版)
定位是基础,操作是灵魂
掌握 输入、点击、获取、上传、拖拽、JS 执行 等 20+ 种操作,让浏览器听你指挥!
一、核心操作分类
| 分类 | 操作 | 常用方法 |
|---|---|---|
| 输入类 | 输入、清除、回车 | send_keys(), clear() |
| 点击类 | 点击、双击、右键 | click(), double_click() |
| 获取类 | 文本、属性、状态 | text, get_attribute() |
| 上传类 | 文件上传 | send_keys(路径) |
| 鼠标类 | 悬停、拖拽 | ActionChains |
| 键盘类 | 组合键 | Keys.CONTROL + 'a' |
| JS 类 | 执行脚本 | execute_script() |
二、基础操作(必会)
1. 输入文本 & 清除
from selenium.webdriver.common.by import By
# 输入
element = driver.find_element(By.ID, "username")
element.send_keys("admin")
# 清除
element.clear()
element.send_keys("new_user")
2. 点击按钮
driver.find_element(By.ID, "login").click()
3. 获取文本
text = driver.find_element(By.CSS_SELECTOR, "h1").text
print(text) # 输出:欢迎登录
4. 获取属性
href = driver.find_element(By.LINK_TEXT, "百度").get_attribute("href")
print(href) # https://www.baidu.com
5. 判断状态
btn = driver.find_element(By.ID, "submit")
print(btn.is_displayed()) # 是否可见
print(btn.is_enabled()) # 是否可点击
print(btn.is_selected()) # 复选框是否选中
三、高级输入操作(键盘)
from selenium.webdriver.common.keys import Keys
input_box = driver.find_element(By.ID, "search")
# 组合键:全选 + 复制 + 粘贴
input_box.send_keys(Keys.CONTROL, "a") # 全选
input_box.send_keys(Keys.CONTROL, "c") # 复制
input_box.send_keys(Keys.CONTROL, "v") # 粘贴
# 特殊键
input_box.send_keys(Keys.ENTER)
input_box.send_keys(Keys.TAB)
input_box.send_keys(Keys.ESCAPE)
input_box.send_keys(Keys.BACKSPACE)
四、鼠标操作(ActionChains)
from selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)
element = driver.find_element(By.ID, "menu")
# 悬停
actions.move_to_element(element).perform()
# 双击
actions.double_click(element).perform()
# 右键
actions.context_click(element).perform()
# 拖拽
source = driver.find_element(By.ID, "drag")
target = driver.find_element(By.ID, "drop")
actions.drag_and_drop(source, target).perform()
# 链式操作(推荐)
actions.move_to_element(menu) \
.click(submenu) \
.pause(1) \
.send_keys(Keys.ENTER) \
.perform()
五、文件上传
最简单:直接 send_keys(绝对路径)
file_input = driver.find_element(By.ID, "upload")
file_input.send_keys("/Users/xxx/Desktop/report.pdf") # 绝对路径!
复杂场景:使用 AutoIt / pyautogui(不推荐)
六、下拉框操作(Select)
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "city"))
# 按可见文本
select.select_by_visible_text("北京")
# 按 value
select.select_by_value("shanghai")
# 按索引
select.select_by_index(2)
# 获取所有选项
options = select.options
for opt in options:
print(opt.text)
# 多选
select.deselect_all()
七、执行 JavaScript(终极操作)
# 滚动到底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到元素
element = driver.find_element(By.ID, "footer")
driver.execute_script("arguments[0].scrollIntoView();", element)
# 修改样式
driver.execute_script("arguments[0].style.border='3px solid red';", element)
# 获取隐藏文本
text = driver.execute_script("return arguments[0].innerText;", element)
# 点击(绕过 JS 拦截)
driver.execute_script("arguments[0].click();", element)
八、截图操作
# 整个页面
driver.save_screenshot("full_page.png")
# 单个元素
element = driver.find_element(By.ID, "logo")
element.screenshot("logo.png")
# 获取 base64(用于报告)
import base64
png_data = element.screenshot_as_png
with open("logo.png", "wb") as f:
f.write(png_data)
九、窗口 & 标签页操作
# 打开新标签页
driver.execute_script("window.open('https://httpbin.org');")
# 切换窗口
handles = driver.window_handles
driver.switch_to.window(handles[1]) # 第二个标签
# 关闭当前,切回主窗口
driver.close()
driver.switch_to.window(handles[0])
十、完整实战:电商加入购物车
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait, Select
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 10)
actions = ActionChains(driver)
try:
driver.get("https://httpbin.org/forms/post")
# 填写客户信息
wait.until(EC.presence_of_element_located((By.NAME, "custname"))).send_keys("张三")
driver.find_element(By.NAME, "custtel").send_keys("13800138000")
driver.find_element(By.NAME, "custemail").send_keys("zs@example.com")
# 选择尺寸
driver.find_element(By.XPATH, "//input[@value='small']").click()
# 选择配料(多选)
driver.find_element(By.XPATH, "//input[@value='cheese']").click()
driver.find_element(By.XPATH, "//input[@value='bacon']").click()
# 备注
driver.find_element(By.NAME, "comments").send_keys("不要辣,谢谢!")
# 提交
submit_btn = driver.find_element(By.CSS_SELECTOR, "input[type='submit']")
actions.move_to_element(submit_btn).click().perform()
print("订单提交成功!")
driver.save_screenshot("order_success.png")
finally:
driver.quit()
十一、操作失败?排查清单
| 问题 | 原因 | 解决方案 |
|---|---|---|
ElementClickInterceptedException | 被遮挡 | execute_script("arguments[0].click();", elem) |
ElementNotInteractable | 不可交互 | 等待 element_to_be_clickable |
StaleElementReferenceException | 元素刷新 | 重新定位 |
| 输入无效 | 只读 | 用 JS 设置:execute_script("arguments[0].value='xxx';", elem) |
十二、最佳实践总结
| 原则 | 推荐 |
|---|---|
| 等待 | 永远用 WebDriverWait |
| 点击 | 优先 click(),失败用 JS |
| 输入 | clear() + send_keys() |
| 截图 | 失败时自动截图 |
| 日志 | 每步 print() 或 logging |
| 封装 | 写成函数或 Page Object |
def safe_click(driver, locator):
elem = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable(locator)
)
try:
elem.click()
except:
driver.execute_script("arguments[0].click();", elem)
十三、推荐工具
| 工具 | 用途 |
|---|---|
| SelectorsHub | 快速生成 XPath/CSS |
| ChroPath | 验证选择器 |
| POM Builder | 自动生成 Page Object |
十四、一句话总结
元素操作 = 等待 + 定位 + 稳定执行(JS 兜底)
下一步:
想看 20 个真实网站操作案例(登录、翻页、下拉加载、验证码处理)?
回复 examples 我立刻发你一个 完整项目模板!
当前最佳组合:
pip install selenium webdriver-manager
WebDriverWait + ActionChains + execute_script = 无敌!