哈喽~小伙伴们,周 五 啦!六月,站在夏的中央,一半是回望,一半是向往。愿生活不再拥挤,愿笑容不必刻意!愿你想要的书籍,文末也能有幸领取🌹~
还在为 Selenium 冗长的 API 和复杂的配置头疼吗?是否常常会碰到测试脚本维护成本高,稳定性差的问题?今天给大家介绍一个开源的 Python Web 自动化测试工具库--Splinter,它会让你的 Web 自动化测试代码更简洁、更易读、更健壮。本文带你从零开始,掌握 Splinter 的核心技巧!
阅读本文你将收获:
-
Splinter简介;
-
Splinter安装;
-
Splinter的高阶技巧;
-
Splinter案例实践;
01
什么是Splinter?
Splinter 是一个开源的 Python Web 自动化测试工具库。它的核心定位是 Selenium WebDriver 的“友好封装”,它封装了 Selenium 和 Zope.testbrowser 的功能,提供统一的 API 操作主流浏览器(Chrome、Firefox、Edge 等)。
与原生 Selenium 相比,它具有:
-
语法极简:通过链式调用简化元素操作(如browser.find_by_id("search").fill("test"));
-
跨浏览器支持:一行代码切换浏览器驱动(Browser("chrome")/Browser("firefox"));
-
无头模式友好:支持无界面运行,适合 CI/CD 环境;
-
多场景适配:既能完成 Web 自动化测试,也可实现数据爬取、表单提交等任务。
Splinter采用应用层-驱动层-协议层的三层架构:
-
应用层:面向开发者的简洁API(如browser.click());
-
驱动层:适配Selenium、Zope等浏览器驱动;
-
协议层:基于WebDriver协议与浏览器通信;
这种设计让Splinter具备:
-
跨浏览器兼容性:通过Browser('firefox')或Browser('chrome', headless=True)一键切换浏览器内核;
-
多语言扩展能力:支持通过JavaScript注入扩展功能(browser.execute_script());
-
协议级调试:借助browser.driver直接调用原生Selenium API进行底层调试;
02
Splinter安装及环境配置
前提:
已安装 Python (推荐 Python 3.8+)
已安装 pip (Python 包管理工具)
步骤 1:安装驱动依赖
为了使用Splinter控制不同的浏览器,需要安装相应的WebDriver。
Chrome浏览器:
pipinstallsplinter[chrome]
Firefox浏览器:
pipinstallsplinter[firefox]
步骤2:从源代码安装
源代码安装Splinter:
克隆Splinter的GitHub仓库:
gitclonehttps://github.com/splinter-org/splinter.git
进入克隆的仓库目录:
cdsplinter
手动安装Splinter包:
pipinstall.
常见问题解决方案
-
驱动版本不兼容:通过chromedriver --version查看驱动版本,确保与浏览器主版本一致;
-
无头模式报错:添加浏览器选项Browser("chrome", options=["--headless=new", "--disable-gpu"]);
-
权限问题:Linux/macOS 下为驱动添加执行权限chmod +x chromedriver;
03
Splinter的高阶用法
1、条件等待 - 解决动态加载稳定性问题
#等待元素可点击(避免ElementClickInterceptedException)
fromselenium.webdriver.support.uiimportWebDriverWait
fromselenium.webdriver.supportimportexpected_conditionsasEC
element=browser.find_by_id('submit-btn').first
WebDriverWait(browser.driver,10).until(
EC.element_to_be_clickable(element._element)
).click()
#自定义等待条件
defelement_has_class(element,class_name):
def_predicate(driver):
returnclass_nameinelement._element.get_attribute('class')
return_predicate
WebDriverWait(browser.driver,10).until(
element_has_class(menu_item,'active')
)
2、Page Object 模式 - 提升代码可维护性
from abc import ABC, abstractmethod
from splinter import Browser
class BasePage(ABC):
def __init__(self, browser: Browser):
self.browser = browser
@abstractmethod
def is_loaded(self):
"""验证页面是否加载完成"""
pass
class LoginPage(BasePage):
USERNAME_INPUT = '#username'
PASSWORD_INPUT = '#password'
SUBMIT_BUTTON = 'button[type="submit"]'
def is_loaded(self):
return self.browser.is_element_present_by_css(self.SUBMIT_BUTTON)
def login(self, username, password):
self.browser.find_by_css(self.USERNAME_INPUT).fill(username)
self.browser.find_by_css(self.PASSWORD_INPUT).fill(password)
self.browser.find_by_css(self.SUBMIT_BUTTON).click()
return DashboardPage(self.browser) # 返回下一页对象
# 使用示例
login_page = LoginPage(browser)
dashboard = login_page.login('user', 'pass')
assert dashboard.is_loaded()