杰瑞科技汇

Selenium Python怎么学?入门到实战教程指南?

Selenium Python 完整教程:从入门到自动化测试实战

目录

  1. 什么是 Selenium?
  2. 为什么选择 Selenium + Python?
  3. 第一步:环境搭建
  4. 第二步:Selenium 核心概念与 API
  5. 第三步:实战演练 - 常见操作
  6. 第四步:处理等待与异常
  7. 第五步:高级技巧
  8. 第六步:项目实战:一个简单的网页爬虫/自动化测试脚本
  9. 总结与学习资源

什么是 Selenium?

Selenium 是一个用于 Web 应用程序自动化测试的开源工具框架,它可以直接在浏览器中运行,就像一个真实用户一样,可以点击链接、填写表单、验证页面内容等。

你可以用 Selenium 编写代码,让浏览器自动执行你预设的一系列操作。

为什么选择 Selenium + Python?

  • Python 语法简洁易学:对于初学者非常友好,可以让你专注于自动化逻辑本身,而不是复杂的语法。
  • 强大的社区支持:拥有庞大的开发者社区,遇到任何问题都能轻松找到解决方案和丰富的第三方库。
  • 生态系统丰富:可以轻松地与其他优秀的 Python 测试框架(如 pytest, unittest)和库(如 Allure 用于生成报告,pytest-html 用于生成 HTML 报告)集成。
  • 跨平台:Python 和 Selenium 都支持 Windows, macOS, Linux 等主流操作系统。

第一步:环境搭建

在开始之前,请确保你的电脑已经安装了 Pythonpip (Python 的包管理工具)。

1 安装 Selenium 库

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

pip install selenium

2 安装浏览器驱动

Selenium 本身不控制浏览器,它需要通过一个叫 WebDriver 的中间件来实现,WebDriver 是一个浏览器特定的可执行文件,负责接收 Selenium 的指令并驱动浏览器。

你需要为你想要控制的浏览器下载对应的驱动。

以 Chrome 浏览器为例:

  1. 确定你的 Chrome 浏览器版本:在 Chrome 地址栏输入 chrome://version/ 查看。
  2. 下载对应版本的 WebDriver
    • 访问 Chrome for Testing availability (Google 提供的官方下载页面): https://googlechromelabs.github.io/chrome-for-testing/
    • 找到与你浏览器版本匹配的 chromedriver,通常下载 win64 (Windows), mac-x64mac-arm64 (macOS), linux64 (Linux) 版本。
    • 下载后,解压得到一个名为 chromedriver.exe (Windows) 或 chromedriver (macOS/Linux) 的文件。
  3. 配置 WebDriver 路径
    • 方法一(推荐):将驱动文件放到系统环境变量 PATH 中。 这样 Selenium 就能自动找到它。
    • 在代码中指定驱动文件的完整路径。 这是最直接的方法,适合初学者。

第二步:Selenium 核心概念与 API

Selenium 的核心操作围绕着几个主要的对象展开。

1 WebDriver 对象

这是你与浏览器交互的起点,你需要创建一个 WebDriver 实例来启动一个浏览器会话。

from selenium import webdriver
# 方法二:指定驱动路径
# driver_path = "C:/path/to/your/chromedriver.exe"
# driver = webdriver.Chrome(executable_path=driver_path)
# 方法一(推荐,如果驱动已在PATH中)
driver = webdriver.Chrome()
# 访问一个网页
driver.get("https://www.baidu.com")
# 打印页面标题
print(driver.title)
# 关闭浏览器
driver.quit()

2 WebElement 对象

当你通过 find_elementfind_elements 方法找到页面上的元素(如按钮、输入框、链接)后,返回的就是 WebElement 对象,你可以对它进行各种操作。

3 定位元素

这是自动化中最关键的一步,你需要告诉 Selenium 如何找到页面上的元素,Selenium 提供了 8 种定位方式:

定位方式 Python 方法 描述
ID find_element(By.ID, "value") 最推荐,通常唯一且稳定
Name find_element(By.NAME, "value") 次推荐,可能不唯一
Class Name find_element(By.CLASS_NAME, "value") 适用于元素有唯一的 class
Tag Name find_element(By.TAG_NAME, "value") 不常用,因为 tag 通常重复
Link Text find_element(By.LINK_TEXT, "value") 专门用于精确匹配超链接文本
Partial Link Text find_element(By.PARTIAL_LINK_TEXT, "value") 用于匹配超链接文本的一部分
CSS Selector find_element(By.CSS_SELECTOR, "value") 非常强大和灵活,推荐掌握
XPath find_element(By.XPATH, "value") 同样非常强大,可以处理复杂结构

