{"id":23024,"library":"zope-testbrowser","title":"zope.testbrowser","description":"Programmable web browser for functional black-box testing of WSGI and HTTP applications. Current version 8.0, supports Python >=3.9. Released under Zope Foundation, follows a rolling release cadence.","status":"active","version":"8.0","language":"python","source_language":"en","source_url":"https://github.com/zopefoundation/zope.testbrowser","tags":["testing","web","functional-testing","zope","browser"],"install":[{"cmd":"pip install zope.testbrowser","lang":"bash","label":"Install from PyPI"}],"dependencies":[{"reason":"Core dependency for browser interfaces","package":"zope.interface","optional":false},{"reason":"HTML/XML parsing and form handling","package":"lxml","optional":false},{"reason":"HTTP cookie handling and browser mechanics (deprecated in newer versions, still used for some features)","package":"mechanize","optional":true}],"imports":[{"note":"Main browser class for functional tests","symbol":"Browser","correct":"from zope.testbrowser import Browser"},{"note":"WSGI-specific browser used for testing WSGI apps","wrong":"from zope.testbrowser import WsgiBrowser","symbol":"browser","correct":"from zope.testbrowser.wsgi import Browser as WsgiBrowser"}],"quickstart":{"code":"import os\nfrom zope.testbrowser import Browser\n\nbrowser = Browser()\nbrowser.open('http://example.com')\nprint(browser.title)\nbrowser.getControl('search').value = 'zope'\nbrowser.getControl('Go').click()","lang":"python","description":"Create a Browser instance, open a URL, interact with forms."},"warnings":[{"fix":"Update imports: from zope.testbrowser import Browser for HTTP, from zope.testbrowser.wsgi import Browser for WSGI.","message":"In version 8.0, dropped support for Python <3.9. Also removed the old zope.testbrowser.browser module; use zope.testbrowser or zope.testbrowser.wsgi.","severity":"breaking","affected_versions":">=8.0"},{"fix":"Use browser = Browser(); browser.clear() before a new test scenario.","message":"Browser is stateful. Multiple requests share cookies and history. Clear state with browser.clear() or create a new Browser instance.","severity":"gotcha","affected_versions":"all"},{"fix":"Switch to from zope.testbrowser.wsgi import Browser for faster, more reliable tests.","message":"The mechanize backend is deprecated. Future versions may rely on requests or similar. Use WSGI browser if possible.","severity":"deprecated","affected_versions":"<9.0 (future)"}],"env_vars":null,"last_verified":"2026-04-27T00:00:00.000Z","next_check":"2026-07-26T00:00:00.000Z","problems":[{"fix":"Use: from zope.testbrowser import Browser","cause":"Wrong import path. In older versions, Browser was in zope.testbrowser.browser.","error":"AttributeError: module 'zope.testbrowser' has no attribute 'Browser'"},{"fix":"For WSGI: from zope.testbrowser.wsgi import Browser","cause":"Trying to import WSGI browser incorrectly.","error":"ImportError: cannot import name 'Browser' from 'zope.testbrowser'"},{"fix":"Avoid pickling Browser instances. Use string data from page content.","cause":"Browser uses lxml and cannot be pickled. Serialize test state separately.","error":"TypeError: can't pickle Browser objects"}],"ecosystem":"pypi","meta_description":null,"install_score":null,"install_tag":null,"quickstart_score":null,"quickstart_tag":null}