在自动化测试、网页数据爬取、批量操作网页等场景中,Selenium 无疑是最受欢迎的工具之一。作为一款强大的 Web 自动化工具,它能模拟人类操作浏览器的行为,实现点击、输入、跳转等一系列动作。本文将从基础到进阶,全面解析 Selenium 的核心用法,帮你快速掌握这一工具的精髓。
操作网页的前提是准确定位元素。Selenium 提供了 8 种定位方式,覆盖绝大多数场景:
定位方式 |
方法 |
适用场景 |
id |
find_element(By.ID, value) |
元素有唯一 id 属性(推荐优先使用) |
name |
find_element(By.NAME, value) |
元素有 name 属性,且值较唯一 |
class name |
find_element(By.CLASS_NAME) |
元素 class 属性(注意多 class 需取单个) |
tag name |
find_element(By.TAG_NAME) |
通过标签名定位(如),适合批量查找 |
link text |
find_element(By.LINK_TEXT) |
精准匹配链接文本(如标签完整文字) |
partial link text |
find_element(By.PARTIAL_LINK_TEXT) |
模糊匹配链接文本 |
xpath |
find_element(By.XPATH, value) |
复杂结构或无明显属性时(万能定位) |
css selector |
find_element(By.CSS_SELECTOR) |
简洁高效,适合有 CSS 基础的用户 |
示例代码:
from selenium.webdriver.common.by import By
# 通过id定位用户名输入框
username = driver.find_element(By.ID, "username")
# 通过xpath定位密码输入框
password = driver.find_element(By.XPATH, '//input[@type="password"]')
# 通过css selector定位登录按钮
login_btn = driver.find_element(By.CSS_SELECTOR, ".login-form .submit-btn")
定位元素后,即可通过 Selenium 提供的方法进行交互,常用操作如下:
select = Select(driver.find_element(By.ID, "city"))
select.select_by_visible_text("北京") # 按文本选择
select.select_by_value("shanghai") # 按value属性选择
复选框 / 单选按钮:通过click()切换状态,结合is_selected
()判断是否选中
checkbox = driver.find_element(By.NAME, "agree")
if not checkbox.is_selected():
checkbox.click() # 勾选未选中的复选框
upload_btn = driver.find_element(By.ID, "file-upload")
upload_btn.send_keys("D:/data.csv") # 传入本地文件路径
alert = driver.switch_to.alert
print(alert.text) # 获取弹窗文本
alert.accept() # 确认弹窗
# alert.dismiss() # 取消弹窗
WebDriver 提供了大量控制浏览器的方法,覆盖导航、窗口、信息获取等场景:
driver.maximize_window() # 最大化窗口
driver.set_window_size(1200, 800) # 设置窗口大小
driver.get_window_size() # 获取窗口大小
driver.get("https://www.baidu.com") # 打开网页
driver.back() # 后退
driver.forward() # 前进
driver.refresh() # 刷新页面
print(driver.title) # 获取页面标题
print(driver.current_url) # 获取当前URL
print(driver.page_source) # 获取页面源码(用于调试)
由于网页加载存在延迟,直接操作元素可能导致 "元素未找到" 错误,需通过等待机制解决:
driver.implicitly_wait(10) # 等待10秒,超时则报错
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 等待10秒,直到id为"submit"的元素可点击
submit_btn = WebDriverWait(driver, 10).until(
EC.element_to_be_clickable((By.ID, "submit"))
)
submit_btn.click()
# 获取所有窗口句柄
handles = driver.window_handles
# 切换到新窗口
driver.switch_to.window(handles[-1])
# 通过id切换到iframe
driver.switch_to.frame("iframe-id")
# 操作iframe内元素...
# 切回主文档
driver.switch_to.default_content()
对于 Selenium 难以直接操作的元素(如滚动、隐藏元素),可通过执行 JS 实现:
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
# 点击隐藏元素
hidden_btn = driver.find_element(By.ID, "hidden-btn")
driver.execute_script("arguments[0].click();", hidden_btn)
# 截取当前页面并保存
driver.get_screenshot_as_file("error.png")
结合上述知识点,实现一个自动登录某网站的流程:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# 初始化浏览器
driver = webdriver.Chrome()
driver.maximize_window()
try:
# 打开登录页
driver.get("https://example.com/login")
# 显式等待并输入用户名
username = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "username"))
)
username.send_keys("test_user")
# 输入密码
password = driver.find_element(By.ID, "password")
password.send_keys("test_pass123")
# 点击登录按钮
login_btn = driver.find_element(By.CSS_SELECTOR, ".login-btn")
login_btn.click()
# 验证登录成功(等待欢迎信息出现)
welcome_msg = WebDriverWait(driver, 15).until(
EC.text_to_be_present_in_element((By.CLASS_NAME, "welcome"), "欢迎回来")
)
print("登录成功!")
time.sleep(2) # 停留2秒查看结果
finally:
# 关闭浏览器
driver.quit()
options = webdriver.ChromeOptions()
options.add_argument("--headless=new") # 启用无头模式
driver = webdriver.Chrome(options=options)