third_party/wpt_tools/wpt/tools/wptrunner/docs/plugins.rst
External packages can register custom browser products with wptrunner using
entry points. Products registered this way are automatically
available to both the wptrunner test harness and the ./wpt run CLI command.
A product plugin consists of three components:
get_product() function that returns a :py:class:~products.Product instancesetup.py or pyproject.tomlEntry Point Registration
Register via the ``wptrunner.products`` entry point group. Example ``setup.py``::
setup(
name='wptrunner-mybrowser',
install_requires=['wptrunner'],
entry_points={
'wptrunner.products': ['mybrowser = wptrunner_mybrowser:get_product']
}
)
Or ``pyproject.toml``::
[project.entry-points."wptrunner.products"]
mybrowser = "wptrunner_mybrowser:get_product"
Product Module Implementation
Implement a Browser class and helper functions::
from wptrunner.products import Product
from wptrunner.browsers.base import Browser
from wptrunner.executors.executorwebdriver import (
WebDriverTestharnessExecutor,
WebDriverRefTestExecutor,
)
class MyBrowser(Browser):
def start(self, **kwargs):
# Launch browser process
# ...
def stop(self, force=False):
# ...
def is_alive(self):
# ...
def executor_browser(self):
from wptrunner.executors.executorwebdriver import WebDriverBrowser
return WebDriverBrowser, {"webdriver_url": self.webdriver_url}
def check_args(**kwargs):
pass # Validate required arguments
def browser_kwargs(logger, test_type, run_info_data, config, subsuite, **kwargs):
return {"binary": kwargs.get("binary")}
def executor_kwargs(logger, test_type, test_environment, run_info_data,
subsuite, **kwargs):
return {"capabilities": {"browserName": "mybrowser"}}
def get_product():
return Product(
name="mybrowser",
browser_classes={None: MyBrowser},
check_args=check_args,
get_browser_kwargs=browser_kwargs,
get_executor_kwargs=executor_kwargs,
env_options={"host": "web-platform.test", "bind_address": True},
get_env_extras=lambda **kw: [],
get_timeout_multiplier=lambda *a, **kw: 1.0,
executor_classes={
"testharness": WebDriverTestharnessExecutor,
"reftest": WebDriverRefTestExecutor,
},
)
Multi-Browser Support
Specify different browser classes per test type::
browser_classes={
None: MyBrowser, # Default
"wdspec": MyWdSpecBrowser, # WebDriver spec tests
}
Run Info Extras
~~~~~~~~~~~~~~~
Add custom metadata to test run information::
def run_info_extras(logger, **kwargs):
return {"mybrowser_version": "1.0.0"}
# Include in Product(..., run_info_extras=run_info_extras)
Custom Command-Line Arguments
Products can register their own command-line arguments that appear when users
run ./wpt run --help. Use the add_arguments attribute to add a function
that receives an argparse.ArgumentParser and adds product-specific options::
def add_arguments(parser):
group = parser.add_argument_group("MyBrowser-specific")
group.add_argument(
"--mybrowser-profile",
help="Path to browser profile directory"
)
group.add_argument(
"--mybrowser-debug",
action="store_true",
help="Enable debug mode"
)
# Include in Product(..., add_arguments=add_arguments)
These arguments will be available in your check_args, browser_kwargs,
and other functions via **kwargs. The add_arguments function is called
for all available products during argument parser setup, so arguments are
always visible regardless of which product is selected.
See the :py:class:~products.Product dataclass documentation for complete
field descriptions. All fields are documented in the Product class docstring,
including required and optional attributes, function signatures, and usage
examples.
Product Not Found
If your product doesn't appear in ``./wpt run --help``:
* Verify entry point is registered correctly
* Reinstall: ``pip uninstall wptrunner-mybrowser && pip install -e .``
Import Errors
~~~~~~~~~~~~~
Ensure all imports are available::
from wptrunner.products import Product
from wptrunner.browsers.base import Browser
Product Name Mismatch
Entry point name must match Product name::
'mybrowser = ...' # Entry point
Product(name="mybrowser", ...) # Product
For usage with ./wpt run, see the running-tests documentation.