Of course! Here is a comprehensive guide to the Splinter API in Python.

Splinter is a fantastic, user-friendly Python library for testing web applications by automating browser actions. It acts as a "wrapper" around real web browsers (like Chrome, Firefox) or headless browsers (like Headless Chrome), providing a simple, consistent API to control them.
This guide will cover:
- Core Concepts: What Splinter is and how it works.
- Installation: How to get started.
- The
BrowserObject: The heart of Splinter. - Essential API Methods: A detailed breakdown of the most commonly used methods, categorized by action.
- Advanced Features: Handling waits, iframes, and screenshots.
- Complete Example: A full script demonstrating common tasks.
- Best Practices & Troubleshooting.
Core Concepts
-
Driver: Splinter doesn't have its own rendering engine. It uses a "driver" to control a real browser. You choose a driver when you initialize the browser object. Common drivers include:
chrome: For Google Chrome (requireschromedriver).firefox: For Mozilla Firefox (requiresgeckodriver).edge: For Microsoft Edge (requiresmsedgedriver).zope.testbrowser: A non-JS-capable driver, great for testing the backend logic of a page.remote: For controlling a browser instance running on a different machine (e.g., in a Selenium Grid).
-
Browser Object: This is the main object you interact with. It's your entry point to the browser. You create it by specifying a driver:
browser = Browser('chrome').
(图片来源网络,侵删)
Installation
First, install the Splinter library:
pip install splinter
Then, you need to install the browser driver. This is a crucial step.
For Chrome:
- Download
chromedriverfrom the Chrome for Testing availability dashboard. Make sure the version matches your Chrome browser version. - Place the
chromedriverexecutable in a directory that is in your system'sPATH, or provide the path to it when creating the browser object.
For Firefox:

