Selenium 教程(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在软件测试和自动化领域,Selenium 教程是开发者必经的进阶之路。无论是编程初学者还是有一定经验的开发者,掌握 Selenium 都能显著提升工作效率。它不仅是功能测试的强大工具,还能帮助开发者理解浏览器与网页交互的底层逻辑。本文将通过循序渐进的方式,结合实际案例和代码示例,带您从零开始探索 Selenium 的核心功能,同时融入形象化的比喻,让复杂概念变得通俗易懂。


环境搭建与基础概念

安装与配置

使用 Selenium 前,需要完成以下准备工作:

  1. 编程语言支持:Selenium 支持多种语言,如 Python、Java、C# 等。本文以 Python 为例,因其简洁易学,适合新手入门。
  2. 安装 Selenium 库:通过命令行执行 pip install selenium 安装核心库。
  3. 浏览器驱动:Selenium 需要与浏览器的驱动程序配合工作。例如,Chrome 浏览器需要下载对应的 ChromeDriver,其版本需与浏览器保持一致。

比喻
Selenium 可以类比为“网页操作遥控器”,而浏览器驱动则是“遥控器与电视之间的信号转换器”。没有驱动,Selenium 的指令无法传递给浏览器。

启动浏览器与基础操作

以下代码展示如何启动 Chrome 浏览器并访问目标网页:

from selenium import webdriver  
from selenium.webdriver.common.by import By  

driver = webdriver.Chrome(executable_path="/path/to/chromedriver")  

driver.get("https://example.com")  

driver.quit()  

关键点解析

  • webdriver.Chrome() 初始化浏览器实例。
  • get() 方法用于加载指定 URL。
  • quit() 安全关闭浏览器并释放资源。

定位网页元素:Selenium 的核心能力

定位策略与优先级

元素定位是 Selenium 的核心功能,决定了操作对象的准确性。常见定位方法包括:

定位方式语法示例适用场景
IDBy.ID, "username"元素有唯一 ID 时优先使用
NameBy.NAME, "search"表单元素常用
Class NameBy.CLASS_NAME, "button"适用于 CSS 类名
CSS 选择器By.CSS_SELECTOR, "#id .class"复杂层级定位灵活
XPathBy.XPATH, "//input[@type='text']"精确匹配路径,适合动态元素

比喻
定位元素如同在图书馆找一本书:ID 相当于“唯一书号”,XPath 则是“从书架到书本的详细路线图”,而 CSS 选择器更像“按书架分类快速检索”。

定位元素并执行操作

以下代码演示如何通过 ID 定位输入框并输入文本:

username_input = driver.find_element(By.ID, "username")  

username_input.send_keys("test_user")  

常见操作方法

  • click():模拟鼠标点击。
  • clear():清空输入框内容。
  • submit():提交表单。

进阶操作:处理动态内容与复杂场景

等待机制:解决元素加载延迟

网页元素可能因网络或异步操作延迟加载,直接操作可能导致 ElementNotInteractableException。Selenium 提供两种等待方式:

  1. 隐式等待:全局生效,对后续所有操作生效。
    driver.implicitly_wait(10)  # 等待最多 10 秒  
    
  2. 显式等待:针对特定条件的精准等待。
    from selenium.webdriver.support.ui import WebDriverWait  
    from selenium.webdriver.support import expected_conditions as EC  
    
    element = WebDriverWait(driver, 10).until(  
        EC.presence_of_element_located((By.ID, "dynamic_element"))  
    )  
    

比喻
隐式等待像“设定交通灯的最长红灯时间”,而显式等待则是“观察路口直到绿灯亮起”。

处理弹窗与多窗口

弹窗处理:通过 switch_to.alert 切换上下文。

alert = driver.switch_to.alert  
alert.accept()  # 点击确认按钮  

多窗口切换

current_window = driver.current_window_handle  

for handle in driver.window_handles:  
    if handle != current_window:  
        driver.switch_to.window(handle)  
        break  

实战案例:自动化登录功能

案例背景

假设需要自动化登录某网站,其登录表单包含用户名、密码输入框和提交按钮,ID 分别为 usernamepasswordlogin_btn

完整代码示例

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  

def auto_login():  
    driver = webdriver.Chrome(executable_path="/path/to/chromedriver")  
    driver.get("https://example.com/login")  

    # 等待用户名输入框可见  
    username_input = WebDriverWait(driver, 10).until(  
        EC.visibility_of_element_located((By.ID, "username"))  
    )  
    username_input.send_keys("your_username")  

    password_input = driver.find_element(By.ID, "password")  
    password_input.send_keys("your_password")  

    login_btn = driver.find_element(By.ID, "login_btn")  
    login_btn.click()  

    # 验证登录成功  
    WebDriverWait(driver, 10).until(  
        EC.url_contains("dashboard")  # 检查 URL 是否包含 "dashboard"  
    )  
    print("登录成功!")  

    driver.quit()  

if __name__ == "__main__":  
    auto_login()  

关键步骤解析

  1. 显式等待:确保输入框和按钮加载完成后再操作。
  2. URL 验证:通过 url_contains 断言登录后跳转到指定页面。
  3. 异常处理:可添加 try-except 块捕获登录失败情况。

高级技巧:提升测试效率与可维护性

页面对象模式(Page Object Pattern)

将元素定位和操作封装到独立类中,例如:

class LoginPage:  
    def __init__(self, driver):  
        self.driver = driver  
        self.username_input = (By.ID, "username")  
        self.password_input = (By.ID, "password")  
        self.login_btn = (By.ID, "login_btn")  

    def login(self, username, password):  
        self.driver.find_element(*self.username_input).send_keys(username)  
        self.driver.find_element(*self.password_input).send_keys(password)  
        self.driver.find_element(*self.login_btn).click()  

优势

  • 代码复用性高,修改界面时只需调整定位器。
  • 提升可读性,例如 login() 方法直接表达业务逻辑。

并行测试与报告生成

  1. 并行测试:使用 pytest-xdist 库加速测试执行。
    pytest -n 4  # 使用 4 个线程并行运行  
    
  2. HTML 报告:通过 pytest-html 生成可视化报告,便于团队协作分析结果。

结论

通过本文的讲解,您已掌握从环境搭建到实战案例的完整 Selenium 教程 流程。无论是基础的元素定位,还是高级的并行测试,Selenium 的灵活性和扩展性都能满足多样化需求。建议读者从简单案例入手,逐步挑战复杂场景,同时结合官方文档和社区资源(如 Stack Overflow)深化理解。自动化测试不仅是技术工具,更是提升开发效率、保障代码质量的重要手段。

最后提醒:实践是学习的最佳方式。尝试将本文示例代码应用于实际项目,并逐步扩展功能,您将更深刻地理解 Selenium 的价值。

最新发布