Selenium Python 完整教程:从入门到自动化测试实战
目录
- 什么是 Selenium?
- 为什么选择 Selenium + Python?
- 第一步:环境搭建
- 第二步:Selenium 核心概念与 API
- 第三步:实战演练 - 常见操作
- 第四步:处理等待与异常
- 第五步:高级技巧
- 第六步:项目实战:一个简单的网页爬虫/自动化测试脚本
- 总结与学习资源
什么是 Selenium?
Selenium 是一个用于 Web 应用程序自动化测试的开源工具框架,它可以直接在浏览器中运行,就像一个真实用户一样,可以点击链接、填写表单、验证页面内容等。
你可以用 Selenium 编写代码,让浏览器自动执行你预设的一系列操作。
为什么选择 Selenium + Python?
- Python 语法简洁易学:对于初学者非常友好,可以让你专注于自动化逻辑本身,而不是复杂的语法。
- 强大的社区支持:拥有庞大的开发者社区,遇到任何问题都能轻松找到解决方案和丰富的第三方库。
- 生态系统丰富:可以轻松地与其他优秀的 Python 测试框架(如
pytest,unittest)和库(如Allure用于生成报告,pytest-html用于生成 HTML 报告)集成。 - 跨平台:Python 和 Selenium 都支持 Windows, macOS, Linux 等主流操作系统。
第一步:环境搭建
在开始之前,请确保你的电脑已经安装了 Python 和 pip (Python 的包管理工具)。
1 安装 Selenium 库
打开你的终端或命令提示符,运行以下命令来安装 Selenium:
pip install selenium
2 安装浏览器驱动
Selenium 本身不控制浏览器,它需要通过一个叫 WebDriver 的中间件来实现,WebDriver 是一个浏览器特定的可执行文件,负责接收 Selenium 的指令并驱动浏览器。
你需要为你想要控制的浏览器下载对应的驱动。
以 Chrome 浏览器为例:
- 确定你的 Chrome 浏览器版本:在 Chrome 地址栏输入
chrome://version/查看。 - 下载对应版本的 WebDriver:
- 访问 Chrome for Testing availability (Google 提供的官方下载页面): https://googlechromelabs.github.io/chrome-for-testing/
- 找到与你浏览器版本匹配的
chromedriver,通常下载win64(Windows),mac-x64或mac-arm64(macOS),linux64(Linux) 版本。 - 下载后,解压得到一个名为
chromedriver.exe(Windows) 或chromedriver(macOS/Linux) 的文件。
- 配置 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_element 或 find_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,并获取你的仓库列表。
思路:
- 打开 GitHub 登录页面。
- 定位用户名和密码输入框,并输入信息。
- 定位并点击 "Sign in" 按钮。
- 等待登录成功,并跳转到仓库页面。
- 定位并打印所有仓库名称。
- 关闭浏览器。
代码 (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(),让脚本更稳定、更高效。 - 处理异常和等待是编写健壮脚本的关键。
学习资源
- 官方文档:
- Selenium with Python:最权威的资料。
- Selenium API Docs:详细的 API 参考。
- 浏览器开发者工具:学习使用 F12(或右键“检查”)来分析网页结构,这是定位元素最重要的工具。
- 练习网站:
- Selenium Playground
- The Internet:经典的练习网站。
- 社区:
- Stack Overflow:搜索你的问题,很可能已经有人问过并得到了解答。
- GitHub:查看和学习别人的开源项目。
祝你学习愉快,早日成为自动化测试高手!