- Download
geckodriverfrom the Mozilla Geckodriver releases page. - Similarly, add it to your
PATHor specify its location.
The Browser Object
All interactions start by creating a Browser instance.
from splinter import Browser
# Using Chrome driver (assuming chromedriver is in your PATH)
browser = Browser('chrome')
# Using Firefox driver (assuming geckodriver is in your PATH)
# browser = Browser('firefox')
# If your driver is NOT in your PATH, specify its location
# browser = Browser('chrome', executable_path='/path/to/your/chromedriver')
Essential API Methods
Here is a breakdown of the most important methods, organized by what you want to do.
A. Navigation & Control
| Method | Description | Example |
|---|---|---|
visit(url) |
Navigates the browser to a specific URL. | browser.visit("https://google.com") |
back() |
Navigates to the previous page in the history. | browser.back() |
forward() |
Navigates to the next page in the history. | browser.forward() |
reload() |
Reloads the current page. | browser.reload() |
quit() |
Closes the browser and terminates the driver. Always do this! | browser.quit() |
is_text_present(text) |
Checks if the given text is present anywhere on the page. Returns True or False. |
if browser.is_text_present("Welcome!"): ... |
B. Finding Elements (The "Selector")
Before you can interact with an element (like a button or a text input), you need to find it. Splinter provides a unified way to do this.
| Method | Description | Example |
|---|---|---|
find_by_css(css_selector) |
Finds elements by a CSS selector. Returns a list of ElementAPI objects. |
buttons = browser.find_by_css('.my-button-class') |
find_by_xpath(xpath_expression) |
Finds elements by an XPath expression. | link = browser.find_by_xpath('//a[text()="Click Here"]') |
find_by_tag(tag_name) |
Finds elements by their HTML tag name. | paragraphs = browser.find_by_tag('p') |
find_by_name(name) |
Finds elements by their name attribute. |
input_field = browser.find_by_name('username') |
find_by_id(id_value) |
Finds an element by its id attribute. |
submit_button = browser.find_by_id('submit-btn') |
find_by_value(value) |
Finds elements by their value attribute. |
option = browser.find_by_value('option-1') |
find_by_text(text) |
Finds elements that contain the exact text. | link = browser.find_by_text('Sign In') |
Note: All find_by_* methods have a singular counterpart, e.g., find_by_id(), which will raise an exception if exactly one element isn't found.
C. Interacting with Elements
Once you have an element (or a list of elements), you can interact with it.
| Method | Description | Example |
|---|---|---|
.fill(text) |
Fills a text input or textarea field. | browser.find_by_name('q').fill('Splinter Python') |
.choose() |
Selects a radio button or a checkbox. | browser.find_by_value('yes').choose() |
.select(option_value) |
Selects an option in a <select> dropdown. |
browser.find_by_name('country').select('US') |
.click() |
Simulates a mouse click on the element. | browser.find_by_id('submit-btn').click() |
.mouseover() |
Simulates moving the mouse over the element. | browser.find_by_css('.menu-item').mouseover() |
.mouse_out() |
Simulates moving the mouse away from the element. | browser.find_by_css('.submenu').mouse_out() |
D. Getting Element Information
You can inspect the properties of an element without interacting with it.
| Attribute/Method | Description | Example |
|---|---|---|
.value |
Gets the value attribute of an element (e.g., of an input). |
val = browser.find_by_name('email').value |
.text |
Gets the visible inner text of an element. | link_text = browser.find_by_css('a').text |
.html |
Gets the inner HTML of an element. | div_html = browser.find_by_id('content').html |
.['attribute_name'] |
Gets the value of any HTML attribute. | id_val = browser.find_by_css('img')['id'] |
.visible |
Checks if the element is currently visible on the page. | is_visible = browser.find_by_id('hidden-div').visible |
Advanced Features
Waiting for Dynamic Content
Modern websites often load content dynamically with JavaScript. Splinter has built-in support for waiting.
-
is_text_present(text, wait_time=5): This is the simplest. It will wait up towait_timeseconds for the text to appear before giving up. -
wait_for_element(condition, wait_time=5): A more powerful way to wait for any condition to be true.# Wait up to 10 seconds for an element with id 'results' to be visible browser.wait_for_element(lambda browser: browser.find_by_id('results').visible, wait_time=10)
Handling Iframes
An <iframe> is an embedded HTML document. To interact with elements inside an iframe, you must first "switch" your browser's context to it.
# 1. Visit a page with an iframe
browser.visit("https://example.com/page-with-iframe")
# 2. Find the iframe element
iframe = browser.find_by_tag('iframe')[0]
# 3. Switch to the iframe
browser.switch_to.frame(iframe)
# 4. Now you can interact with elements INSIDE the iframe
browser.fill('input-in-iframe', 'some data')
# 5. IMPORTANT: Switch back to the main page when you're done
browser.switch_to.default_content()
Taking Screenshots
Useful for debugging visual issues or capturing the state of the browser.
browser.visit("https://google.com")
browser.save_screenshot('google_homepage.png')
Complete Example: Automating a Login Form
Let's put it all together. Imagine you want to log into a hypothetical website.
from splinter import Browser
def test_login():
"""
Automates the login process for a test website.
"""
# 1. Initialize the browser
# Using 'headless' mode so the browser window doesn't pop up
# This requires Chrome 59+ and a recent chromedriver
browser = Browser('chrome', headless=True)
try:
# 2. Navigate to the login page
print("Navigating to login page...")
browser.visit("https://the-internet.herokuapp.com/login")
# 3. Find elements
username_field = browser.find_by_id("username")
password_field = browser.find_by_id("password")
login_button = browser.find_by_css("button[type='submit']")
# 4. Interact with the form
print("Filling out the form...")
username_field.fill("tomsmith")
password_field.fill("SuperSecretPassword!")
# 5. Submit the form
print("Clicking the login button...")
login_button.click()
# 6. Wait for and verify the result
# Wait for the success message to appear
browser.is_text_present("You logged into a secure area!", wait_time=5)
# Check if the logout button is visible
logout_button = browser.find_by_css('button[class="button secondary radius"]')
assert logout_button.visible, "Logout button is not visible after login!"
print("Login successful! Logout button is visible.")
finally:
# 7. Always close the browser
print("Quting the browser.")
browser.quit()
if __name__ == "__main__":
test_login()
Best Practices & Troubleshooting
-
Always
quit(): Failing to callbrowser.quit()will leave browser processes (likechromedriver.exe) running in the background, consuming memory and CPU. Atry...finallyblock is your best friend. -
Use Waits: If your tests are flaky, it's almost always because you're not waiting for elements to load. Use
is_text_presentorwait_for_elementto make your tests robust. -
Use Specific Selectors: Prefer
idandnameattributes for finding elements, as they are less likely to change than CSS classes or tag names. If you must use CSS, be as specific as possible. -
Headless Mode: For automated scripts and CI/CD pipelines, use headless mode (
headless=True) to avoid opening a visible browser window. -
Driver Path Issues: The most common error is
WebDriverException: 'chromedriver' executable needs to be in PATH. This means your system can't find the driver. Double-check that you've downloaded it and added it to your system'sPATH, or provide theexecutable_pathargument when creating theBrowserobject.
