splinter - python test framework for web applications

Overview
https://secure.travis-ci.org/cobrateam/splinter.svg?branch=master

splinter - python tool for testing web applications

splinter is an open source tool for testing web applications using Python. It lets you automate browser actions, such as visiting URLs and interacting with their items.

Sample code

from splinter import Browser

browser = Browser()
browser.visit('http://google.com')
browser.fill('q', 'splinter - python acceptance testing for web applications')
browser.find_by_name('btnK').click()

if browser.is_text_present('splinter.readthedocs.io'):
    print("Yes, the official website was found!")
else:
    print("No, it wasn't found... We need to improve our SEO techniques")

browser.quit()

Note: if you don't provide any driver argument to the Browser function, firefox will be used (Browser function documentation).

Changelog

First steps

Splinter open source project

Documentation

External links

Comments
  • Browser instance on a network with proxy

    Browser instance on a network with proxy

    Hi.

    I'm trying to run Splinter in a Windows 7 machine, in a local network that needs a proxy.

    When a new instance of the Browser() is created in the python shell, a firefox window pop-ups with the profile different than the one that I use. So, this new instance and profile don't have none of the configs for proxy.

    This is the message generated by the "browser = Browser()" code:

    Traceback (most recent call last): File "C:\Users\cassio.nandi\Desktop\splinter\exemplo.py", line 3, in browser = Browser() File "C:\Python27\lib\site-packages\splinter\browser.py", line 46, in Browser return driver(_args, *_kwargs) File "C:\Python27\lib\site-packages\splinter\driver\webdriver\firefox.py", line 23, in init self.driver = Firefox(firefox_profile) File "C:\Python27\lib\site-packages\selenium\webdriver\firefox\webdriver.py", line 47, in init desired_capabilities=DesiredCapabilities.FIREFOX) File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 61, in init self.start_session(desired_capabilities, browser_profile) File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 98, in start_session 'desiredCapabilities': desired_capabilities, File "C:\Python27\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 144, in execute self.error_handler.check_response(response) File "C:\Python27\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 100, in check_response raise exception_class(value) WebDriverException: Message: '\n\nERRO: A URL solicitada não pode ser recuperada\n\n\n

    ERRO

    \n

    A URL solicitada não pode ser recuperada

    \n
    \n

    \nNa tentativa de recuperar a URL:\nhttp://127.0.0.1:51372/hub/session\n

    \nO seguinte erro foi encontrado:\n

      \n
    • \n\nProibido o Acesso.\n\n

      \nO controle de acessos impediu sua requisição.\nCaso você não concorde com isso, por favor, \ncontate seu provedor de serviços, ou o administrador de sistemas.\n

    \n

    \n\n\n
    \n
    \n
    \nGenerated Tue, 08 Nov 2011 18:27:08 GMT by proxy (squid/2.6.STABLE21)\n
    \n\n'

    opened by cassionandi 40
  • "visit" API call looks to access the url twice

    Hi,

    I started a django dev server, and accessed the top page of the server using by django shell:

    from splinter.browser import Browser
    browser = Browser('phantomjs')
    browser.visit('http://localhost:8080/')
    

    server log is:

    [04/Jul/2013 20:31:44] "GET / HTTP/1.1" 200 0
    [04/Jul/2013 20:31:44] "GET / HTTP/1.1" 200 0
    

    Why did the "visit" method call access the page twice? It looks bit strange to me.

    thanks.

    opened by kakusuke 30
  • Stabilize tests

    Stabilize tests

    • Nicely skip tests affected by Selenium defect #4814 (the skips will fall away as soon as Selenium is updated)
    • Do a hard sleep before trying to find asynchronously added elements (again to avoid hitting #4814)
    opened by medwards 19
  • Unable to chain find_by_css().find_by_text() with 0.9.0

    Unable to chain find_by_css().find_by_text() with 0.9.0

    https://github.com/cobrateam/splinter/issues/426 seems to have resurfaced in 0.9.0.

    With 0.8.0, browser.find_by_css(".onboarding-modal").find_by_text("Slack") finds one element on my site, but 0.9.0 returns none.

    I think https://github.com/cobrateam/splinter/commit/1cfd05086a5ccb1c3297072e2bc0e713e71b2156 is the commit that changed this behavior.

    I can try to find a reproduceable example on a public site if necessary.

    bug easy good first issue hacktoberfest NeedsInvestigation 
    opened by jacebrowning 17
  • transfer project ownership to jazzband

    transfer project ownership to jazzband

    Hello @jsfehler . Cobrateam seems dead and splinter does not see much activity. Would you please consider transferring ownership to Jazzband? It's an organization of volunteer python maintainers specialized in the python ecosystem. I appreciate splinter and I would like for it to keep living. Thank you very much.

    opened by deronnax 15
  • status_code is only ever 200 - OK.

    status_code is only ever 200 - OK.

    See attached testcase.

    A status_code of 200 seems to be hard-coded since this commit?

    https://github.com/cobrateam/splinter/commit/d151c565c1068c6f0ac3f09ff010353b9b1a9de2

    import splinter
    
    with splinter.Browser('firefox') as browser:
        # should be 200
        browser.visit('http://google.com')
        print(browser.status_code.code)
        print(browser.status_code.is_success())
    
        browser.visit('http://google.com/is_this_a_bug')
        print(browser.status_code.code)
        print(browser.status_code.is_success())
    
        browser.visit('http://github.com/is_this_a_bug/is_this_a_bug_project')
        print(browser.status_code.code)
        print(browser.status_code.is_success())
    
        browser.visit('http://this_domain_doesnt_even_exist.coma')
        print(browser.status_code.code)
        print(browser.status_code.is_success())
    

    Gives this output:

    $ python ./testcase.py 
    200
    True
    200
    True
    200
    True
    200
    True
    

    This should be returning 404 for all but the 1st example.

    bug 
    opened by lexual 15
  • Splinter crashes when using screenshot with pillow with full=True

    Splinter crashes when using screenshot with pillow with full=True

    I am trying to take a screenshot of the nav element with:

       self.browser.find_by_css("nav").first.screenshot('/tmp/nav_screenshot.png', full=True)
    

    which should be pretty much the example in the docs (using css rather than xpath find).

    Full traceback:

    self = <splinter.driver.webdriver.WebDriverElement object at 0x7feb34c09c18>
    name = '/tmp/nav_screenshot.png', suffix = '.png', full = True
    
        def screenshot(self, name='', suffix='.png', full=False):
            name = name or ''
    
            (fd, filename) = tempfile.mkstemp(prefix=name, suffix=suffix)
            # don't hold the file
            os.close(fd)
    
            if full:
                ori_window_size = self.driver.get_window_size()
    >           self._full_screen()
    E           TypeError: _full_screen() takes 0 positional arguments but 1 was given
    
    /usr/local/lib/python3.6/dist-packages/splinter/driver/webdriver/__init__.py:951: TypeError
    

    OS: Ubuntu 18.04.5 LTS Python: 3.6.9 splinter: 0.14.0 Pillow: 7.2.0 (installed via pip after removing python3-pil package)

    Two things to note about "nav":

    1. It is a column on the left hand side of the screen.
    2. It starts in the viewport and extends outside.

    trying to screenshot it without full=True results in: SystemError: tile cannot extend outside image

    Hmph. Looks like bad def of _full_screen in init.py:

        def _full_screen():
            width = self.driver.execute_script("return Math.max(document.body
    .scrollWidth, document.body.offsetWidth);")
            height = self.driver.execute_script("return Math.max(document.bod
    y.scrollHeight, document.body.offsetHeight);")
            self.driver.set_window_size(width, height)
    
    

    Editing this to: def _full_screen(self): (and clearing the file from the cache) makes it blow up further down in /usr/local/lib/python3.6/dist-packages/PIL/ImageFile.py:514 with:

    SystemError: tile cannot extend outside image
    

    Any ideas?

    Thanks.

    -- rouilj

    opened by rouilj 14
  • javascript:void(0) - issue to click on menu

    javascript:void(0) - issue to click on menu

    Splinter version 0.7.7 Python version 2.7.5

    Hello All,

    I'm struggling for clicking on this menu as below:

    <a class="buttons" id="STR_TOPNAV_REMOTE_CONTROL" href="javascript:void(0)" lnavobj="RMCNTRL_LEFTNAV">Remote Control</a>

    I also tried by class, Xpath, by ID with no luck, would you have any suggestion?

    Thanks

    question 
    opened by yannlm1 14
  • Opening a link in a new tab

    Opening a link in a new tab

    Howdy,

    With Selenium, it is easy to open a link in a new tab. Is this even possible with Splinter? I dived deeply into Splinter API documentation but I did not find anything related to tab features.

    Thank you in advance for any hints, Bill BEGUERADJ

    help wanted good first issue 
    opened by begueradj 14
  • Issue 377 start firefox from custom path

    Issue 377 start firefox from custom path

    Pull request for https://github.com/cobrateam/splinter/issues/377.

    I have to say that I'm not particularly proud of the unit tests as they just mock out half the universe. I'd love to get some guidance how you would consider testing this.

    opened by dwt 13
  • Make `fill_form` more robust by requiring form ID.

    Make `fill_form` more robust by requiring form ID.

    Current implementation for fill_form attempts to find fields by their names. However, if the same name is found in multiple places, this method will either fail with a InvalidElementStateException exception or the wrong field may be filled.

    Please see #564 for more info.

    opened by omaciel 12
  • Changelog: Single file?

    Changelog: Single file?

    I think it's far easier to comprehend across multiple versions when release notes are just text, in a single file - without extra distractions / spacing / etc. Is it possible to just to have a single changelog file?

    Example: https://github.com/SeleniumHQ/selenium/blob/selenium-4.7.2-python/py/CHANGES

    opened by tony 0
  • Changed find_by_name to find_by_xpath in fill()

    Changed find_by_name to find_by_xpath in fill()

    When dealing with a page where the name is set dynamically we were not able to use fill() or attach_file() as it was accepting name as a parameter, so changed it to xpath as we can always get a xpath which is unique

    opened by riddhikt 0
  • Can´t find Iframe

    Can´t find Iframe

    So I am trying to find an Iframe with splinter and I can find the first one with,

    with browser.get_iframe('iframemodal') as iframe: iframe.do_stuff()

    and instead of iframemodal I use index which is 0 and this works fine but when I press the box in that Iframe it opens another Iframe without a name or id and everytime the index order of that newly opened iframe changes so I cant use index again it has a title but I think get.iframe doesnt work with css is there a way to find the second iframe ?

    opened by Peliikan 1
  • Error in Docker Container,

    Error in Docker Container, "unknown error: DevToolsActivePort file doesn't exist"

    I'm trying to run a program in a Docker container using Splinter. Here is my Dockerfile

    FROM python:3.7-alpine
    
    COPY requirements.txt . 
    
    RUN apk update && \
        apk add make automake gcc g++ subversion python3-dev && \
        apk add gcc musl-dev python3-dev libffi-dev openssl-dev && \
        apk add chromium chromium-chromedriver && \
        pip install -r /requirements.txt && \
        rm -rf /root/.[acpw]* ipaexg00301*
    
    COPY . /app
    

    After creating the container and running my code in it I get the following error:

    Traceback (most recent call last): File "/app/youversion_ingress.py", line 387, in main() File "/app/youversion_ingress.py", line 375, in main books_df, grouped_df = books_chapter_count(exploded, max_chapters) File "/app/youversion_ingress.py", line 224, in books_chapter_count browser = Browser('chrome') File "/usr/local/lib/python3.6/site-packages/splinter/browser.py", line 101, in Browser return get_driver(driver, retry_count=retry_count, *args, **kwargs) File "/usr/local/lib/python3.6/site-packages/splinter/browser.py", line 76, in get_driver raise err File "/usr/local/lib/python3.6/site-packages/splinter/browser.py", line 72, in get_driver return driver(*args, **kwargs) File "/usr/local/lib/python3.6/site-packages/splinter/driver/webdriver/chrome.py", line 43, in init self.driver = Chrome(options=options, **kwargs) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 81, in init desired_capabilities=desired_capabilities) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 157, in init self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally. (unknown error: DevToolsActivePort file doesn't exist) (The process started from chrome location /usr/lib/chromium/chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

    Running my script locally on my machine works fine so it must be something within Docker container. Input and comments would be appreciated.

    opened by oliverdixon85 2
  • ModuleNotFoundError: No module named 'urllib3'

    ModuleNotFoundError: No module named 'urllib3'

    New to using splinter, just pip installed into a venv, and get a ModuleNotFoundError when trying to import:

    % pip install splinter
    Looking in indexes: https://pypi.org/simple
    Collecting splinter
      Using cached splinter-0.18.1-py3-none-any.whl (37 kB)
    Installing collected packages: splinter
    Successfully installed splinter-0.18.1
    
    % python -c "from splinter import Browser"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/home/rob/tmp/v/lib64/python3.10/site-packages/splinter/__init__.py", line 5, in <module>
        from splinter.browser import Browser  # NOQA
      File "/home/rob/tmp/v/lib64/python3.10/site-packages/splinter/browser.py", line 12, in <module>
        from urllib3.exceptions import MaxRetryError
    ModuleNotFoundError: No module named 'urllib3'
    
    opened by rgilton 5
Releases(0.18.1)
  • 0.18.1(Jun 28, 2022)

    What's New in Splinter 0.18.1?

    Changed:

    • Set Firefox preferences through options instead of FirefoxProfile

    Fixed:

    • Use dedicated logger in browser.py to avoid clobbing other Python logging
    • Removed required selenium import for error handling, making it possible to use splinter without installing selenium (as long as a selenium driver isn't used)
    Source code(tar.gz)
    Source code(zip)
  • 0.18.0(Jun 10, 2022)

    What's New in Splinter 0.18.0?

    Added:

    • WebDriverElement() now implements the shadow_root property. This returns a ShadowRootElement() object to interact with the shadow root of an element.
    • Failed driver imports are logged at the debug level instead of silently ignored
    • browser.html_snapshot() now takes the optional unique_file argument. Setting this to False will disable the addition of random characters to the filename.

    Changed:

    • repr(ElementList()) now returns the repr of the internal container.
    • Driver.find_link_by_ methods have been removed. Use Driver.links.find_by_.
    • Screenshot taken by WebDriverElement.screenshot() now implements Selenium's element screenshot instead of cropping a full page screenshot.
    • Flask/Django's back/forward methods more accurately store browsing history
    • Official Python 3.6 support has been removed

    Fixed:

    • 0.17.0 would report as 0.16.0. 0.18.0 reports correctly.
    • When using Firefox, extensions can now be installed
    Source code(tar.gz)
    Source code(zip)
  • 0.17.0(Dec 20, 2021)

    What's New in Splinter 0.17.0?

    • Added parameter to DriverAPI.screenshot and ElementAPI.screenshot to indicate if unique filename should be ensured (https://github.com/cobrateam/splinter/pull/949)
    • Added Selenium 4 support

    Backward incompatible changes

    • Removed python 2.7 support (https://github.com/cobrateam/splinter/pull/952)
    • Selenium 3 is no longer installed by default. To install Selenium 3, use the selenium3 extra argument
    Source code(tar.gz)
    Source code(zip)
  • 0.16.0(Oct 17, 2021)

    whats's new in splinter 0.16.0?

    • Pin Selenium < 4.0 (https://github.com/cobrateam/splinter/pull/930)
    • Add support for Microsoft Edge (https://github.com/cobrateam/splinter/pull/912)
    • Accept extra arguments for cookies (https://github.com/cobrateam/splinter/pull/895)
    • Fix lxmldriver url join when form action is empty (https://github.com/cobrateam/splinter/pull/900)
    • Use io.open() to fix encoding issues on some platforms (https://github.com/cobrateam/splinter/pull/904)
    • allow passing options to Firefox webdriver (https://github.com/cobrateam/splinter/pull/892)

    Backward incompatible changes

    • Remove sending a list of cookie dicts to CookieManager.add() (https://github.com/cobrateam/splinter/pull/799)
    Source code(tar.gz)
    Source code(zip)
  • 0.15.0(Jun 30, 2021)

    whats's new in splinter 0.15.0?

    • Add more input types to Webdriver clear() (https://github.com/cobrateam/splinter/pull/780)
    • Standardize init of CookieManager (https://github.com/cobrateam/splinter/pull/795)
    • Add delete_all method to CookieManager (https://github.com/cobrateam/splinter/pull/797)
    • Warn user when cookies list is used (https://github.com/cobrateam/splinter/pull/801)
    • Added retry_count to get_driver (https://github.com/cobrateam/splinter/pull/754)
    • Fix full screen screenshot (https://github.com/cobrateam/splinter/pull/810)
    • Add flag to ignore missing fields in fill_form (https://github.com/cobrateam/splinter/pull/821)
    • Opening a link in a new tab (https://github.com/cobrateam/splinter/pull/800)
    Source code(tar.gz)
    Source code(zip)
  • 0.13.0(Dec 15, 2019)

    whats's new in splinter 0.13.0?

    • Patch Remote WebDriver to add retry attempts (https://github.com/cobrateam/splinter/pull/742)
    • Add driver attribute to WebDriverElement. This fixes an issue where mouse interaction fails on nested elements (https://github.com/cobrateam/splinter/pull/740)
    • Fix WebDriverElement.select and .select_by_text to search only inside the parent element (https://github.com/cobrateam/splinter/pull/729)
    • find_by with 0 second wait_time only checks once (https://github.com/cobrateam/splinter/pull/739)
    • Fix FlaskClient redirects (https://github.com/cobrateam/splinter/pull/721)
    Source code(tar.gz)
    Source code(zip)
  • 0.12.0(Dec 9, 2019)

    whats's new in splinter 0.12.0?

    • find_by_text now handle strings with quotation marks (https://github.com/cobrateam/splinter/issues/457)
    • find_link_by methods are now chainable (https://github.com/cobrateam/splinter/pull/699)
    • ElementList.__getattr__() no longer hide ElementNotFound (https://github.com/cobrateam/splinter/pull/707)
    • Firefox headless mode now handle custom firefox_binary option (https://github.com/cobrateam/splinter/pull/714)
    • Firefox driver now respects headless option in subsequent calls (https://github.com/cobrateam/splinter/pull/715)
    • Browser.get_alert() returns None if no alert exists (https://github.com/cobrateam/splinter/issues/387)
    • Retry WebElement.click if Exception is thrown (https://github.com/cobrateam/splinter/pull/725)
    • find_by methods in WebDriverElement now uses retry mechanism (https://github.com/cobrateam/splinter/pull/727)
    • is_not_present/visible returns True immediately after not finding anything (https://github.com/cobrateam/splinter/pull/732)
    • Accept all valid arguments for Remote WebDriver (https://github.com/cobrateam/splinter/pull/734)
    • Allow ActionChains when using Remote WebDriver (https://github.com/cobrateam/splinter/pull/738)
    Source code(tar.gz)
    Source code(zip)
  • 0.11.0(Jun 28, 2019)

    whats's new in splinter 0.11.0?

    • Browser.get_alert() returns Alert instead of a wrapper object
    • Add browser.html_snapshot method
    • Allow browser.get_iframe() to accept a web element
    • Fix mouse_out method
    • ElementList is no longer a subclass of list
    • Browser.get_alert() now waits for alert to present
    • Use 'switch_to.alert' instead of deprecated 'switch_to_alert'
    Source code(tar.gz)
    Source code(zip)
  • 0.10.0(Nov 16, 2018)

    whats's new in splinter 0.10.0?

    • Scroll to elements before to execute action chains
    • Using options instead firefox_options to avoid warnings (https://github.com/cobrateam/splinter/pull/634)
    • Add support for *args parameter in execute_script (https://github.com/cobrateam/splinter/issues/436)
    • Implement __ne__ in StatusCode (https://github.com/cobrateam/splinter/issues/460)
    • Using the new syntax switch_to_alert instead switch_to.alert to avoid webdriver warnings.
    • CookieManager. __eq__ returns a bool value (https://github.com/cobrateam/splinter/issues/308)
    • Fix find_by_text to be used inside a chain (https://github.com/cobrateam/splinter/issues/6281)
    • Add support for selenium 3.141.0
    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Aug 27, 2018)

    whats's new in splinter 0.9.0?

    • phantomjs support was removed (https://github.com/cobrateam/splinter/issues/592)
    • add options argument for chrome driver (https://github.com/cobrateam/splinter/pull/345)
    • (bugfix) avoid element.find_by_text searches whole dom (https://github.com/cobrateam/splinter/issues/612)
    • add suport for zope.testbrowser 5+
    • handle webdriver StaleElementReferenceException (https://github.com/cobrateam/splinter/issues/541)
    • add support for Flask 1+
    • add support for seleniu 3.14.0
    • update lxml to 4.2.4
    • update cssselect to 1.0.3
    Source code(tar.gz)
    Source code(zip)
  • 0.8.0(May 3, 2018)

    whats's new in splinter 0.8.0?

    • add support for Firefox incognito mode (https://github.com/cobrateam/splinter/pull/578)
    • allow return value for execute_script to be returned (https://github.com/cobrateam/splinter/pull/585)
    • chrome_options parameter renamed to options (https://github.com/cobrateam/splinter/pull/590)
    • removed deprecated mouseover method
    • raises NotImplementedError on status_code in drivers based on webdriver
    • phantomjs is deprecated (this driver will be removed in 0.9.0)
    Source code(tar.gz)
    Source code(zip)
  • 0.7.6(Jul 30, 2017)

    • fix fill_form for select element
    • support chrome headless mode

    you can see more in https://splinter.readthedocs.io/en/latest/news/0.7.6.html

    Source code(tar.gz)
    Source code(zip)
  • 0.7.4(Aug 7, 2016)

    whats's new in splinter 0.7.4?

    • support Selenium 2.53.6
    • find_by_text support quotes (#420).
    • Selenium capabilities for Firefox driver (#417).
    • multi-select support for Django and Flask (#443).
    • custom headers support to Flask (#444).
    • add in operation for cookies (#445).
    • Support for is_element_present_by_* in non-javascript drivers (#463).
    • incognito mode for Google Chrome (#465).
    • support for clearing text field types (#479).
    • allow to pass a chrome Options instance to Browser ([#494 (https://github.com/cobrateam/splinter/pull/494)).
    • new click_link_by_id method (#498).

    Backward incompatible changes

    • RequestHandler is removed and the status use lazy evaluation.
    Source code(tar.gz)
    Source code(zip)
Green is a clean, colorful, fast python test runner.

Green -- A clean, colorful, fast python test runner. Features Clean - Low redundancy in output. Result statistics for each test is vertically aligned.

Nathan Stocks 756 Dec 22, 2022
A test fixtures replacement for Python

factory_boy factory_boy is a fixtures replacement based on thoughtbot's factory_bot. As a fixtures replacement tool, it aims to replace static, hard t

FactoryBoy project 3k Jan 5, 2023
a socket mock framework - for all kinds of socket animals, web-clients included

mocket /mɔˈkɛt/ A socket mock framework for all kinds of socket animals, web-clients included - with gevent/asyncio/SSL support ...and then MicroPytho

Giorgio Salluzzo 249 Dec 14, 2022
create custom test databases that are populated with fake data

About Generate fake but valid data filled databases for test purposes using most popular patterns(AFAIK). Current support is sqlite, mysql, postgresql

Emir Ozer 2.2k Jan 6, 2023
gunicorn 'Green Unicorn' is a WSGI HTTP Server for UNIX, fast clients and sleepy applications.

Gunicorn Gunicorn 'Green Unicorn' is a Python WSGI HTTP Server for UNIX. It's a pre-fork worker model ported from Ruby's Unicorn project. The Gunicorn

Benoit Chesneau 8.7k Jan 1, 2023
Radically simplified static file serving for Python web apps

WhiteNoise Radically simplified static file serving for Python web apps With a couple of lines of config WhiteNoise allows your web app to serve its o

Dave Evans 2.1k Jan 8, 2023
Meinheld is a high performance asynchronous WSGI Web Server (based on picoev)

What's this This is a high performance python wsgi web server. And Meinheld is a WSGI compliant web server. (PEP333 and PEP3333 supported) You can als

Yutaka Matsubara 1.4k Jan 1, 2023
Generic automation framework for acceptance testing and RPA

Robot Framework Introduction Installation Example Usage Documentation Support and contact Contributing License Introduction Robot Framework is a gener

Robot Framework 7.7k Dec 31, 2022
Sixpack is a language-agnostic a/b-testing framework

Sixpack Sixpack is a framework to enable A/B testing across multiple programming languages. It does this by exposing a simple API for client libraries

null 1.7k Dec 24, 2022
Scalable user load testing tool written in Python

Locust Locust is an easy to use, scriptable and scalable performance testing tool. You define the behaviour of your users in regular Python code, inst

Locust.io 20.4k Jan 8, 2023
A cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard.

PyAutoGUI PyAutoGUI is a cross-platform GUI automation Python module for human beings. Used to programmatically control the mouse & keyboard. pip inst

Al Sweigart 7.6k Jan 1, 2023
Let your Python tests travel through time

FreezeGun: Let your Python tests travel through time FreezeGun is a library that allows your Python tests to travel through time by mocking the dateti

Steve Pulec 3.5k Jan 9, 2023
HTTP client mocking tool for Python - inspired by Fakeweb for Ruby

HTTPretty 1.0.5 HTTP Client mocking tool for Python created by Gabriel Falcão . It provides a full fake TCP socket module. Inspired by FakeWeb Github

Gabriel Falcão 2k Jan 6, 2023
A utility for mocking out the Python Requests library.

Responses A utility library for mocking out the requests Python library. Note Responses requires Python 2.7 or newer, and requests >= 2.0 Installing p

Sentry 3.8k Jan 2, 2023
Mixer -- Is a fixtures replacement. Supported Django, Flask, SqlAlchemy and custom python objects.

The Mixer is a helper to generate instances of Django or SQLAlchemy models. It's useful for testing and fixture replacement. Fast and convenient test-

Kirill Klenov 871 Dec 25, 2022
Faker is a Python package that generates fake data for you.

Faker is a Python package that generates fake data for you. Whether you need to bootstrap your database, create good-looking XML documents, fill-in yo

Daniele Faraglia 15.2k Jan 1, 2023
Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes in a variety of languages.

Mimesis - Fake Data Generator Description Mimesis is a high-performance fake data generator for Python, which provides data for a variety of purposes

Isaak Uchakaev 3.8k Jan 1, 2023
Coroutine-based concurrency library for Python

gevent Read the documentation online at http://www.gevent.org. Post issues on the bug tracker, discuss and ask open ended questions on the mailing lis

gevent 5.9k Dec 28, 2022
livereload server in python (MAINTAINERS NEEDED)

LiveReload Reload webpages on changes, without hitting refresh in your browser. Installation python-livereload is for web developers who know Python,

Hsiaoming Yang 977 Dec 14, 2022