文章目录
最近在给公司做电商系统升级时,我深刻体会到自动化测试的重要性!每次手动点点点测试购物车功能,不仅效率低到想哭(关键手真的会抽筋啊喂),还容易漏测关键路径。今天咱们就来聊聊如何用Selenium这个神器,让测试效率原地起飞!
🚀 环境搭建的三大坑(血泪教训!)
刚开始用Selenium的朋友,90%都会栽在环境配置上!别问我怎么知道的(说多了都是泪)…
1. 安装库的正确姿势
# Python用户看这里
pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple
# Java选手别慌
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.10.0</version>
</dependency>
注意版本号要写死!我上次用latest
差点搞崩整个项目(版本冲突太可怕了)!
2. 浏览器驱动的玄学问题
下载ChromeDriver时一定要看准版本号!这里教大家个绝招:
- 浏览器地址栏输入
chrome://version/
- 记下显示的版本号前三位(比如115.0.5790.110)
- 到ChromeDriver官网找对应版本
(超级重要)驱动文件记得放在这三处之一:
- 系统PATH包含的目录
- Python的Scripts目录
- 项目根目录下新建drivers文件夹
3. 验证安装是否成功
来段5行代码快速验证:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.title) # 应该输出"百度一下"
如果报WebDriverException
,八成是驱动路径没配对!
🔥 实战:电商登录测试全流程
咱们以某电商平台登录功能为例,手把手写测试脚本。准备好瓜子饮料,发车啦!
元素定位的十八般武艺
# 传统ID定位(最稳!)
username = driver.find_element(By.ID, "username")
# XPath定位大法(复杂结构救星)
search_box = driver.find_element(By.XPATH, '//input[@class="search-input"]')
# CSS选择器新玩法
add_cart_btn = driver.find_element(By.CSS_SELECTOR, ".product-list > li:first-child button")
实测发现:优先用ID > CSS > XPath。上次用XPath定位动态元素,差点被绕晕在/div[3]/div[2]/span
这种路径里…
登录测试完整案例
def test_login():
driver = webdriver.Chrome()
try:
driver.get("https://mall.example.com/login")
# 显式等待策略(比隐式等待靠谱多了!)
wait = WebDriverWait(driver, 10)
username = wait.until(EC.presence_of_element_located((By.ID, "username")))
username.send_keys("test_user")
driver.find_element(By.ID, "password").send_keys("P@ssw0rd!")
driver.find_element(By.CLASS_NAME, "login-btn").click()
# 验证登录成功
welcome_text = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[contains(text(),'欢迎回来')]")))
assert "test_user" in welcome_text.text
finally:
driver.quit()
遇到过最坑的情况:登录弹窗突然变成新窗口,差点没定位到元素!后来加了窗口切换代码才解决。
💡 高级技巧:让脚本更健壮
1. 智能等待策略
三种等待方式对比:
类型 | 优点 | 缺点 |
---|---|---|
强制等待 | 简单粗暴 | 影响执行效率 |
隐式等待 | 全局设置 | 不灵活,容易意外等待 |
显式等待 | 精准控制 | 代码稍复杂 |
推荐组合拳:
driver.implicitly_wait(5) # 兜底等待
wait = WebDriverWait(driver, 10, poll_frequency=0.5)
2. 异常处理黑科技
from selenium.common.exceptions import NoSuchElementException
def safe_click(element):
try:
element.click()
except ElementClickInterceptedException:
driver.execute_script("arguments[0].scrollIntoView();", element)
element.click()
上次遇到浮动广告遮挡按钮,就是这个方法救了我!
3. Page Object模式(PO模式)
把页面元素和操作封装成类:
class LoginPage:
def __init__(self, driver):
self.driver = driver
self.username = (By.ID, "username")
self.password = (By.ID, "password")
def login(self, user, pwd):
self.driver.find_element(*self.username).send_keys(user)
self.driver.find_element(*self.password).send_keys(pwd)
self.driver.find_element(By.CLASS_NAME, "login-btn").click()
用PO模式后,维护脚本效率提升了300%!再也不用满世界找元素定位了。
🚨 常见问题急救包
Q1:元素明明存在却找不到?
- 检查iframe嵌套
- 确认元素在当前视窗(用
scrollIntoView()
) - 查看是否有Shadow DOM(需要用JavaScript穿透)
Q2:如何处理随机弹窗?
try:
alert = driver.switch_to.alert
alert.dismiss()
except NoAlertPresentException:
pass
Q3:下拉框选择技巧
from selenium.webdriver.support.select import Select
select = Select(driver.find_element(By.ID, "city"))
select.select_by_visible_text("北京")
select.select_by_value("bj")
🌟 升级路线图
- 整合Pytest做测试管理
- 使用Allure生成炫酷报告
- 搭建Selenium Grid分布式测试
- 结合Appium做移动端测试
- 接入CI/CD流水线
最近在尝试用Selenium录制操作生成测试脚本,发现有些工具生成的代码冗余太多,还是手写的更灵活。不过对新手来说,录制功能确实是个不错的入门方式。
最后说两句
自动化测试不是银弹!千万别为了自动化而自动化——我见过最离谱的案例,有人用Selenium测计算器功能(直接调接口不香吗?)。建议从核心业务流程开始,逐步扩大覆盖范围。
记住:好的测试脚本应该像乐高积木,可以灵活组合复用。刚开始可能觉得写脚本费时间,但当你第10次执行回归测试时,就会感谢当初的自己!