{"id":34024357,"url":"https://github.com/boxingbeetle/apetest","last_synced_at":"2026-03-27T04:31:44.677Z","repository":{"id":62560004,"uuid":"168524995","full_name":"boxingbeetle/apetest","owner":"boxingbeetle","description":"Smarter-than-monkey testing for web apps","archived":false,"fork":false,"pushed_at":"2024-09-29T21:48:26.000Z","size":531,"stargazers_count":7,"open_issues_count":31,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-12-15T05:56:27.965Z","etag":null,"topics":["checker","html","html5","testing-tools","webapp","website"],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/boxingbeetle.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2019-01-31T12:55:21.000Z","updated_at":"2025-08-27T12:19:10.000Z","dependencies_parsed_at":"2023-12-31T00:13:27.486Z","dependency_job_id":"568b14a6-8e8b-47be-a807-95556986ca41","html_url":"https://github.com/boxingbeetle/apetest","commit_stats":{"total_commits":336,"total_committers":3,"mean_commits":112.0,"dds":0.1785714285714286,"last_synced_commit":"ae208abc311c5dae879670a89d23fc80e2ce585a"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/boxingbeetle/apetest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boxingbeetle%2Fapetest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boxingbeetle%2Fapetest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boxingbeetle%2Fapetest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boxingbeetle%2Fapetest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/boxingbeetle","download_url":"https://codeload.github.com/boxingbeetle/apetest/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/boxingbeetle%2Fapetest/sbom","scorecard":{"id":249409,"data":{"date":"2025-08-11","repo":{"name":"github.com/boxingbeetle/apetest","commit":"93d0eb8bd6d883664c544f49d8b340e4f29d82d7"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 3-Clause \"New\" or \"Revised\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}}]},"last_synced_at":"2025-08-17T08:11:03.442Z","repository_id":62560004,"created_at":"2025-08-17T08:11:03.442Z","updated_at":"2025-08-17T08:11:03.442Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31019417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-27T03:51:26.850Z","status":"ssl_error","status_checked_at":"2026-03-27T03:51:09.693Z","response_time":164,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["checker","html","html5","testing-tools","webapp","website"],"created_at":"2025-12-13T16:15:42.569Z","updated_at":"2026-03-27T04:31:44.667Z","avatar_url":"https://github.com/boxingbeetle.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"APE - Automated Page Exerciser\n==============================\n\n*Smarter-than-monkey testing for web apps*\n\n\u003chttps://boxingbeetle.com/tools/ape/\u003e\n\nTesting Without Test Scripts\n----------------------------\n\nThe only thing APE needs to know about a web app or site is its URL. From that starting point, it automatically finds links to other pages and subjects all of them to a series of checks. So it takes very little effort to check your web app or site with APE.\n\nOf course, since APE knows next to nothing about your specific web app, there are limits to what it can check. For example, it can submit a form and check whether the server returns an error or an OK result and whether the resulting page is valid HTML, but it cannot check whether the content matches the submitted form values. Therefore, APE is not a replacement for scripted test tools like [Selenium](https://docs.seleniumhq.org/).\n\nYou may be surprised by how many problems can be uncovered just following random links and checking the result. Give APE a try!\n\nCan APE Test My Web App/Site?\n-----------------------------\n\nAPE can be used if:\n\n- you have a static web site, for example one written by hand or generated by a static content management system like [Lektor](https://www.getlektor.com/) or [Jekyll](https://jekyllrb.com/)\n- you have a dynamic web application in which URLs are meaningful and the main content is in HTML\n\nAPE cannot be used if:\n\n- your server relies on session state instead of HTTP GET requests to determine what to render\n- your web app generates all HTML in client-side JavaScript instead of serving it over HTTP\n\nSo roughly, APE will work if your app supports deep-linking and JavaScript is used for optional enhancements, while APE will not work if you have built a single-page application.\n\nInstallation\n------------\n\nAPE requires Python 3.9 or higher.\n\nYou can use the package tool \"pip\" that comes with Python to install APE:\n\n    $ pip install apetest\n\nNow you should be able to run the `apetest` command:\n\n    $ apetest --version\n    APE 0.2.1\n\nAPE uses the [Nu Html Checker (v.Nu)](\u003chttps://validator.github.io/\u003e) to check HTML. The checker itself is installed by pip, but you also need a Java runtime on your machine to run it, such as [OpenJDK](https://openjdk.java.net/install/index.html). You only need the runtime (JRE) and not the full development kit (JDK).\n\nYou can use APE without the HTML checker, but it is much more useful with the checker enabled.\n\nUsage\n-----\n\nTo check the HTML of a static web site in a local directory:\n\n    $ apetest --check launch website/ report.html\n\nTo do a quick sanity check (no HTML check) of a web application in development:\n\n    $ apetest localhost:8080 report.html\n\nTo see all command line options:\n\n    $ apetest --help\n\nHow Mature Is APE?\n------------------\n\nIt is mature enough that I'm using it in production to test our company web site and the web application SoftFab that we'll be releasing soon. However, at the time of writing I am the only user, so I fully expect that once other people start using it, they will run into bugs and limitations that I haven't. If that happens to you, please let me know (see next section).\n\nThe code was modernized over the last few months and should be in reasonable shape. It is fully documented and free of issues PyLint can detect. It is missing unit tests for most of its functionality though, so I'm relying on system tests at the moment, which can easily miss corner cases.\n\nFeedback\n--------\n\nYou can report bugs and make feature requests in [APE's issue tracker at GitHub](https://github.com/boxingbeetle/apetest/issues).\n\nIf you are interested in sponsoring a new feature, [contact us at Boxing Beetle](https://boxingbeetle.com/contact/).\n\nWriting a Plugin\n----------------\n\nAPE can be extended using plugins. Plugins are Python modules placed into the `apetest.plugin` package; read the API documentation of `apetest.plugin` to learn about the plugin interface.\n\nThe plugin interface was designed to have just enough features to be able to convert pre-existing optional functionality to plugins. The intention is to grow and improve it over time. So if you need additional callbacks or information passed, feel free to request a change in the plugin interface, or prototype one yourself (see next section).\n\nContributing\n------------\n\nIf you want to modify APE, start by cloning the Git repository:\n\n    $ git clone https://github.com/boxingbeetle/apetest.git\n\nAPE uses the [Poetry build system](https://poetry.eustace.io/) for managing its development environment. Using the [recommended installation procedure](https://github.com/sdispater/poetry#installation) instead of pip helps separate Poetry's dependencies from those of the software it manages, like APE.\n\nCreate a virtual environment managed by Poetry:\n\n    $ poetry env use python3\n\nStart a shell in this virtual environment:\n\n    $ poetry shell\n\nInstall APE and its runtime and development dependencies:\n\n    $ poetry install\n\nNow you should have an `apetest` command available in the Poetry shell that runs APE directly from the source tree. This means that any code you edit is immediately active, for easy testing.\n\nOne of the tools Poetry will install for you is [Invoke](https://www.pyinvoke.org/), which can be used to perform a few useful developer tasks. You can see the full list of tasks by running:\n\n    $ inv --list\n\nThe task you will probably want to run first is `docs`, which generates the documentation files:\n\n    $ inv docs\n\nNow you can read the API documentation in `docs/api/`. The documentation of the top-level module gives a quick overview of the code.\n\nAPE uses [`pre-commit` ](https://pre-commit.com/) to automatically check and reformat source code before it is committed. Running the following command once in your Git work area sets up the pre-commit hooks:\n\n    $ pre-commit install\n\nBefore submitting a pull request, please run `inv test` to run all tests. There should be no failing tests and zero warnings from PyLint. If PyLint detects any false positives, please add a `pylint: disable=\u003cid\u003e` comment to suppress them.\n\nNote that APE may find invalid HTML in the API docs, but as long as APE doesn't crash and produces a readable report, that counts as the test passing as far as APE is concerned.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboxingbeetle%2Fapetest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fboxingbeetle%2Fapetest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fboxingbeetle%2Fapetest/lists"}