Selenium4 Python 完整教程(适合网页自动化、页面数据采集、UI自动化测试)

文章目录

一、环境安装

bash 复制代码
pip install selenium webdriver-manager
  • selenium:核心库
  • webdriver-manager:自动识别Chrome版本,下载匹配驱动,省去手动配置驱动的麻烦

二、最小Demo:打开网页,搜索(可直接运行)

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 启动Chrome浏览器
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install())
)

# 访问网页
driver.get("https://www.baidu.com")

# 定位搜索框,输入文字,回车
search_input = driver.find_element(By.ID, "kw")
search_input.clear()
search_input.send_keys("Selenium教程")
search_input.send_keys(Keys.ENTER)

# 打印页面标题
print(driver.title)

# 关闭浏览器
driver.quit()

三、元素定位(Selenium4标准写法,重点)

Selenium4不再支持旧版find_element_by_id,统一使用find_element(By.xxx, 值)

find_element:返回单个元素,找不到直接报错;find_elements:返回元素列表,找不到返回空列表

定位方式 代码示例 适用场景
By.ID driver.find_element(By.ID,"kw") 优先用,id唯一,最稳定
By.NAME driver.find_element(By.NAME,"wd") 表单name属性
By.CLASS_NAME driver.find_element(By.CLASS_NAME,"s_ipt") 单个class名称
By.CSS_SELECTOR driver.find_element(By.CSS_SELECTOR,"input[class='s_ipt']") 最常用,层级、属性模糊匹配
By.XPATH driver.find_element(By.XPATH,"//input[@id='kw']") 按文本匹配、向上查找父节点
By.LINK_TEXT driver.find_element(By.LINK_TEXT,"新闻") a标签完整链接文本
By.PARTIAL_LINK_TEXT driver.find_element(By.PARTIAL_LINK_TEXT,"新") a标签部分文本
By.TAG_NAME driver.find_element(By.TAG_NAME,"input") 标签名批量查找

定位优先级:ID > CSS > XPath;XPath适合需要根据页面文本定位场景

四、等待机制(解决页面JS异步加载,最容易踩坑)

1. 隐式等待(全局,不推荐复杂页面)

全局设置最大等待时长,查找元素时最多等待指定秒数,找到就继续

python 复制代码
driver.implicitly_wait(5)

2. 显式等待(项目推荐,精准等待目标元素)

只针对指定元素等待,性能更好,避免固定sleep

python 复制代码
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 最多等待10秒,直到元素可点击
ele = WebDriverWait(driver,10).until(
    EC.element_to_be_clickable((By.ID,"kw"))
)

常用EC条件:

  • presence_of_element_located:元素DOM存在
  • visibility_of_element_located:元素可见
  • element_to_be_clickable:元素可点击
  • text_to_be_present_in_element:判断元素包含指定文本

❌ 尽量少用time.sleep()硬等待,不稳定、效率低

五、元素常用操作

python 复制代码
# 输入内容
ele.send_keys("输入文字")
# 清空输入框
ele.clear()
# 点击
ele.click()
# 获取元素文本
text = ele.text
# 获取属性值
attr = ele.get_attribute("href")
# 判断是否可见
ele.is_displayed()
# 判断是否启用
ele.is_enabled()

键盘按键:Keys.ENTER回车、Keys.BACK_SPACE退格、Keys.CONTROL+'a'全选

六、浏览器常用操作

python 复制代码
driver.get("url")        # 打开页面
driver.back()            # 后退
driver.forward()         # 前进
driver.refresh()         # 刷新页面
driver.title             # 获取网页标题
driver.page_source       # 获取网页源码
driver.current_url       # 获取当前url
driver.maximize_window() # 窗口最大化
driver.save_screenshot("page.png") # 页面截图

JS执行(滚动页面、修改页面数据)

python 复制代码
# 滚动到页面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滚动到指定元素
driver.execute_script("arguments[0].scrollIntoView();", ele)

七、iframe、多窗口切换(高频坑点)

  1. iframe嵌套页面:元素在iframe内部,必须切换frame才能定位
python 复制代码
# 切换到iframe
driver.switch_to.frame("iframe_id")
# 切回主页面
driver.switch_to.default_content()
  1. 多标签页切换
python 复制代码
# 获取所有窗口句柄
windows = driver.window_handles
# 切换到第二个标签
driver.switch_to.window(windows[1])

八、无头模式(后台运行浏览器,不弹出窗口,服务器部署)

python 复制代码
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless=new") # 无头
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--no-sandbox")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

九、异常处理

常见异常:

  • NoSuchElementException:找不到元素
  • TimeoutException:等待超时
  • ElementClickInterceptedException:元素被遮挡无法点击
python 复制代码
from selenium.common.exceptions import TimeoutException, NoSuchElementException

try:
    ele = WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,"kw")))
    ele.click()
except TimeoutException:
    print("元素等待超时")
except NoSuchElementException:
    print("元素不存在")

十、实战小项目:页面自动截图采集(贴合你业务监控场景)

场景:访问业务页面,等待页面加载完成,截图保存,用于页面快照监控

python 复制代码
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument("--headless=new")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)

try:
    driver.get("https://xxx业务页面")
    # 等待页面核心元素加载完成
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID,"main-container")))
    driver.save_screenshot("business_page.png")
    print("页面截图保存成功")
finally:
    driver.quit()
相关推荐
新新学长搞科研1 小时前
【IET出版 | 连续五届稳定检索】第六届机械自动化与电子信息工程国际学术会议(MAEIE 2026)
机器人·自动化·电子信息
小小张说故事1 小时前
Python 里 a is b 有时 True 有时 False?小整数缓存和常量折叠的底层真相
python
我的xiaodoujiao1 小时前
Django 基础知识详细图文教程 16-Django 内置Admin认证系统
后端·python·django
ZGonce8191 小时前
vLLM 使用实战:在 8GB 显卡上完成模型部署、并发压测与显存调优
python
Dovis(誓平步青云)1 小时前
一年1956亿行:智能电表场景下的时序数据存储实践
运维·前端·自动化·音视频·prometheus
XZ-0700011 小时前
week8-代码解析2
python
小虎牙^O^1 小时前
棋盘格隐写:基于奇偶相位的双图隐藏与还原
图像处理·python·安全
虎鲸不是鱼2 小时前
AI 自动化逆向(五)控制组:区分「没有」和「没取到」
人工智能·自动化·大模型·ai逆向·ai反编译
薛定猫AI2 小时前
【技术干货】基于本地优先架构的开源AI智能体Octopus系统设计与实战解析
python·机器学习·ai·大模型·技术实战