广告

从零基础到上手:面向软件测试行业的Python+Selenium自动化测试入门教程

从零基础到上手:搭建Python+Selenium自动化测试环境

准备工作与安装要点

明确目标:通过自动化脚本实现重复性测试,降低人工成本,提高覆盖率。

工具链选择:在软件测试行业中,Python作为编程语言的学习成本低、生态丰富,Selenium承担浏览器端的自动化,搭配浏览器驱动管理工具实现跨浏览器执行。

首先需要安装Python,建议使用3.8及以上版本以获得更好的兼容性。安装完成后,在终端确认版本号,确保环境就绪。

# 安装依赖
pip install selenium webdriver-manager

创建虚拟环境与依赖管理

在实际开发中,虚拟环境可以避免全局依赖冲突,提升可控性,推荐使用venv或conda来实现项目级隔离。

通过下列步骤创建虚拟环境并安装依赖,确保依赖可重复、便于团队协作

# 使用venv创建虚拟环境
python -m venv venv
source venv/bin/activate  # Linux/macOS
venv\Scripts\activate     # Windows

# 安装依赖
pip install selenium webdriver-manager

核心技能:用Python实现基本的网页自动化测试

定位元素与交互

定位策略是自动化测试的核心,常用方法有By.ID、By.NAME、By.CSS_SELECTOR等,优先选择稳定且对页面结构变动不敏感的定位方式。

在实际场景中,稳定的定位可以显著提高脚本鲁棒性,避免使用易碎的XPath,以减少维护成本。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://example.com/login")

elem_username = driver.find_element(By.NAME, "username")
elem_username.send_keys("demo_user")

elem_password = driver.find_element(By.NAME, "password")
elem_password.send_keys("secret")
driver.quit()

等待策略与鲁棒性

网页加载时间差异会导致定位失败,因此需要引入等待机制。显式等待(WebDriverWait)是推荐做法,能够在目标条件成立时再进行下一步操作。

通过等待条件确保元素可用后再执行交互,避免因加载延迟导致的测试失败,从而提升测试的稳定性。

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://example.com/dashboard")

wait = WebDriverWait(driver, 10)
profile_button = wait.until(EC.element_to_be_clickable((By.ID, "profile")))

profile_button.click()
driver.quit()

处理动态内容与页面切换

现代页面常以异步加载和单页面应用形式呈现,需要处理iframe、滚动以及模态框等复杂场景

遇到iframe时必须先切换到对应的上下文,使用driver.switch_to.frame,完成交互后再切换回主文档,确保脚本可控。

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 webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://example.com/complex")

# 处理iframe中的元素
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
wait = WebDriverWait(driver, 10)
btn = wait.until(EC.element_to_be_clickable((By.ID, "start")))

btn.click()
driver.switch_to.default_content()
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 webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://your-test-app.local/login")

# 输入用户名、密码并提交
driver.find_element(By.NAME, "username").send_keys("testuser")
driver.find_element(By.NAME, "password").send_keys("password123")
driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()

# 简单断言:等待页面标题包含“Dashboard”
wait = WebDriverWait(driver, 10)
wait.until(EC.title_contains("Dashboard"))
assert "Dashboard" in driver.title

driver.quit()

测试框架与最佳实践:从手动脚本到可维护的测试用例

测试框架选择:pytest

测试框架能够把零散脚本转化为可重复执行的用例集合,pytest是Python测试领域的主流选择,它具备简洁的语法、强大的插件生态以及良好的社区支持。

通过安装pytest即可开始编写测试用例,让测试结果更易读、易于集成,并且支持参数化、fixture等特性提升组织性。

# 安装pytest
pip install pytest

# 简单的pytest示例
# test_login.py
def test_homepage_title(driver):  # 依赖一个driver的fixture
    driver.get("https://example.com")
    assert "Example Domain" in driver.title

组织测试用例、参数化、CI

将用例按功能模块划分、通过参数化实现多场景覆盖,以减少重复代码并提高执行效率。

将测试集接入持续集成系统(CI)后,每次代码变动都可以自动运行测试,从而提升交付信心与质量保障。

# pytest 参数化示例
import pytest
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By

@pytest.fixture
def driver():
    d = webdriver.Chrome(ChromeDriverManager().install())
    yield d
    d.quit()

@pytest.mark.parametrize("username,password", [
    ("user1", "wrong1"),
    ("user2", "wrong2"),
])
def test_invalid_logins(driver, username, password):
    driver.get("https://example.com/login")
    driver.find_element(By.NAME, "username").send_keys(username)
    driver.find_element(By.NAME, "password").send_keys(password)
    driver.find_element(By.CSS_SELECTOR, "button[type='submit']").click()
    # 未登录提示
    assert "Invalid" in driver.page_source
广告

后端开发标签