一、概述
Selenium 是一款强大的Web应用自动化测试工具,支持多种浏览器(Chrome、Firefox、Edge等)和多种编程语言(Python、Java、C#等)。结合Python语言,Selenium可轻松实现模拟浏览器的各类操作,如打开网页、元素定位、输入文本、点击按钮、页面切换等,广泛应用于自动化测试、数据爬取、网页自动化操作等场景。
本文将详细介绍Python+Selenium的环境搭建流程,核心操作API的使用方法,并通过实战案例帮助读者快速上手。
二、环境准备
2.1 安装Python
1. 前往Python官方网站(https://www.python.org/)下载对应系统(Windows/macOS/Linux)的最新版本安装包;
2. 安装过程中注意勾选“Add Python to PATH”(Windows),macOS/Linux可通过命令行验证安装:python --version或python3 --version,若显示版本号则安装成功。
2.2 安装Selenium库
打开命令行终端,执行以下命令安装Selenium:
pythonpip install selenium # Windows系统pip3 install selenium # macOS/Linux系统 |
安装完成后,可通过Python交互式环境验证:输入 import selenium,若未报错则说明库安装成功。
2.3 下载浏览器驱动
Selenium通过浏览器驱动与浏览器进行交互,需下载与本地浏览器版本匹配的驱动程序:
1.查看浏览器版本:
○Chrome:打开浏览器 → 点击右上角三个点 → 帮助 → 关于Google Chrome,查看版本号(如120.0.6099.109);
○Edge:打开浏览器 → 点击右上角三个点 → 帮助和反馈 → 关于Microsoft Edge,查看版本号。
2.下载对应驱动:
○Chrome驱动:https://sites.google.com/chromium.org/driver/(国内可访问镜像站:https://npm.taobao.org/mirrors/chromedriver/);
○Edge驱动:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/。
3.配置驱动:
○Windows:将下载的驱动压缩包解压,得到.exe文件(如chromedriver.exe),可放置在Python安装目录下(或任意目录,需在代码中指定驱动路径);
○macOS/Linux:解压后得到驱动文件,放置在/usr/local/bin目录下(或指定路径),并赋予执行权限:chmod +x chromedriver。
三、核心操作API
3.1 初始化浏览器
首先导入selenium.webdriver模块,通过对应浏览器的驱动类初始化浏览器实例:
pythonfrom selenium import webdriverfrom selenium.webdriver.chrome.service import Service # Chrome驱动服务类(Selenium4+推荐)# 方式1:驱动已配置在环境变量中driver = webdriver.Chrome()# 方式2:指定驱动路径(推荐,避免环境变量配置问题)service = Service(r"C:\chromedriver.exe") # Windows路径# service = Service("/usr/local/bin/chromedriver") # macOS/Linux路径driver = webdriver.Chrome(service=service) |
执行上述代码后,会自动打开一个空白的Chrome浏览器窗口。
3.2 打开网页
使用get(url)方法打开指定网页:
pythondriver.get("https://www.baidu.com") # 打开百度首页 |
3.3 元素定位(核心)
Selenium操作网页元素的前提是准确定位元素,常用的定位方式及对应API如下:
定位方式 | API方法 | 适用场景 | 示例 |
ID定位 | find_element(By.ID, "id值") | 元素有唯一ID属性(推荐) | find_element(By.ID, "kw") # 定位百度搜索框 |
Name定位 | find_element(By.NAME, "name值") | 元素有name属性 | find_element(By.NAME, "wd") # 定位百度搜索框 |
Class Name定位 | find_element(By.CLASS_NAME, "class值") | 元素有class属性(注意多class值需取唯一部分) | find_element(By.CLASS_NAME, "s_ipt") # 定位百度搜索框 |
Tag Name定位 | find_element(By.TAG_NAME, "标签名") | 定位同类标签中唯一的元素(如<input>) | find_element(By.TAG_NAME, "input") |
Link Text定位 | find_element(By.LINK_TEXT, "链接文本") | 定位超链接(<a>标签),需完全匹配文本 | find_element(By.LINK_TEXT, "新闻") # 定位百度“新闻”链接 |
Partial Link Text定位 | find_element(By.PARTIAL_LINK_TEXT, "部分文本") | 定位超链接,模糊匹配文本 | find_element(By.PARTIAL_LINK_TEXT, "新") # 匹配“新闻”“新鲜事”等 |
XPath定位 | find_element(By.XPATH, "XPath表达式") | 万能定位方式,适用于复杂场景 | find_element(By.XPATH, '//*[@id="kw"]') # 定位百度搜索框 |
CSS Selector定位 | find_element(By.CSS_SELECTOR, "CSS选择器") | 定位效率高,语法简洁 | find_element(By.CSS_SELECTOR, "#kw") # 定位百度搜索框 |
注意:
•定位单个元素用find_element(),定位多个元素用find_elements()(返回元素列表);
•使用前需导入from selenium.webdriver.common.by import By。
3.4 元素交互操作
定位到元素后,可执行输入、点击、清空等操作:
pythonfrom selenium.webdriver.common.by import By# 1. 输入文本:send_keys(text)search_box = driver.find_element(By.ID, "kw")search_box.send_keys("Python Selenium") # 向百度搜索框输入文本# 2. 点击元素:click()search_btn = driver.find_element(By.ID, "su")search_btn.click() # 点击百度搜索按钮# 3. 清空文本:clear()search_box.clear() # 清空搜索框内容# 4. 提交表单:submit()(适用于<form>标签内的元素)search_box.send_keys("Python")search_box.submit() # 等效于点击搜索按钮 |
3.5 浏览器控制操作
python# 1. 最大化窗口driver.maximize_window()# 2. 最小化窗口driver.minimize_window()# 3. 设置窗口大小(宽,高)driver.set_window_size(1920, 1080)# 4. 前进、后退、刷新driver.get("https://www.baidu.com")driver.get("https://www.taobao.com")driver.back() # 后退到百度driver.forward() # 前进到淘宝driver.refresh() # 刷新当前页面# 5. 获取当前页面URL和标题print("当前URL:", driver.current_url)print("当前标题:", driver.title)# 6. 关闭浏览器driver.close() # 关闭当前窗口(若只有一个窗口则关闭浏览器)driver.quit() # 关闭所有窗口,终止驱动进程(推荐使用) |
3.6 等待机制(解决元素加载问题)
网页加载是异步过程,若代码执行速度快于元素加载速度,会导致定位失败。Selenium提供三种等待机制:
3.6.1 强制等待(sleep)
固定等待时间,无论元素是否加载完成,均等待指定时间后再执行后续代码(简单但不灵活):
pythonimport timedriver.get("https://www.baidu.com")time.sleep(2) # 强制等待2秒search_box = driver.find_element(By.ID, "kw") |
3.6.2 隐式等待(implicitly_wait)
设置全局等待时间,在指定时间内不断查找元素,找到则立即执行后续代码,超时未找到则报错(适用于整个驱动生命周期):
pythondriver = webdriver.Chrome(service=service)driver.implicitly_wait(10) # 隐式等待10秒driver.get("https://www.baidu.com")search_box = driver.find_element(By.ID, "kw") # 10秒内找到则执行,否则报错 |
3.6.3 显式等待(WebDriverWait)
针对性等待某个条件满足(如元素可点击、可见),超时则报错(灵活,推荐用于复杂场景):
pythonfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECdriver.get("https://www.baidu.com")# 等待10秒,直到元素可点击wait = WebDriverWait(driver, 10)search_box = wait.until(EC.element_to_be_clickable((By.ID, "kw")) # 条件:元素可点击)search_box.send_keys("Python Selenium") |
常用条件(expected_conditions):
•element_to_be_clickable:元素可点击;
•presence_of_element_located:元素存在于DOM树;
•visibility_of_element_located:元素可见(显示在页面上);
•text_to_be_present_in_element:元素包含指定文本。
四、实战案例:模拟百度搜索
以下案例实现完整的百度搜索流程:打开百度→ 输入关键词 → 点击搜索 → 等待结果加载 → 关闭浏览器。
pythonfrom selenium import webdriverfrom selenium.webdriver.chrome.service import Servicefrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as EC# 1. 初始化浏览器service = Service(r"C:\chromedriver.exe") # 替换为你的驱动路径driver = webdriver.Chrome(service=service)driver.implicitly_wait(5) # 全局隐式等待5秒driver.maximize_window() # 最大化窗口try:# 2. 打开百度首页driver.get("https://www.baidu.com")# 3. 定位搜索框,输入关键词search_box = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.ID, "kw")))search_box.send_keys("Python Selenium 教程")# 4. 定位搜索按钮,点击search_btn = driver.find_element(By.ID, "su")search_btn.click()# 5. 等待搜索结果加载,验证结果WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//div[@id="content_left"]')))print("搜索成功,当前页面标题:", driver.title)except Exception as e:print("操作失败:", str(e))finally:# 6. 关闭浏览器driver.quit() |
五、常见问题与解决方案
5.1 驱动版本不匹配
问题现象:运行代码时提示“session not created: This version of ChromeDriver only supports Chrome version XX”。
解决方案:下载与当前浏览器版本一致的驱动,可在驱动下载页面查看版本对应关系。
5.2 元素定位失败
问题现象:提示“NoSuchElementException”。
解决方案:
•检查定位表达式是否正确(可通过浏览器开发者工具验证:F12 → 元素 → Ctrl+F,输入定位表达式);
•添加等待机制(隐式等待或显式等待),确保元素加载完成;
•若元素在iframe中,需先切换到iframe:driver.switch_to.frame("iframe_id")。
5.3 浏览器自动关闭
问题现象:代码执行完成后浏览器立即关闭。
解决方案:
•检查是否误写driver.quit()(放在finally块中会在代码执行完后关闭,若需保留浏览器可注释);
•Selenium4+版本中,若使用默认驱动服务,可能会自动终止进程,可通过指定service参数并设置keep_alive=True解决。
5.4 反爬机制拦截
问题现象:模拟操作时被网站识别为爬虫,无法正常访问。
解决方案:
•添加请求头(如User-Agent):options = webdriver.ChromeOptions(); options.add_argument("user-agent=Mozilla/5.0..."); driver = webdriver.Chrome(options=options);
•禁用浏览器自动化特征:options.add_experimental_option("excludeSwitches", ["enable-automation"]);
•添加随机等待时间,模拟人工操作节奏。
六、总结
Python+Selenium实现模拟浏览器操作的核心流程为:环境搭建 → 初始化浏览器 → 打开网页 → 元素定位 → 交互操作 → 浏览器控制。其中,元素定位和等待机制是关键知识点,需根据实际场景灵活选择定位方式和等待策略。
通过本文的基础讲解和实战案例,读者可快速上手简单的浏览器自动化操作。如需实现更复杂的场景(如登录验证、下拉框选择、文件上传、多窗口切换等),可进一步学习Selenium的高级API用法。