简介
SeleniumBase是一个Python框架,用于浏览器自动化和测试。它基于Selenium/WebDriver API,并整合了pytest、pynose和behave等测试运行器,提供了有序的结构、测试发现、测试执行、测试状态(如通过、失败或跳过)以及用于更改默认设置的命令行选项。
为什么选择SeleniumBase?
** 原生Selenium的痛点**
需要手动管理浏览器驱动
缺乏内置的等待机制导致Flaky Tests
复杂的页面交互代码冗长
测试报告需要额外配置
SeleniumBase的核心优势
零配置启动:自动下载浏览器驱动
智能等待:自动处理元素加载等待
增强型API:简化常见操作语法
多框架支持:兼容pytest和unittest
可视化报告:自动生成HTML/PDF报告
移动端支持:内置Appium集成
环境搭建与快速入门
安装SeleniumBase
pip install seleniumbase
第一个测试用例
from seleniumbase import BaseCase
class MyTestClass(BaseCase):
def test_basic(self):
self.open("https://www.example.com")
self.assert_title("Example Domain")
self.assert_text("Example")
self.click('a:contains("More information")')
运行测试
pytest test_demo.py --browser=chrome
核心API详解
元素定位增强
# CSS选择器增强
self.click("div#login > button.submit")
# XPath简写
self.type('//input[@name="username"]', "testuser")
# 文本定位
self.click("Submit Form") # 自动匹配按钮文本
# 链式调用
self.assert_element("h1").assert_text("Welcome!")
表单操作
# 输入文本
self.type("#email", "user@example.com")
# 文件上传
self.choose_file("#file-upload", "test_data.csv")
# 下拉选择
self.select_option_by_text("#country", "China")
# 多表单提交
self.add_text("#comments", "Special requirements")
self.check_if_unchecked("#terms")
self.hover_and_click("#tooltip", "#submit")
智能等待机制
# 显式等待元素可见
self.wait_for_element_visible("#results")
# 等待文本出现
self.wait_for_text("Order Complete", timeout=15)
# 自定义等待条件
def page_loaded(driver):
return driver.execute_script("return document.readyState") == "complete"
self.wait_for(page_loaded)
页面断言
self.assert_url("https://checkout.example.com")
self.assert_element_present('img[alt="Success"]')
self.assert_exact_text("Total: $299.00", "#total-price")
self.assert_attribute("#progress-bar", "value", "100")
高级功能实战
并行测试配置
# pytest.ini配置
[pytest]
addopts = --numprocesses=4 --dist=loadscope
跨浏览器测试
pytest test_suite.py --browser=firefox
pytest test_suite.py --browser=safari --user-agent="Mobile"
移动端测试
def test_mobile(self):
self.open("https://m.example.com")
self.swipe(100, 500, 100, 100) # 滑动操作
self.device_rotation(90) # 横屏模式
测试报告生成
pytest test_suite.py --html=report.html
最佳实践
Page Object模式优化
class LoginPage:
USERNAME = "#username"
PASSWORD = "#password"
SUBMIT = "#submit"
def __init__(self, sb):
self.sb = sb
def login(self, user, pwd):
self.sb.type(self.USERNAME, user)
self.sb.type(self.PASSWORD, pwd)
self.sb.click(self.SUBMIT)
class TestLogin(BaseCase):
def test_login(self):
login_page = LoginPage(self)
login_page.login("admin", "secure@123")
失败自动重试
pytest --reruns 2 --reruns-delay 5
性能监控
def test_performance(self):
metrics = self.get_metrics()
self.assert_less(metrics["load_time"], 2000) # 页面加载时间<2s
self.assert_less(metrics["network_requests"], 30)
常见问题解决方案
处理验证码
self.execute_script("document.getElementById('captcha').value = '1234'")
文件下载测试
self.download_file("#export-btn", "report.pdf")
self.assert_downloaded_file("report.pdf")
Shadow DOM操作
shadow_host = self.find_element("div#shadow-host")
shadow_root = self.get_shadow_root(shadow_host)
self.type(shadow_root, "input#name", "Test User")