<h3align="center"><imgsrc="https://seleniumbase.github.io/cdn/img/python_logo.png"title="SeleniumBase"width="29"/> For Python enthusiasts and enterprise developers <imgsrc="https://seleniumbase.github.io/cdn/img/python_logo.png"title="SeleniumBase"width="29"/></h3>
<palign="left"><b>Example:</b><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_demo_site.py"target="_blank">test_demo_site.py</a> from <ahref="https://github.com/seleniumbase/SeleniumBase/tree/master/examples"target="_blank">./examples/</a> (Uses <codetranslate="no">--chrome</code> by default)</p>
<palign="left"><b>Example:</b><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py"target="_blank">test_coffee_cart.py</a> from <ahref="https://github.com/seleniumbase/SeleniumBase/tree/master/examples"target="_blank">./examples/</a></p>
> SeleniumBase automation can easily order coffee!
<palign="left"><b>Here's the code for <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_coffee_cart.py">test_coffee_cart.py</a>:</b></p>
<p>💡 SeleniumBase is a Python framework for browser automation and testing. SeleniumBase uses <ahref="https://www.w3.org/TR/webdriver2/#endpoints"target="_blank">Selenium/WebDriver</a> APIs and incorporates test-runners such as <codetranslate="no">pytest</code>, <codetranslate="no">pynose</code>, and <codetranslate="no">behave</code> to provide organized structure, test discovery, test execution, test state (<i>eg. passed, failed, or skipped</i>), and command-line options for changing default settings (<i>eg. browser selection</i>). With raw Selenium, you would need to set up your own options-parser for configuring tests from the command-line.</p>
<p>💡 SeleniumBase's driver manager gives you more control over automatic driver downloads. (Use <codetranslate="no">--driver-version=VER</code> with your <codetranslate="no">pytest</code> run command to specify the version.) By default, SeleniumBase will download a driver version that matches your major browser version if not set.</p>
<p>💡 SeleniumBase automatically detects between CSS Selectors and XPath, which means you don't need to specify the type of selector in your commands (<i>but optionally you could</i>).</p>
<p>💡 SeleniumBase methods often perform multiple actions in a single method call. For example, <codetranslate="no">self.type(selector, text)</code> does the following:<br/>1. Waits for the element to be visible.<br/>2. Waits for the element to be interactive.<br/>3. Clears the text field.<br/>4. Types in the new text.<br/>5. Presses Enter/Submit if the text ends in <codetranslate="no">"\n"</code>.<br/>With raw Selenium, those actions require multiple method calls.</p>
<p>💡 SeleniumBase gives you the option to generate a dashboard and reports for tests. It also saves screenshots from failing tests to the <codetranslate="no">./latest_logs/</code> folder. Raw <ahref="https://www.selenium.dev/documentation/webdriver/"translate="no"target="_blank">Selenium</a> does not have these options out-of-the-box.</p>
<p>💡 SeleniumBase includes desktop GUI apps for running tests, such as <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/commander.md"translate="no">SeleniumBase Commander</a> for <codetranslate="no">pytest</code> and <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md"translate="no">SeleniumBase Behave GUI</a> for <codetranslate="no">behave</code>.</p>
<p>💡 SeleniumBase has its own <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/recorder_mode.md">Recorder / Test Generator</a> for creating tests from manual browser actions.</p>
<p>💡 SeleniumBase comes with <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/case_plans.md">test case management software, ("CasePlans")</a>, for organizing tests and step descriptions.</p>
<p>💡 SeleniumBase includes tools for <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/chart_maker/ReadMe.md">building data apps, ("ChartMaker")</a>, which can generate JavaScript from Python.</p>
<palign="left">📘📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_simple_login.py">example test</a> using <codetranslate="no"><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/fixtures/base_case.py">BaseCase</a></code> class inheritance. Runs with <b><ahref="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b> or <b><ahref="https://github.com/mdmintz/pynose">pynose</a></b>. (<ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/ReadMe.md">Learn more</a>). (Use <codetranslate="no">self.driver</code> to access Selenium's raw <codetranslate="no">driver</code>.)</p>
<palign="left">📗📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/sb_fixture_tests.py">example test</a> using the <b><codetranslate="no">sb</code></b><codetranslate="no">pytest</code> fixture. Runs with <b><ahref="https://docs.pytest.org/en/latest/how-to/usage.html">pytest</a></b>. (Use <codetranslate="no">sb.driver</code> to access Selenium's raw <codetranslate="no">driver</code>.)</p>
<palign="left">📙📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_sb.py">example test</a> using the <b><codetranslate="no">SB</code></b> Context Manager. Runs with pure <b><codetranslate="no">python</code></b>. (Use <codetranslate="no">sb.driver</code> to access Selenium's raw <codetranslate="no">driver</code>.)</p>
<palign="left">📔📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_context.py">example test</a> using the <b><codetranslate="no">DriverContext</code></b> Manager. Runs with pure <b><codetranslate="no">python</code></b>. (The <codetranslate="no">driver</code> is an improved version of Selenium's raw <codetranslate="no">driver</code>, with more methods.)</p>
<palign="left">📔📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/raw_login_driver.py">example test</a> using the <b><codetranslate="no">Driver</code></b> Manager. Runs with pure <b><codetranslate="no">python</code></b>. (The <code>driver</code> is an improved version of Selenium's raw <codetranslate="no">driver</code>, with more methods.)</p>
```python
from seleniumbase import Driver
driver = Driver()
try:
driver.open("seleniumbase.io/simple/login")
driver.type("#username", "demo_user")
driver.type("#password", "secret_pass")
driver.click('a:contains("Sign in")')
driver.assert_exact_text("Welcome!", "h1")
driver.assert_element("img#image1")
driver.highlight("#image1")
driver.click_link("Sign out")
driver.assert_text("signed out", "#top_message")
finally:
driver.quit()
```
<palign="left">📕📝 An <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/features/login_app.feature"> example test</a> using <btranslate="no">behave-BDD</b><ahref="https://behave.readthedocs.io/en/stable/gherkin.html#features"target="_blank">Gherkin</a> syntax. Runs with <b><codetranslate="no">behave</code></b>. (<ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">Learn more</a>)</p>
🔵 Using a <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/virtualenv_instructions.md">Python virtual env</a> is recommended.
<palign="left"><b>Here's the code for <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/my_first_test.py">my_first_test.py</a>:</b></p>
🔵 For the complete list of SeleniumBase methods, see: <b><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/method_summary.md">Method Summary</a></b>
<p>✅ SeleniumBase automatically handles common <ahref="https://www.selenium.dev/documentation/webdriver/"target="_blank">WebDriver</a> actions such as launching web browsers before tests, saving screenshots during failures, and closing web browsers after tests.</p>
<p>✅ SeleniumBase lets you <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md">customize test runs from the command-line</a>.</p>
Most SeleniumBase scripts can be run with <codetranslate="no">pytest</code>, <codetranslate="no">pynose</code>, or pure <codetranslate="no">python</code>. Not all test runners can run all test formats. For example, tests that use the ``sb`` pytest fixture can only be run with ``pytest``. (See <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/syntax_formats.md">Syntax Formats</a>) There's also a <ahref="https://behave.readthedocs.io/en/stable/gherkin.html#features"target="_blank">Gherkin</a> test format that runs with <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/behave_bdd/ReadMe.md">behave</a>.
<p>✅ <codetranslate="no">pytest</code> includes automatic test discovery. If you don't specify a specific file or folder to run, <codetranslate="no">pytest</code> will automatically search through all subdirectories for tests to run based on the following criteria:</p>
With a SeleniumBase [pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/pytest.ini) file present, you can modify default discovery settings. The Python class name can be anything because ``seleniumbase.BaseCase`` inherits ``unittest.TestCase`` to trigger autodiscovery.
<p>✅ No More Flaky Tests! SeleniumBase methods automatically wait for page elements to finish loading before interacting with them (<i>up to a timeout limit</i>). This means <b>you no longer need random <span><codetranslate="no">time.sleep()</code></span> statements</b> in your scripts.</p>
<p>✅ SeleniumBase includes an automated/manual hybrid solution called <b><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/master_qa/ReadMe.md">MasterQA</a></b> to speed up manual testing with automation while manual testers handle validation.</p>
<p>✅ SeleniumBase supports <ahref="https://github.com/seleniumbase/SeleniumBase/tree/master/examples/offline_examples">running tests while offline</a> (<i>assuming webdrivers have previously been downloaded when online</i>).</p>
<p>✅ For a full list of SeleniumBase features, <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/features_list.md">Click Here</a>.</p>
🔵 <b>Demo Mode</b> helps you see what a test is doing. If a test is moving too fast for your eyes, run it in <b>Demo Mode</b> to pause the browser briefly between actions, highlight page elements being acted on, and display assertions:
🔵 To pause an active test that throws an exception or error, (*and keep the browser window open while **Debug Mode** begins in the console*), add **``--pdb``** as a ``pytest`` option:
<ahref="https://github.com/mdmintz/pdbp"><imgsrc="https://seleniumbase.github.io/cdn/gif/coffee_pdbp.gif"alt="SeleniumBase test with the pdbp (Pdb+) debugger"title="SeleniumBase test with the pdbp (Pdb+) debugger"/></a>
(See the full list of command-line option definitions **[here](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/plugins/pytest_plugin.py)**. For detailed examples of command-line options, see **[customizing_test_runs.md](https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/customizing_test_runs.md)**)
🔵 During test failures, logs and screenshots from the most recent test run will get saved to the ``latest_logs/`` folder. Those logs will get moved to ``archived_logs/`` if you add --archive_logs to command-line options, or have ``ARCHIVE_EXISTING_LOGS`` set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), otherwise log files with be cleaned up at the start of the next test run. The ``test_suite.py`` collection contains tests that fail on purpose so that you can see how logging works.
An easy way to override seleniumbase/config/settings.py is by using a custom settings file.
Here's the command-line option to add to tests: (See [examples/custom_settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/custom_settings.py))
🔵 When running tests with **``pytest``**, you'll want a copy of **[pytest.ini](https://github.com/seleniumbase/SeleniumBase/blob/master/pytest.ini)** in your root folders. When running tests with **``pynose``**, you'll want a copy of **[setup.cfg](https://github.com/seleniumbase/SeleniumBase/blob/master/setup.cfg)** in your root folders. These files specify default configuration details for tests. Test folders should also include a blank **[__init__.py](https://github.com/seleniumbase/SeleniumBase/blob/master/examples/offline_examples/__init__.py)** file to allow your test files to import other files from that folder.
<b>ProTip™:</b> You can also create a boilerplate folder without any sample tests in it by adding ``-b`` or ``--basic`` to the ``sbase mkdir`` command:
Of those files, the ``pytest.ini`` config file is the most important, followed by a blank ``__init__.py`` file. There's also a ``setup.cfg`` file (for pynose). Finally, the ``requirements.txt`` file can be used to help you install seleniumbase into your environments (if it's not already installed).
🔵 You'll notice that a logs folder, "latest_logs", was created to hold information about the failing test, and screenshots. During test runs, past results get moved to the archived_logs folder if you have ARCHIVE_EXISTING_LOGS set to True in [settings.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py), or if your run tests with ``--archive-logs``. If you choose not to archive existing logs, they will be deleted and replaced by the logs of the latest test run.
🔵 The ``--dashboard`` option for pytest generates a SeleniumBase Dashboard located at ``dashboard.html``, which updates automatically as tests run and produce results. Example:
🔵 Additionally, you can host your own SeleniumBase Dashboard Server on a port of your choice. Here's an example of that using Python's ``http.server``:
🔵 Now you can navigate to ``http://localhost:1948/dashboard.html`` in order to view the dashboard as a web app. This requires two different terminal windows: one for running the server, and another for running the tests, which should be run from the same directory. (Use <kbd>Ctrl+C</kbd> to stop the http server.)
✅ When combining pytest html reports with SeleniumBase Dashboard usage, the pie chart from the Dashboard will get added to the html report. Additionally, if you set the html report URL to be the same as the Dashboard URL when also using the dashboard, (example: ``--dashboard --html=dashboard.html``), then the Dashboard will become an advanced html report when all the tests complete.
If viewing pytest html reports in [Jenkins](https://www.jenkins.io/), you may need to [configure Jenkins settings](https://stackoverflow.com/a/46197356) for the html to render correctly. This is due to [Jenkins CSP changes](https://www.jenkins.io/doc/book/system-administration/security/configuring-content-security-policy/).
(NOTE: You can add ``--show-report`` to immediately display pynose reports after the test suite completes. Only use ``--show-report`` when running tests locally because it pauses the test run.)
(The [behave_bdd/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples/behave_bdd) folder can be found in the [examples/](https://github.com/seleniumbase/SeleniumBase/tree/master/examples) folder.)
You can also use ``--junit`` to get ``.xml`` reports for each <codetranslate="no">behave</code> feature. Jenkins can use these files to display better reporting for your tests.
If you wish to use a proxy server for your browser tests (Chromium or Firefox), you can add ``--proxy=IP_ADDRESS:PORT`` as an argument on the command line.
To make things easier, you can add your frequently-used proxies to PROXY_LIST in [proxy_list.py](https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/proxy_list.py), and then use ``--proxy=KEY_FROM_PROXY_LIST`` to use the IP_ADDRESS:PORT of that key.
🔵 If you wish to change the User-Agent for your browser tests (Chromium and Firefox only), you can add ``--agent="USER AGENT STRING"`` as an argument on the command-line.
🔵 <codetranslate="no">self.accept_alert()</code> automatically waits for and accepts alert pop-ups. <codetranslate="no">self.dismiss_alert()</code> automatically waits for and dismisses alert pop-ups. On occasion, some methods like <codetranslate="no">self.click(SELECTOR)</code> might dismiss a pop-up on its own because they call JavaScript to make sure that the <codetranslate="no">readyState</code> of the page is <codetranslate="no">complete</code> before advancing. If you're trying to accept a pop-up that got dismissed this way, use this workaround: Call <codetranslate="no">self.find_element(SELECTOR).click()</code> instead, (which will let the pop-up remain on the screen), and then use <codetranslate="no">self.accept_alert()</code> to accept the pop-up (<ahref="https://github.com/seleniumbase/SeleniumBase/issues/600#issuecomment-647270426">more on that here</a>). If pop-ups are intermittent, wrap code in a try/except block.
🔵 Learn about <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/tour_examples/ReadMe.md">SeleniumBase Interactive Walkthroughs</a> (in the ``examples/tour_examples/`` folder). It's great for prototyping a website onboarding experience.
<li>You can set up a <ahref="https://jenkins.io/"target="_blank">Jenkins</a> build server for running tests at regular intervals. For a real-world Jenkins example of headless browser automation in action, check out the <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/azure/jenkins/ReadMe.md">SeleniumBase Jenkins example on Azure</a> or the <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/integrations/google_cloud/ReadMe.md">SeleniumBase Jenkins example on Google Cloud</a>.</li>
<li>You can use <ahref="https://selenium.dev/documentation/en/grid/"target="_blank">the Selenium Grid</a> to scale your testing by distributing tests on several machines with parallel execution. To do this, check out the <ahref="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/utilities/selenium_grid">SeleniumBase selenium_grid folder</a>, which should have everything you need, including the <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/utilities/selenium_grid/ReadMe.md">Selenium Grid ReadMe</a> to help you get started.</li>
<li>If you're using the <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/help_docs/mysql_installation.md">SeleniumBase MySQL feature</a> to save results from tests running on a server machine, you can install <ahref="https://dev.mysql.com/downloads/tools/workbench/">MySQL Workbench</a> to help you read & write from your DB more easily.</li>
<li>If you're using AWS, you can set up an <ahref="https://aws.amazon.com/s3/"target="_blank">Amazon S3</a> account for saving log files and screenshots from your tests. To activate this feature, modify <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/seleniumbase/config/settings.py">settings.py</a> with connection details in the S3 section, and add <codetranslate="no">--with-s3-logging</code> on the command-line when running your tests.</li>
<b>ProTip™:</b> You can use the <codetranslate="no">self.get_page_source()</code> method with Python's <codetranslate="no">find()</code> command to parse through HTML to find something specific. (For more advanced parsing, see the <ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/examples/test_parse_soup.py">BeautifulSoup example</a>.)
**ProTip™:** In most web browsers, you can right-click on a page and select ``Inspect Element`` to see the CSS selector details that you'll need to create your own scripts.
<codetranslate="no">self.type(selector, text)</code> # updates the text from the specified element with the specified value. An exception is raised if the element is missing or if the text field is not editable. Example:
You can also use <codetranslate="no">self.add_text()</code> or the <ahref="https://www.selenium.dev/documentation/webdriver/"target="_blank">WebDriver</a><codetranslate="no">.send_keys()</code> command, but those won't clear the text box first if there's already text inside.
(NOTE: The short versions of that are ``self.find_element(ELEMENT)`` and ``self.assert_element(ELEMENT)``. The ``find_element()`` version returns the element.)
**ProTip™:** You can use dots to signify class names (Ex: ``div.class_name``) as a simplified version of ``div[class="class_name"]`` within a CSS selector.
You can also use ``*=`` to search for any partial value in a CSS selector as shown below:
(NOTE: ``self.find_text(TEXT, ELEMENT)`` and ``self.wait_for_text(TEXT, ELEMENT)`` also do this. For backwards compatibility, older method names were kept, but the default timeout may be different.)
<p>If your test opens up a new tab/window, you can switch to it. (SeleniumBase automatically switches to new tabs that don't open to <codetranslate="no">about:blank</code> URLs.)</p>
To exit from multiple iframes, use ``self.switch_to_default_content()``. (If inside a single iframe, this has the same effect as ``self.switch_to_parent_frame()``.)
```python
self.switch_to_frame('iframe[name="frame1"]')
self.switch_to_frame('iframe[name="frame2"]')
# ... Now perform actions inside the inner iframe
self.switch_to_default_content() # Back to the main page
❗ Some websites have a restrictive [Content Security Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP) to prevent users from loading jQuery and other external libraries onto their websites. If you need to use jQuery or another JS library on those websites, add ``--disable-csp`` as a ``pytest`` command-line option to load a Chromium extension that bypasses the CSP.
(Due to popular demand, this traffic generation example has been included in SeleniumBase with the <codetranslate="no">self.generate_referral(start_page, end_page)</code> and the <codetranslate="no">self.generate_traffic(start_page, end_page, loops)</code> methods.)
<p>Let's say you want to verify multiple different elements on a web page in a single test, but you don't want the test to fail until you verified several elements at once so that you don't have to rerun the test to find more missing elements on the same page. That's where deferred asserts come in. Here's the example:</p>
<codetranslate="no">deferred_assert_element()</code> and <codetranslate="no">deferred_assert_text()</code> will save any exceptions that would be raised.
To flush out all the failed deferred asserts into a single exception, make sure to call <codetranslate="no">self.process_deferred_asserts()</code> at the end of your test method. If your test hits multiple pages, you can call <codetranslate="no">self.process_deferred_asserts()</code> before navigating to a new page so that the screenshot from your log files matches the URL where the deferred asserts were made.
<p>If you need access to any commands that come with standard <ahref="https://www.selenium.dev/documentation/webdriver/"target="_blank">WebDriver</a>, you can call them directly like this:</p>
<p>You can use <codetranslate="no">pytest --reruns=NUM</code> to retry failing tests that many times. Add <codetranslate="no">--reruns-delay=SECONDS</code> to wait that many seconds between retries. Example:</p>
<p>You can use the <codetranslate="no">@retry_on_exception()</code> decorator to retry failing methods. (First import: <codetranslate="no">from seleniumbase import decorators</code>). To learn more about SeleniumBase decorators, <ahref="https://github.com/seleniumbase/SeleniumBase/tree/master/seleniumbase/common">click here</a>.</p>
> "Catch bugs in QA before deploying code to Production!"
<palign="left"><ahref="https://seleniumbase.io/error_page"target="_blank"><imgsrc="https://seleniumbase.github.io/cdn/gif/error_page.gif"alt="Catch bugs in QA before deploying code to Production!"title="Catch bugs in QA before deploying code to Production!"/></a></p>
<span><ahref="https://www.youtube.com/playlist?list=PLp9uKicxkBc5UIlGi2BuE3aWC7JyXpD3m"><imgsrc="https://seleniumbase.github.io/cdn/img/youtube.png"title="SeleniumBase Playlist on YouTube"alt="SeleniumBase Playlist on YouTube"width="68"/></a></span>
<span><ahref="https://github.com/seleniumbase/SeleniumBase"><imgsrc="https://seleniumbase.github.io/img/social/share_github.svg"title="SeleniumBase on GitHub"alt="SeleniumBase on GitHub"width="62"/></a></span>
<span><ahref="https://www.facebook.com/SeleniumBase"><imgsrc="https://seleniumbase.io/img/social/share_facebook.svg"title="SeleniumBase on Facebook"alt="SeleniumBase on Facebook"width="64"/></a></span>
<span><ahref="https://gitter.im/seleniumbase/SeleniumBase"target="_blank"><imgsrc="https://seleniumbase.github.io/img/social/share_gitter.svg"title="SeleniumBase on Gitter"alt="SeleniumBase on Gitter"width="50"/></a></span>
<div><ahref="https://github.com/seleniumbase/SeleniumBase/"><imgsrc="https://seleniumbase.github.io/cdn/img/fancy_logo_14.png"title="SeleniumBase"width="240"/></a></div><div><ahref="https://seleniumbase.io"><imgsrc="https://img.shields.io/badge/docs-seleniumbase.io-11BBAA.svg"alt="SeleniumBase Docs"/></a></div><div><ahref="https://github.com/seleniumbase/SeleniumBase"><imgsrc="https://img.shields.io/badge/tested%20with-SeleniumBase-04C38E.svg"alt="Tested with SeleniumBase"/></a></div><div><ahref="https://github.com/seleniumbase/SeleniumBase/blob/master/LICENSE"><imgsrc="https://img.shields.io/badge/license-MIT-22BBCC.svg"title="SeleniumBase"/></a><ahref="https://gitter.im/seleniumbase/SeleniumBase"target="_blank"><imgsrc="https://img.shields.io/gitter/room/seleniumbase/SeleniumBase.svg"alt="Gitter chat"/></a></div>