使用前需要导入 By

from selenium.webdriver.common.by import By

示例:

# 通过 ID 定位搜索框
search_box = driver.find_element(By.ID, "kw")
# 通过 Name 定位
# search_box = driver.find_element(By.NAME, "wd")
# 通过 CSS Selector 定位 (class 前面加点)
# search_box = driver.find_element(By.CSS_SELECTOR, ".s_ipt")
# 通过 XPath 定位
# search_box = driver.find_element(By.XPATH, '//*[@id="kw"]')

第三步:实战演练 - 常见操作

我们以百度首页为例,演示常见的浏览器操作。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys # 用于模拟键盘按键
from selenium.webdriver.common.action_chains import ActionChains # 用于模拟复杂鼠标操作
import time # 用于暂停,方便观察
# 1. 启动浏览器
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
# 2. 定位元素并操作
# 2.1 在搜索框输入内容
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium Python 教程")
# 2.2 模拟回车键(或点击搜索按钮)
# search_box.send_keys(Keys.ENTER) # 方法一:回车
# 方法二:点击搜索按钮
search_button = driver.find_element(By.ID, "su")
search_button.click()
# 3. 等待 3 秒,观察结果
time.sleep(3)
# 4. 获取结果并打印
# 获取第一个搜索结果的标题
first_result_title = driver.find_element(By.CSS_SELECTOR, "#content_left > div:nth-child(1) > h3 > a").text
print(f"第一个搜索结果的标题是: {first_result_title}")
# 5. 获取页面截图
driver.save_screenshot("baidu_search_result.png")
# 6. 关闭浏览器
driver.quit()

第四步:处理等待与异常

直接使用 time.sleep() 是一种“硬性等待”,它会让脚本暂停固定时间,无论页面是否加载完成,这会导致效率低下且不稳定,Selenium 提供了两种“智能等待”。

1 隐式等待

在查找元素时,如果元素没有立即找到,Selenium 会等待一段时间(最长为你设置的时间),然后再尝试查找,只需要设置一次,对整个 driver 生效。

driver = webdriver.Chrome()
driver.implicitly_wait(10) # 隐式等待,最长等待10秒
driver.get("https://www.example.com")
# 在这里查找任何元素,如果找不到,会自动等待最多10秒
element = driver.find_element(By.ID, "some-dynamic-element")

2 显式等待

这是更强大、更精确的等待方式,你可以设置一个条件,Selenium 会一直检查这个条件,直到条件满足或超时。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://www.example.com")
try:
    # 等待最多10秒,直到ID为"myDynamicElement"的元素可见
    my_element = WebDriverWait(driver, 10).until(
        EC.visibility_of_element_located((By.ID, "myDynamicElement"))
    )
    print("元素找到了!")
    my_element.click()
except Exception as e:
    print(f"元素在10秒内未出现: {e}")
driver.quit()

3 处理异常

自动化脚本可能会因为各种原因失败(如元素找不到、网络超时等),使用 try...except 可以让脚本更健壮。

from selenium.common.exceptions import NoSuchElementException, TimeoutException
try:
    element = driver.find_element(By.ID, "non_existent_id")
    element.click()
except NoSuchElementException:
    print("找不到该元素,请检查定位器是否正确!")
except TimeoutException:
    print("等待超时,页面加载可能有问题!")

第五步:高级技巧

1 切换窗口/标签页

当点击链接打开一个新窗口或标签页时,你需要切换 driver 的焦点。

# 获取当前所有窗口句柄
handles = driver.window_handles
# 点击一个会打开新窗口的链接
new_window_link = driver.find_element(By.LINK_TEXT, "Open New Window")
new_window_link.click()
# 切换到最新的窗口
driver.switch_to.window(handles[-1])
# 在新窗口中操作...
print(driver.title)
# 关闭当前窗口并切回原来的窗口
driver.close()
driver.switch_to.window(handles[0])

2 处理 iframe

iframe (内联框架) 是在当前页面中嵌入另一个 HTML 页面,要操作 iframe 内部的元素,必须先切换到 iframe

