杰瑞科技汇

Selenium Python自动化怎么学?

从零开始精通 Selenium Python 自动化:2025年最全实战指南(附代码与避坑)

Meta 描述:

想用 Python 玩转 Web 自动化测试、爬虫或数据采集?本指南手把手教你使用 Selenium,从环境搭建到元素定位,再到实战案例,助你快速掌握 Selenium Python 自动化,提升工作效率,避开所有常见陷阱。


引言:为什么 Selenium Python 是自动化领域的“瑞士军刀”?

在当今快节奏的互联网时代,重复性的手动操作正在吞噬着开发者和测试工程师的宝贵时间,无论是进行功能回归测试、批量数据采集,还是实现网页的自动化交互,寻找一个稳定、强大且易于上手的工具都至关重要。

这时,Selenium Python 自动化框架便闪亮登场,它被誉为自动化领域的“瑞士军刀”,原因很简单:

  • 跨浏览器兼容:无论是 Chrome、Firefox、Safari 还是 Edge,Selenium 都能完美驾驭。
  • 跨平台支持:Windows、macOS、Linux,你的系统不是障碍。
  • 强大的社区支持:作为全球最受欢迎的自动化工具之一,你几乎能找到任何问题的答案。
  • 与 Python 的完美结合:Python 语法简洁,库生态丰富,让编写自动化脚本变得轻松愉快。

本文将为你提供一份详尽的、从入门到实践的 Selenium Python 自动化指南,让你彻底告别重复劳动,拥抱高效与智能。


第一章:环境搭建 —— 你的自动化之旅从这里启航

工欲善其事,必先利其器,在开始编码之前,我们需要搭建好开发环境。

安装 Python 如果你还没有安装 Python,请访问 python.org 下载并安装最新稳定版,安装时,请务必勾选 "Add Python to PATH" 选项。

安装 Selenium 库 打开你的终端或命令提示符,运行以下命令:

pip install selenium

这会自动下载并安装 Selenium 包及其依赖。

安装浏览器驱动 Selenium 本身不控制浏览器,它需要通过一个“中间人”——浏览器驱动——来下达指令,以最常用的 Chrome 浏览器为例:

  • 下载驱动:访问 Chrome for Testing availability,下载与你 Chrome 浏览器版本(在 设置 -> Chrome 中查看)匹配的 chromedriver
  • 配置驱动:将下载好的 chromedriver.exe (Windows) 或 chromedriver (macOS/Linux) 文件放到 Python 的 Scripts 目录下,或者放在你的项目根目录下。推荐后者,并确保它在你的系统环境变量 PATH 中,这样 Selenium 就能自动找到它。

专家提示:为了避免手动管理驱动的版本匹配问题,强烈推荐使用 webdriver-manager 这个第三方库,它会自动下载和管理正确的驱动版本!

pip install webdriver-manager

第二章:核心概念与基础操作 —— 掌握自动化的“手”和“眼”

让我们开始编写第一行 Selenium 代码。

初始化浏览器

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
# 使用 webdriver-manager 自动管理驱动
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
# 如果你手动下载了驱动
# service = Service(executable_path='path/to/your/chromedriver')
# driver = webdriver.Chrome(service=service)
print("浏览器启动成功!")

打开网页 使用 get() 方法导航到你想要的 URL。

driver.get("https://www.baidu.com")
print(f"当前页面标题: {driver.title}")

核心操作:元素定位 自动化脚本要和网页元素(如按钮、输入框、链接)交互,首先必须能“找到”它们,Selenium 提供了 8 种定位方式,最常用的有:

  • ID:最可靠的方式,如果元素有唯一的 id 属性。

    search_box = driver.find_element("id", "kw")
  • NAME:通过 name 属性定位。

    search_box = driver.find_element("name", "wd")
  • XPath:强大的路径语言,可以灵活定位任何元素,即使没有 id 或 name。

    # 通过绝对路径(不推荐,页面结构易变)
    # search_box = driver.find_element("xpath", "/html/body/div[1]/div[1]/div[5]/div/div/form/span[1]/input")
    # 通过相对路径(推荐)
    search_box = driver.find_element("xpath", '//input[@id="kw"]')
  • CSS Selector:速度快,语法简洁,是 XPath 的有力竞争者。

    # 通过 ID
    search_box = driver.find_element("css selector", "#kw")
    # 通过 Class
    search_box = driver.find_element("css selector", ".s_ipt")
    # 通过属性
    search_box = driver.find_element("css selector", 'input[maxlength="255"]')

专家提示:在浏览器开发者工具(F12)中,右键点击元素 -> Copy -> Copy XPathCopy selector 是快速获取定位表达式的便捷方式。

与元素交互 找到元素后,就可以进行操作了。

# 1. 在搜索框中输入内容
search_box.send_keys("Selenium Python 自动化")
# 2. 点击“百度一下”按钮
search_button = driver.find_element("id", "su")
search_button.click()
# 等待3秒,观察结果
import time
time.sleep(3) 

获取页面信息

# 获取搜索结果页的标题
print(f"搜索结果页标题: {driver.title}")
# 获取第一个搜索结果的文本
first_result = driver.find_element("css selector", ".result h3").text
print(f"第一个搜索结果: {first_result}")

关闭浏览器 操作完成后,务必关闭浏览器以释放资源。

driver.quit()

第三章:高级技巧与实战案例 —— 让你的脚本“活”起来

基础的交互已经掌握,现在我们来学习一些更高级的技巧,让你的自动化脚本更健壮、更智能。

