{"id":35052875,"url":"https://github.com/mozarkai/optics-framework","last_synced_at":"2026-03-07T18:05:55.555Z","repository":{"id":288627291,"uuid":"957803471","full_name":"mozarkai/optics-framework","owner":"mozarkai","description":"Optics Framework is a powerful, extensible no code test automation framework designed for vision powered, data-driven testing and production app synthetic monitoring.","archived":false,"fork":false,"pushed_at":"2026-01-29T09:40:41.000Z","size":2728,"stargazers_count":3,"open_issues_count":16,"forks_count":9,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-30T01:06:29.693Z","etag":null,"topics":["app-testing","browser-testing"],"latest_commit_sha":null,"homepage":"https://mozarkai.github.io/optics-framework/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mozarkai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-03-31T06:49:11.000Z","updated_at":"2026-01-29T09:38:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"f291974a-0381-417a-aa23-e3841a9151d7","html_url":"https://github.com/mozarkai/optics-framework","commit_stats":null,"previous_names":["mozarkai/optics-framework"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/mozarkai/optics-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mozarkai%2Foptics-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mozarkai%2Foptics-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mozarkai%2Foptics-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mozarkai%2Foptics-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mozarkai","download_url":"https://codeload.github.com/mozarkai/optics-framework/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mozarkai%2Foptics-framework/sbom","scorecard":{"id":1020466,"data":{"date":"2025-08-26T04:17:52Z","repo":{"name":"github.com/mozarkai/optics-framework","commit":"f12417054b55df82d1e4d3e2dbdcf0276b9b4c02"},"scorecard":{"version":"v5.1.1","commit":"cd152cb6742c5b8f2f3d2b5193b41d9c50905198"},"score":7.1,"checks":[{"name":"Dependency-Update-Tool","score":10,"reason":"update tool detected","details":["Info: detected update tool: Dependabot: .github/dependabot.yml:1"],"documentation":{"short":"Determines if the project uses a dependency update tool.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#dependency-update-tool"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 7 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#maintained"}},{"name":"Code-Review","score":10,"reason":"all changesets reviewed","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/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#dangerous-workflow"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Info: Found linked content: SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#security-policy"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql.yml:40","Info: jobLevel 'packages' permission set to 'read': .github/workflows/codeql.yml:36","Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql.yml:39","Warn: jobLevel 'contents' permission set to 'write': .github/workflows/publish_docs.yml:36","Warn: no topLevel permission defined: .github/workflows/codeql.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/greetings.yml:8","Warn: no topLevel permission defined: .github/workflows/mozarksonar.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/precommit_main.yml:10","Info: topLevel 'contents' permission set to 'read': .github/workflows/publish_docs.yml:11","Info: topLevel 'contents' permission set to 'read': .github/workflows/pypi-publish.yml:8","Info: topLevel permissions set to 'read-all': .github/workflows/scorecard.yml:18"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#token-permissions"}},{"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/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#license"}},{"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/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#vulnerabilities"}},{"name":"CII-Best-Practices","score":5,"reason":"badge detected: Passing","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#cii-best-practices"}},{"name":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/pypi-publish.yml:41"],"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/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":3,"reason":"dependency not pinned by hash detected -- score normalized to 3","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:60: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/codeql.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/codeql.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql.yml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/codeql.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/mozarksonar.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/mozarksonar.yml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/mozarksonar.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/mozarksonar.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/scorecard.yml:76: update your workflow using https://app.stepsecurity.io/secureworkflow/mozarkai/optics-framework/scorecard.yml/main?enable=pin","Warn: containerImage not pinned by hash: Docker/dev/Dockerfile:2: pin your Docker image by updating python:3.12-slim to python:3.12-slim@sha256:d67a7b66b989ad6b6d6b10d428dcc5e0bfc3e5f88906e67d490c4d3daac57047","Warn: containerImage not pinned by hash: Docker/prod/Dockerfile:2: pin your Docker image by updating python:3.12-slim to python:3.12-slim@sha256:d67a7b66b989ad6b6d6b10d428dcc5e0bfc3e5f88906e67d490c4d3daac57047","Warn: pipCommand not pinned by hash: Docker/dev/Dockerfile:17-28","Warn: pipCommand not pinned by hash: Docker/prod/Dockerfile:11-24","Warn: pipCommand not pinned by hash: .github/workflows/precommit_main.yml:28","Warn: pipCommand not pinned by hash: .github/workflows/publish_docs.yml:29","Warn: pipCommand not pinned by hash: .github/workflows/publish_docs.yml:56","Warn: downloadThenRun not pinned by hash: .github/workflows/pypi-publish.yml:23","Info:  15 out of  20 GitHub-owned GitHubAction dependencies pinned","Info:   2 out of   3 third-party GitHubAction dependencies pinned","Info:   0 out of   5 pipCommand dependencies pinned","Info:   0 out of   1 downloadThenRun dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#pinned-dependencies"}},{"name":"SAST","score":10,"reason":"SAST tool is run on all commits","details":["Info: SAST configuration detected: CodeQL","Info: all commits (30) are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#sast"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v1.1.0 not signed: https://api.github.com/repos/mozarkai/optics-framework/releases/218080782","Warn: release artifact v1.0.0 not signed: https://api.github.com/repos/mozarkai/optics-framework/releases/213458021","Warn: release artifact v0.0.11 not signed: https://api.github.com/repos/mozarkai/optics-framework/releases/210456947","Warn: release artifact v1.1.0 does not have provenance: https://api.github.com/repos/mozarkai/optics-framework/releases/218080782","Warn: release artifact v1.0.0 does not have provenance: https://api.github.com/repos/mozarkai/optics-framework/releases/213458021","Warn: release artifact v0.0.11 does not have provenance: https://api.github.com/repos/mozarkai/optics-framework/releases/210456947"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#signed-releases"}},{"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/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#fuzzing"}},{"name":"Branch-Protection","score":5,"reason":"branch protection is not maximal on development and all release branches","details":["Info: 'allow deletion' disabled on branch 'main'","Info: 'force pushes' disabled on branch 'main'","Info: 'branch protection settings apply to administrators' is required to merge on branch 'main'","Warn: 'stale review dismissal' is disabled on branch 'main'","Warn: required approving review count is 1 on branch 'main'","Warn: codeowners review is not required on branch 'main'","Warn: 'last push approval' is disabled on branch 'main'","Info: 'up-to-date branches' is required to merge on branch 'main'","Info: status check found to merge onto on branch 'main'","Info: PRs are required in order to make changes on branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#branch-protection"}},{"name":"Contributors","score":3,"reason":"project has 1 contributing companies or organizations -- score normalized to 3","details":["Info: found contributions from: mozarkai"],"documentation":{"short":"Determines if the project has a set of contributors from multiple organizations (e.g., companies).","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#contributors"}},{"name":"CI-Tests","score":10,"reason":"13 out of 13 merged PRs checked by a CI test -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project runs tests before pull requests are merged.","url":"https://github.com/ossf/scorecard/blob/cd152cb6742c5b8f2f3d2b5193b41d9c50905198/docs/checks.md#ci-tests"}}]},"last_synced_at":"2025-08-28T01:33:46.061Z","repository_id":288627291,"created_at":"2025-08-28T01:33:46.061Z","updated_at":"2025-08-28T01:33:46.061Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29659761,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-20T16:33:43.953Z","status":"ssl_error","status_checked_at":"2026-02-20T16:33:43.598Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["app-testing","browser-testing"],"created_at":"2025-12-27T09:38:25.920Z","updated_at":"2026-02-20T18:08:04.765Z","avatar_url":"https://github.com/mozarkai.png","language":"Python","readme":"# Optics Framework\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework\u0026metric=alert_status)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[![License](https://img.shields.io/badge/license-Apache_2.0-blue.svg)](LICENSE)\n[![Python](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/)\n[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework\u0026metric=code_smells)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework\u0026metric=coverage)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10842/badge)](https://www.bestpractices.dev/projects/10842)\n\n\n**Optics Framework** is a powerful, extensible no code test automation framework designed for **vision powered**, **data-driven testing** and **production app synthetic monitoring**. It enables seamless integration with intrusive action \u0026 detection drivers such as Appium / WebDriver as well as non-intrusive action drivers such as BLE mouse / keyboard and detection drivers such as video capture card and external web cams.\n\nThis framework was designed primarily for the following use cases:\n\n1. Production app monitoring where access to USB debugging / developer mode and device screenshots is prohibited\n2. Resilient self-healing test automation that rely on more than one element identifier and multiple fallbacks to ensure maximum recovery\n3. Enable non-coders to build test automation scripts\n\n---\n\n## 🚀 Features\n\n- **Vision powered detections:** UI object detections are powered by computer vision and not just on XPath elements.\n- **No code automation:** No knowledge of programming languages or access to IDE needed to build automations scripts\n- **Supports non-intrusive action drivers:** Non-intrusive action drivers such as BLE mouse and keyboard are supported\n- **Data-Driven Testing (DDT):** Execute test cases dynamically with multiple datasets, enabling parameterized testing and iterative execution.\n- **Extensible \u0026 Scalable:** Easily add new keywords and modules without any hassle.\n- **AI Integration:** Choose which AI models to use for object recognition and OCR.\n- **Self-healing capability:** Configure multiple drivers, screen capture methods, and detection techniques with priority-based execution. If a primary method fails, the system automatically switches to the next available method in the defined hierarchy\n\n---\n\n## 📦 Installation\n\n### Install via `pip`\n\n```bash\npip install optics-framework\n```\n\n---\n\n## 🚀 Quick Start\n\n### 1 Install Optics Framework\n\n**Note**: Ensure Appium server is running and a virtual Android device is enabled before proceeding.\n\n```bash\nmkdir ~/test-code\ncd ~/test-code\npython3 -m venv venv\nsource venv/bin/activate\npip install optics-framework\n```\n\n\u003e **⚠️ Important:** Conda environments are not supported for `easyocr` and `optics-framework` together, due to conflicting requirements for `numpy` (version 1.x vs 2.x). Please use a standard Python virtual environment instead.\n\n### 2 Create a New Test Project\n\n```bash\noptics setup --install Appium EasyOCR\noptics init --name my_test_project --path . --template contact\n```\n\n### 📌 Dry Run Test Cases\n\n```bash\noptics dry_run my_test_project\n```\n\n### 📌 Execute Test Cases\n\n```bash\noptics execute my_test_project\n```\n\n---\n\n## 🛠️ Usage\n\n### Execute Tests\n\n```bash\noptics execute \u003cproject_name\u003e\n```\n\n### Initialize a New Project\n\n```bash\noptics init --name \u003cproject_name\u003e --path \u003cdirectory\u003e --template \u003ccontact/youtube\u003e --force\n```\n\n### List Available Keywords\n\n```bash\noptics list\n```\n\n### Display Help\n\n```bash\noptics --help\n```\n\n### Check Version\n\n```bash\noptics version\n```\n\n---\n\n## 🏗️ Developer Guide\n\n### Project Structure\n\n```bash\nOptics_Framework/\n├── LICENSE\n├── README.md\n├── dev_requirements.txt\n├── samples/            # Sample test cases and configurations\n|   ├── contact/\n|   ├── youtube/\n├── pyproject.toml\n├── tox.ini\n├── docs/               # Documentation using Sphinx\n├── optics_framework/   # Main package\n│   ├── api/            # Core API modules\n│   ├── common/         # Factories, interfaces, and utilities\n│   ├── engines/        # Engine implementations (drivers, vision models, screenshot tools)\n│   ├── helper/         # Configuration management\n├── tests/              # Unit tests and test assets\n│   ├── assets/         # Sample images for testing\n│   ├── units/          # Unit tests organized by module\n│   ├── functional/     # Functional tests organized by module\n\n```\n\n### Available Keywords\n\nThe following keywords are available and organized by category. These keywords can be used directly in your test cases or extended further for custom workflows.\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔹 Core Keywords\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    \u003ccode\u003eClear Element Text (element, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Clears any existing text from the given input element.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eDetect and Press (element, timeout, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Detects if the element exists, then performs a press action on it.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eEnter Number (element, number, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Enters a numeric value into the specified input field.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eEnter Text (element, text, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Inputs the given text into the specified element.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eGet Text (element)\u003c/code\u003e\u003cbr/\u003e\n    Retrieves the text content from the specified element.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003ePress by Coordinates (x, y, repeat=1, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Performs a tap at the specified absolute screen coordinates.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003ePress by Percentage (percent_x, percent_y, repeat=1, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Taps on a location based on percentage of screen width and height.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003ePress Element (element, repeat=1, offset_x=0, offset_y=0, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Taps on a given element with optional offset and repeat parameters.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003ePress Element with Index (element, index=0, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Presses the element found at the specified index from multiple matches.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003ePress Keycode (keycode, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Simulates pressing a hardware key using a keycode.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eScroll (direction, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Scrolls the screen in the specified direction.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eScroll from Element (element, direction, scroll_length, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Scrolls starting from a specific element in the given direction.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eScroll Until Element Appears (element, direction, timeout, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Continuously scrolls until the target element becomes visible or the timeout is reached.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eSelect Dropdown Option (element, option, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Selects an option from a dropdown field by visible text.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eSleep (duration)\u003c/code\u003e\u003cbr/\u003e\n    Pauses execution for a specified number of seconds.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eSwipe (x, y, direction='right', swipe_length=50, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Swipes from a coordinate point in the given direction and length.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eScroll from Element (element, direction, scroll_length, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Scrolls starting from the position of a given element.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eSwipe Until Element Appears (element, direction, timeout, event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Swipes repeatedly until the element is detected or timeout is reached.\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔹 AppManagement\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    \u003ccode\u003eClose And Terminate App(package_name, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Closes and fully terminates the specified application using its package name.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eForce Terminate App(event_name)\u003c/code\u003e\u003cbr/\u003e\n    Forcefully terminates the currently running application.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eGet App Version\u003c/code\u003e\u003cbr/\u003e\n    Returns the version of the currently running application.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eInitialise Setup\u003c/code\u003e\u003cbr/\u003e\n    Prepares the environment for performing application management operations.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eLaunch App (event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Launches the default application configured in the session.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eStart Appium Session (event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Starts a new Appium session for the current application.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eStart Other App (package_name, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Launches a different application using the provided package name.\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔹 FlowControl\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    \u003ccode\u003eCondition \u003c/code\u003e\u003cbr/\u003e\n    Evaluates multiple conditions and executes corresponding modules if the condition is true.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eEvaluate (param1, param2)\u003c/code\u003e\u003cbr/\u003e\n    Evaluates a mathematical or logical expression and stores the result in a variable.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eRead Data (input_element, file_path, index=None)\u003c/code\u003e\u003cbr/\u003e\n    Reads data from a CSV file, API URL, or list and assigns it to a variable.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eRun Loop (target, *args)\u003c/code\u003e\u003cbr/\u003e\n    Runs a loop either by count or by iterating over variable-value pairs.\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003e🔹 Verifier\u003c/strong\u003e\u003c/summary\u003e\n\n\u003cul\u003e\n  \u003cli\u003e\n    \u003ccode\u003eAssert Equality (output, expression)\u003c/code\u003e\u003cbr/\u003e\n    Compares two values and checks if they are equal.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eAssert Images Vision (frame, images, element_status, rule)\u003c/code\u003e\u003cbr/\u003e\n    Searches for the specified image templates within the frame using vision-based template matching.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eAssert Presence (elements, timeout=30, rule='any', event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Verifies the presence of given elements using Appium or vision-based fallback logic.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eAssert Texts Vision (frame, texts, element_status, rule)\u003c/code\u003e\u003cbr/\u003e\n    Searches for text in the given frame using OCR and updates element status.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eIs Element (element, element_state, timeout, event_name)\u003c/code\u003e\u003cbr/\u003e\n    Checks if a given element exists.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eValidate Element (element, timeout=10, rule='all', event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Validates if the given element is present on the screen using defined rule and timeout.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eValidate Screen (elements, timeout=30, rule='any', event_name=None)\u003c/code\u003e\u003cbr/\u003e\n    Validates the presence of a set of elements on a screen using the defined rule.\n  \u003c/li\u003e\n  \u003cli\u003e\n    \u003ccode\u003eVision Search (elements, timeout, rule)\u003c/code\u003e\u003cbr/\u003e\n    Performs vision-based search to detect text or image elements in the screen.\n  \u003c/li\u003e\n\u003c/ul\u003e\n\n\u003c/details\u003e\n\n\n### Setup Development Environment\n\n```bash\ngit clone git@github.com:mozarkai/optics-framework.git\ncd Optics_Framework\npipx install poetry\npoetry install --with dev\n```\n\n### Running Tests\n\n```bash\npoetry install --with tests\npoetry run pytest\n```\n\n### Build Documentation\n\n```bash\npoetry install --with docs\npoetry run mkdocs serve\n```\n\n### Packaging the Project\n\n```bash\npoetry build\n```\n\n---\n\n## 📜 Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. Fork the repository.\n2. Create a new feature branch.\n3. Commit your changes.\n4. Open a pull request.\n\nEnsure your code follows **PEP8** standards and is formatted with **Black**.\n\n---\n\n## 🎯 Roadmap\n\nHere are the key initiatives planned for the upcoming quarter:\n\n1. MCP Servicer: Introduce a dedicated service to handle MCP (Model Context Protocol), improving scalability and modularity across the framework.\n2. Omniparser Integration: Seamlessly integrate Omniparser to enable robust and flexible element extraction and location.\n3. Playwright Integration: Add support for Playwright to enhance browser automation capabilities, enabling cross-browser testing with modern and powerful tooling.\n4. Audio Support: Extend the framework to support audio inputs and outputs, enabling testing and verification of voice-based or sound-related interactions.\n\n---\n\n## 📄 License\n\nThis project is licensed under the **Apache 2.0 License**. See the [LICENSE](https://github.com/mozarkai/optics-framework?tab=Apache-2.0-1-ov-file) file for details.\n\n---\n\n## 📞 Support\n\nFor support, please open an issue on GitHub or contact us at [@malto101], [@davidamo9] or [lalit@mozark.ai] .\n\nHappy Testing! 🚀\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmozarkai%2Foptics-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmozarkai%2Foptics-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmozarkai%2Foptics-framework/lists"}