# 切换到 iframe (可以通过 id, name, 或 WebElement)
driver.switch_to.frame("iframe_id")
# 现在可以在 iframe 内部定位元素了
iframe_element = driver.find_element(By.ID, "element_inside_iframe")
iframe_element.click()
# 操作完成后,切回主页面 (默认内容)
driver.switch_to.default_content()

3 处理弹窗(Alerts)

# 触发一个 JavaScript 弹窗
driver.execute_script("alert('Hello, Selenium!');")
# 切换到弹窗
alert = driver.switch_to.alert
# 获取弹窗文本
print(alert.text)
# 接受弹窗 (点击"确定")
alert.accept()
# 或者拒绝弹窗 (点击"取消")
# alert.dismiss()

第六步:项目实战:一个简单的网页爬虫/自动化测试脚本

目标:自动登录 GitHub,并获取你的仓库列表。

思路

  1. 打开 GitHub 登录页面。
  2. 定位用户名和密码输入框,并输入信息。
  3. 定位并点击 "Sign in" 按钮。
  4. 等待登录成功,并跳转到仓库页面。
  5. 定位并打印所有仓库名称。
  6. 关闭浏览器。

代码 (github_automation.py):

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
# --- 配置 ---
USERNAME = "your_github_username" # 替换成你的用户名
PASSWORD = "your_github_password" # 替换成你的密码
DRIVER_PATH = "C:/path/to/your/chromedriver.exe" # 替换成你的驱动路径
def main():
    # 1. 初始化 WebDriver
    options = webdriver.ChromeOptions()
    # options.add_argument('--headless') # 如果想在后台运行,取消这行注释
    driver = webdriver.Chrome(executable_path=DRIVER_PATH, options=options)
    driver.maximize_window()
    try:
        # 2. 打开登录页面
        driver.get("https://github.com/login")
        # 3. 使用显式等待登录框出现
        print("正在等待登录框加载...")
        username_field = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.ID, "login_field"))
        )
        password_field = driver.find_element(By.ID, "password")
        # 4. 输入用户名和密码
        username_field.send_keys(USERNAME)
        password_field.send_keys(PASSWORD)
        print("已输入用户名和密码。")
        # 5. 点击登录按钮
        sign_in_button = driver.find_element(By.NAME, "commit")
        sign_in_button.click()
        print("已点击登录按钮。")
        # 6. 等待跳转到仓库页面,并检查是否登录成功
        # 我们可以通过检查 URL 是否包含 'your_username' 来判断
        WebDriverWait(driver, 15).until(
            EC.url_contains(USERNAME)
        )
        print(f"登录成功!当前URL: {driver.current_url}")
        # 7. 获取并打印仓库名称
        print("\n正在获取仓库列表...")
        # 仓库列表的 class 可能会变,这里使用一个相对稳定的定位方式
        repo_list = WebDriverWait(driver, 10).until(
            EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[itemprop='name codeRepository']"))
        )
        if not repo_list:
            print("没有找到任何仓库。")
        else:
            print("你的仓库列表如下:")
            for i, repo in enumerate(repo_list):
                print(f"{i+1}. {repo.text}")
    except TimeoutException:
        print("操作超时,请检查网络或元素定位是否正确。")
    except Exception as e:
        print(f"发生未知错误: {e}")
    finally:
        # 8. 无论成功与否,最后都关闭浏览器
        print("\n脚本执行完毕,正在关闭浏览器...")
        driver.quit()
if __name__ == "__main__":
    main()

总结与学习资源

  • Selenium + Python 是进行 Web 自动化测试和爬虫的黄金组合。
  • 核心流程是:启动浏览器 -> 访问页面 -> 定位元素 -> 操作元素 -> 获取结果 -> 关闭浏览器
  • 定位元素是自动化工作的基石,务必精通 CSS Selector 和 XPath。
  • 使用显式等待代替硬性 time.sleep(),让脚本更稳定、更高效。
  • 处理异常等待是编写健壮脚本的关键。

学习资源

  • 官方文档
  • 浏览器开发者工具:学习使用 F12(或右键“检查”)来分析网页结构,这是定位元素最重要的工具。
  • 练习网站
  • 社区
    • Stack Overflow:搜索你的问题,很可能已经有人问过并得到了解答。
    • GitHub:查看和学习别人的开源项目。

祝你学习愉快,早日成为自动化测试高手!

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