实战案例一:模拟登录知乎并获取文章列表

这个案例会涉及等待、切换窗口、处理弹窗等常见场景。

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
from selenium.common.exceptions import TimeoutException
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.zhihu.com/signin")
try:
    # 显式等待:等待登录按钮出现,最多10秒
    login_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, ".SignFlow-button"))
    )
    login_button.click()
    # 切换到 iframe 中的登录表单
    driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR, ".SignFlow-content"))
    # 输入用户名和密码(请替换成你自己的)
    username = driver.find_element(By.CSS_SELECTOR, '[name="username"]')
    password = driver.find_element(By.CSS_SELECTOR, '[name="password"]')
    username.send_keys("your_username")
    password.send_keys("your_password")
    # 点击登录按钮
    submit_button = driver.find_element(By.CSS_SELECTOR, '.Button--primary')
    submit_button.click()
    # 登录成功后,等待并跳转到首页
    WebDriverWait(driver, 10).until(
        EC.url_contains("www.zhihu.com")
    )
    print("登录成功!")
    # 访问某个话题页面
    driver.get("https://www.zhihu.com/topic/19562174/hot")
    print(f"当前页面: {driver.title}")
    # 获取热门文章标题
    article_titles = driver.find_elements(By.CSS_SELECTOR, ".ContentItem-title a")
    print("\n--- 热门文章列表 ---")
    for i, title in enumerate(article_titles[:5]): # 只取前5个
        print(f"{i+1}. {title.text}")
except TimeoutException:
    print("页面加载超时或元素未找到!")
finally:
    driver.quit()

代码解析:

  • 显式等待 (WebDriverWait):这是脚本健壮性的关键,它不像 time.sleep() 那样盲目等待,而是会每隔一段时间检查一次条件(如元素是否可见、可点击),一旦条件满足就立即继续执行,大大提高了脚本的执行效率和稳定性。
  • 切换到 iframe:现代网页中,登录框、视频播放器等内容常常嵌入在 iframe 中,你需要先 switch_to.frame() 才能定位到其中的元素。
  • 异常处理 (try...except):网络延迟、页面结构变化都可能导致脚本失败,使用 try...except 捕获异常,可以让你的脚本在遇到问题时优雅地退出,而不是直接崩溃。

第四章:常见问题与避坑指南 —— 专家的经验之谈

即使是最经验丰富的开发者,也会遇到 Selenium 的“坑”,这里总结了一些最常见的问题及解决方案。

元素定位失败?

  • 原因:页面未加载完成、元素被遮挡、使用了错误的定位表达式、iframe 问题。
  • 解决方案
    1. 增加等待:优先使用 WebDriverWait 显式等待,而不是 time.sleep()
    2. 检查定位器:在开发者工具中验证你的 XPath 或 CSS Selector 是否准确。
    3. 检查 iframe:确保你在正确的上下文中(主页面或 iframe)进行定位。

浏览器一闪而过,脚本立即结束?

  • 原因:脚本执行过快,浏览器还没来得及响应就关闭了。
  • 解决方案:在 driver.quit() 之前添加 time.sleep(5) 或使用 input("按回车键退出..."),让程序暂停,方便你观察。

处理文件上传弹窗?

  • 问题<input type="file"> 元素可以通过 send_keys() 直接发送文件路径,但系统原生弹窗无法通过 Selenium 控制。
  • 解决方案:直接操作文件输入框,绕过系统弹窗。
    file_input = driver.find_element("id", "upload-input")
    file_input.send_keys("C:/path/to/your/file.pdf")

如何绕过反爬机制?

  • 问题:一些网站会检测 Selenium 的特征(如 navigator.webdriver 属性)并阻止访问。

  • 解决方案:使用 options 参数来隐藏自动化特征。

    from selenium.webdriver.chrome.options import Options
    options = Options()
    options.add_argument("--disable-blink-features=AutomationControlled") # 关键:禁用自动化特征
    options.add_experimental_option("excludeSwitches", ["enable-automation"])
    options.add_experimental_option('useAutomationExtension', False)
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    # 在脚本开头执行以下两行代码
    driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
        "source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
    })

第五章:未来展望与学习路径

Selenium 不仅仅是一个工具,更是一种思维方式的转变,掌握了它,你就拥有了将重复性工作自动化的超能力。

结合其他工具,打造强大生态

  • Pytest + Selenium:使用 Pytest 框架组织你的测试用例,实现数据驱动、参数化,让测试更专业。
  • Allure + Selenium:生成美观、详细的测试报告,让你的工作成果一目了然。
  • Requests + Selenium:先用 Requests 快速获取数据,仅在需要处理动态内容时再调用 Selenium,效率倍增。

持续学习,拥抱变化 Web 技术在不断演进,Selenium 也在持续更新,保持对新版本、新特性的关注,积极参与社区讨论,是成为自动化专家的必经之路。


从环境搭建到实战案例,再到高级技巧和避坑指南,我们一同走过了 Selenium Python 自动化的核心旅程,希望这篇详尽的指南能为你点亮前行的道路。

自动化不是目的,而是提升效率、解放创造力的手段,打开你的 IDE,动手实践吧!当你亲手写出的脚本成功替代了数小时的手动劳动时,你将体会到无与伦比的成就感。

你准备好用 Selenium Python 来改变你的工作方式了吗?欢迎在评论区分享你的项目或遇到的问题!

分享:
扫描分享到社交APP
上一篇
下一篇