optics-framework


Nameoptics-framework JSON
Version 1.3.4 PyPI version JSON
download
home_pageNone
SummaryA flexible and modular test automation framework that can be used to automate any mobile application.
upload_time2025-07-08 11:29:02
maintainerNone
docs_urlNone
authorLalitanand Dandge
requires_python<4.0,>=3.12
licenseApache-2.0
keywords test automation framework mobile automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Optics Framework
[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[![License](https://img.shields.io/badge/license-Apache_2.0-blue.svg)](LICENSE)
[![Python](https://img.shields.io/badge/python-3.12%2B-blue.svg)](https://www.python.org/)
[![Code Smells](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework&metric=code_smells)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework&metric=coverage)](https://sonarcloud.io/summary/new_code?id=mozarkai_optics-framework)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/10842/badge)](https://www.bestpractices.dev/projects/10842)


**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 & 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.

This framework was designed primarily for the following use cases:

1. Production app monitoring where access to USB debugging / developer mode and device screenshots is prohibited
2. Resilient self-healing test automation that rely on more than one element identifier and multiple fallbacks to ensure maximum recovery
3. Enable non-coders to build test automation scripts

---

## 🚀 Features

- **Vision powered detections:** UI object detections are powered by computer vision and not just on XPath elements.
- **No code automation:** No knowledge of programming languages or access to IDE needed to build automations scripts
- **Supports non-intrusive action drivers:** Non-intrusive action drivers such as BLE mouse and keyboard are supported
- **Data-Driven Testing (DDT):** Execute test cases dynamically with multiple datasets, enabling parameterized testing and iterative execution.
- **Extensible & Scalable:** Easily add new keywords and modules without any hassle.
- **AI Integration:** Choose which AI models to use for object recognition and OCR.
- **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

---

## 📦 Installation

### Install via `pip`

```bash
pip install optics-framework
```

---

## 🚀 Quick Start

### 1 Install Optics Framework

**Note**: Ensure Appium server is running and a virtual Android device is enabled before proceeding.

```bash
mkdir ~/test-code
cd ~/test-code
python3 -m venv venv
source venv/bin/activate
pip install optics-framework
```

> **⚠️ 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.

### 2 Create a New Test Project

```bash
optics setup --install Appium EasyOCR
optics init --name my_test_project --path . --template contact
```

### 📌 Dry Run Test Cases

```bash
optics dry_run my_test_project
```

### 📌 Execute Test Cases

```bash
optics execute my_test_project
```

---

## 🛠️ Usage

### Execute Tests

```bash
optics execute <project_name>
```

### Initialize a New Project

```bash
optics init --name <project_name> --path <directory> --template <contact/youtube> --force
```

### List Available Keywords

```bash
optics list
```

### Display Help

```bash
optics --help
```

### Check Version

```bash
optics version
```

---

## 🏗️ Developer Guide

### Project Structure

```bash
Optics_Framework/
├── LICENSE
├── README.md
├── dev_requirements.txt
├── samples/            # Sample test cases and configurations
|   ├── contact/
|   ├── youtube/
├── pyproject.toml
├── tox.ini
├── docs/               # Documentation using Sphinx
├── optics_framework/   # Main package
│   ├── api/            # Core API modules
│   ├── common/         # Factories, interfaces, and utilities
│   ├── engines/        # Engine implementations (drivers, vision models, screenshot tools)
│   ├── helper/         # Configuration management
├── tests/              # Unit tests and test assets
│   ├── assets/         # Sample images for testing
│   ├── units/          # Unit tests organized by module
│   ├── functional/     # Functional tests organized by module

```

### Available Keywords

The following keywords are available and organized by category. These keywords can be used directly in your test cases or extended further for custom workflows.
<details>
<summary><strong>🔹 Core Keywords</strong></summary>

<ul>
  <li>
    <code>Clear Element Text (element, event_name=None)</code><br/>
    Clears any existing text from the given input element.
  </li>
  <li>
    <code>Detect and Press (element, timeout, event_name=None)</code><br/>
    Detects if the element exists, then performs a press action on it.
  </li>
  <li>
    <code>Enter Number (element, number, event_name=None)</code><br/>
    Enters a numeric value into the specified input field.
  </li>
  <li>
    <code>Enter Text (element, text, event_name=None)</code><br/>
    Inputs the given text into the specified element.
  </li>
  <li>
    <code>Get Text (element)</code><br/>
    Retrieves the text content from the specified element.
  </li>
  <li>
    <code>Press by Coordinates (x, y, repeat=1, event_name=None)</code><br/>
    Performs a tap at the specified absolute screen coordinates.
  </li>
  <li>
    <code>Press by Percentage (percent_x, percent_y, repeat=1, event_name=None)</code><br/>
    Taps on a location based on percentage of screen width and height.
  </li>
  <li>
    <code>Press Element (element, repeat=1, offset_x=0, offset_y=0, event_name=None)</code><br/>
    Taps on a given element with optional offset and repeat parameters.
  </li>
  <li>
    <code>Press Element with Index (element, index=0, event_name=None)</code><br/>
    Presses the element found at the specified index from multiple matches.
  </li>
  <li>
    <code>Press Keycode (keycode, event_name)</code><br/>
    Simulates pressing a hardware key using a keycode.
  </li>
  <li>
    <code>Scroll (direction, event_name=None)</code><br/>
    Scrolls the screen in the specified direction.
  </li>
  <li>
    <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>
    Scrolls starting from a specific element in the given direction.
  </li>
  <li>
    <code>Scroll Until Element Appears (element, direction, timeout, event_name=None)</code><br/>
    Continuously scrolls until the target element becomes visible or the timeout is reached.
  </li>
  <li>
    <code>Select Dropdown Option (element, option, event_name=None)</code><br/>
    Selects an option from a dropdown field by visible text.
  </li>
  <li>
    <code>Sleep (duration)</code><br/>
    Pauses execution for a specified number of seconds.
  </li>
  <li>
    <code>Swipe (x, y, direction='right', swipe_length=50, event_name=None)</code><br/>
    Swipes from a coordinate point in the given direction and length.
  </li>
  <li>
    <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>
    Scrolls starting from the position of a given element.
  </li>
  <li>
    <code>Swipe Until Element Appears (element, direction, timeout, event_name=None)</code><br/>
    Swipes repeatedly until the element is detected or timeout is reached.
  </li>
</ul>

</details>

<details>
<summary><strong>🔹 AppManagement</strong></summary>

<ul>
  <li>
    <code>Close And Terminate App(package_name, event_name)</code><br/>
    Closes and fully terminates the specified application using its package name.
  </li>
  <li>
    <code>Force Terminate App(event_name)</code><br/>
    Forcefully terminates the currently running application.
  </li>
  <li>
    <code>Get App Version</code><br/>
    Returns the version of the currently running application.
  </li>
  <li>
    <code>Initialise Setup</code><br/>
    Prepares the environment for performing application management operations.
  </li>
  <li>
    <code>Launch App (event_name=None)</code><br/>
    Launches the default application configured in the session.
  </li>
  <li>
    <code>Start Appium Session (event_name=None)</code><br/>
    Starts a new Appium session for the current application.
  </li>
  <li>
    <code>Start Other App (package_name, event_name)</code><br/>
    Launches a different application using the provided package name.
  </li>
</ul>

</details>


<details>
<summary><strong>🔹 FlowControl</strong></summary>

<ul>
  <li>
    <code>Condition </code><br/>
    Evaluates multiple conditions and executes corresponding modules if the condition is true.
  </li>
  <li>
    <code>Evaluate (param1, param2)</code><br/>
    Evaluates a mathematical or logical expression and stores the result in a variable.
  </li>
  <li>
    <code>Read Data (input_element, file_path, index=None)</code><br/>
    Reads data from a CSV file, API URL, or list and assigns it to a variable.
  </li>
  <li>
    <code>Run Loop (target, *args)</code><br/>
    Runs a loop either by count or by iterating over variable-value pairs.
  </li>
</ul>

</details>

<details>
<summary><strong>🔹 Verifier</strong></summary>

<ul>
  <li>
    <code>Assert Equality (output, expression)</code><br/>
    Compares two values and checks if they are equal.
  </li>
  <li>
    <code>Assert Images Vision (frame, images, element_status, rule)</code><br/>
    Searches for the specified image templates within the frame using vision-based template matching.
  </li>
  <li>
    <code>Assert Presence (elements, timeout=30, rule='any', event_name=None)</code><br/>
    Verifies the presence of given elements using Appium or vision-based fallback logic.
  </li>
  <li>
    <code>Assert Texts Vision (frame, texts, element_status, rule)</code><br/>
    Searches for text in the given frame using OCR and updates element status.
  </li>
  <li>
    <code>Is Element (element, element_state, timeout, event_name)</code><br/>
    Checks if a given element exists.
  </li>
  <li>
    <code>Validate Element (element, timeout=10, rule='all', event_name=None)</code><br/>
    Validates if the given element is present on the screen using defined rule and timeout.
  </li>
  <li>
    <code>Validate Screen (elements, timeout=30, rule='any', event_name=None)</code><br/>
    Validates the presence of a set of elements on a screen using the defined rule.
  </li>
  <li>
    <code>Vision Search (elements, timeout, rule)</code><br/>
    Performs vision-based search to detect text or image elements in the screen.
  </li>
</ul>

</details>


### Setup Development Environment

```bash
git clone git@github.com:mozarkai/optics-framework.git
cd Optics_Framework
pipx install poetry
poetry install --with dev
```

### Running Tests

```bash
poetry install --with tests
poetry run pytest
```

### Build Documentation

```bash
poetry install --with docs
poetry run mkdocs serve
```

### Packaging the Project

```bash
poetry build
```

---

## 📜 Contributing

We welcome contributions! Please follow these steps:

1. Fork the repository.
2. Create a new feature branch.
3. Commit your changes.
4. Open a pull request.

Ensure your code follows **PEP8** standards and is formatted with **Black**.

---

## 🎯 Roadmap

Here are the key initiatives planned for the upcoming quarter:

1. MCP Servicer: Introduce a dedicated service to handle MCP (Model Context Protocol), improving scalability and modularity across the framework.
2. Omniparser Integration: Seamlessly integrate Omniparser to enable robust and flexible element extraction and location.
3. Playwright Integration: Add support for Playwright to enhance browser automation capabilities, enabling cross-browser testing with modern and powerful tooling.
4. Audio Support: Extend the framework to support audio inputs and outputs, enabling testing and verification of voice-based or sound-related interactions.

---

## 📄 License

This 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.

---

## 📞 Support

For support, please open an issue on GitHub or contact us at [@malto101], [@davidamo9] or [lalit@mozark.ai] .

Happy Testing! 🚀

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "optics-framework",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.12",
    "maintainer_email": null,
    "keywords": "test automation, framework, mobile automation",
    "author": "Lalitanand Dandge",
    "author_email": "lalit@mozark.ai",
    "download_url": "https://files.pythonhosted.org/packages/7d/fb/f61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f/optics_framework-1.3.4.tar.gz",
    "platform": null,
    "description": "# Optics Framework\n[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=mozarkai_optics-framework&metric=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&metric=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&metric=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 & 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## \ud83d\ude80 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 & 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## \ud83d\udce6 Installation\n\n### Install via `pip`\n\n```bash\npip install optics-framework\n```\n\n---\n\n## \ud83d\ude80 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> **\u26a0\ufe0f 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### \ud83d\udccc Dry Run Test Cases\n\n```bash\noptics dry_run my_test_project\n```\n\n### \ud83d\udccc Execute Test Cases\n\n```bash\noptics execute my_test_project\n```\n\n---\n\n## \ud83d\udee0\ufe0f Usage\n\n### Execute Tests\n\n```bash\noptics execute <project_name>\n```\n\n### Initialize a New Project\n\n```bash\noptics init --name <project_name> --path <directory> --template <contact/youtube> --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## \ud83c\udfd7\ufe0f Developer Guide\n\n### Project Structure\n\n```bash\nOptics_Framework/\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 dev_requirements.txt\n\u251c\u2500\u2500 samples/            # Sample test cases and configurations\n|   \u251c\u2500\u2500 contact/\n|   \u251c\u2500\u2500 youtube/\n\u251c\u2500\u2500 pyproject.toml\n\u251c\u2500\u2500 tox.ini\n\u251c\u2500\u2500 docs/               # Documentation using Sphinx\n\u251c\u2500\u2500 optics_framework/   # Main package\n\u2502   \u251c\u2500\u2500 api/            # Core API modules\n\u2502   \u251c\u2500\u2500 common/         # Factories, interfaces, and utilities\n\u2502   \u251c\u2500\u2500 engines/        # Engine implementations (drivers, vision models, screenshot tools)\n\u2502   \u251c\u2500\u2500 helper/         # Configuration management\n\u251c\u2500\u2500 tests/              # Unit tests and test assets\n\u2502   \u251c\u2500\u2500 assets/         # Sample images for testing\n\u2502   \u251c\u2500\u2500 units/          # Unit tests organized by module\n\u2502   \u251c\u2500\u2500 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<details>\n<summary><strong>\ud83d\udd39 Core Keywords</strong></summary>\n\n<ul>\n  <li>\n    <code>Clear Element Text (element, event_name=None)</code><br/>\n    Clears any existing text from the given input element.\n  </li>\n  <li>\n    <code>Detect and Press (element, timeout, event_name=None)</code><br/>\n    Detects if the element exists, then performs a press action on it.\n  </li>\n  <li>\n    <code>Enter Number (element, number, event_name=None)</code><br/>\n    Enters a numeric value into the specified input field.\n  </li>\n  <li>\n    <code>Enter Text (element, text, event_name=None)</code><br/>\n    Inputs the given text into the specified element.\n  </li>\n  <li>\n    <code>Get Text (element)</code><br/>\n    Retrieves the text content from the specified element.\n  </li>\n  <li>\n    <code>Press by Coordinates (x, y, repeat=1, event_name=None)</code><br/>\n    Performs a tap at the specified absolute screen coordinates.\n  </li>\n  <li>\n    <code>Press by Percentage (percent_x, percent_y, repeat=1, event_name=None)</code><br/>\n    Taps on a location based on percentage of screen width and height.\n  </li>\n  <li>\n    <code>Press Element (element, repeat=1, offset_x=0, offset_y=0, event_name=None)</code><br/>\n    Taps on a given element with optional offset and repeat parameters.\n  </li>\n  <li>\n    <code>Press Element with Index (element, index=0, event_name=None)</code><br/>\n    Presses the element found at the specified index from multiple matches.\n  </li>\n  <li>\n    <code>Press Keycode (keycode, event_name)</code><br/>\n    Simulates pressing a hardware key using a keycode.\n  </li>\n  <li>\n    <code>Scroll (direction, event_name=None)</code><br/>\n    Scrolls the screen in the specified direction.\n  </li>\n  <li>\n    <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>\n    Scrolls starting from a specific element in the given direction.\n  </li>\n  <li>\n    <code>Scroll Until Element Appears (element, direction, timeout, event_name=None)</code><br/>\n    Continuously scrolls until the target element becomes visible or the timeout is reached.\n  </li>\n  <li>\n    <code>Select Dropdown Option (element, option, event_name=None)</code><br/>\n    Selects an option from a dropdown field by visible text.\n  </li>\n  <li>\n    <code>Sleep (duration)</code><br/>\n    Pauses execution for a specified number of seconds.\n  </li>\n  <li>\n    <code>Swipe (x, y, direction='right', swipe_length=50, event_name=None)</code><br/>\n    Swipes from a coordinate point in the given direction and length.\n  </li>\n  <li>\n    <code>Scroll from Element (element, direction, scroll_length, event_name)</code><br/>\n    Scrolls starting from the position of a given element.\n  </li>\n  <li>\n    <code>Swipe Until Element Appears (element, direction, timeout, event_name=None)</code><br/>\n    Swipes repeatedly until the element is detected or timeout is reached.\n  </li>\n</ul>\n\n</details>\n\n<details>\n<summary><strong>\ud83d\udd39 AppManagement</strong></summary>\n\n<ul>\n  <li>\n    <code>Close And Terminate App(package_name, event_name)</code><br/>\n    Closes and fully terminates the specified application using its package name.\n  </li>\n  <li>\n    <code>Force Terminate App(event_name)</code><br/>\n    Forcefully terminates the currently running application.\n  </li>\n  <li>\n    <code>Get App Version</code><br/>\n    Returns the version of the currently running application.\n  </li>\n  <li>\n    <code>Initialise Setup</code><br/>\n    Prepares the environment for performing application management operations.\n  </li>\n  <li>\n    <code>Launch App (event_name=None)</code><br/>\n    Launches the default application configured in the session.\n  </li>\n  <li>\n    <code>Start Appium Session (event_name=None)</code><br/>\n    Starts a new Appium session for the current application.\n  </li>\n  <li>\n    <code>Start Other App (package_name, event_name)</code><br/>\n    Launches a different application using the provided package name.\n  </li>\n</ul>\n\n</details>\n\n\n<details>\n<summary><strong>\ud83d\udd39 FlowControl</strong></summary>\n\n<ul>\n  <li>\n    <code>Condition </code><br/>\n    Evaluates multiple conditions and executes corresponding modules if the condition is true.\n  </li>\n  <li>\n    <code>Evaluate (param1, param2)</code><br/>\n    Evaluates a mathematical or logical expression and stores the result in a variable.\n  </li>\n  <li>\n    <code>Read Data (input_element, file_path, index=None)</code><br/>\n    Reads data from a CSV file, API URL, or list and assigns it to a variable.\n  </li>\n  <li>\n    <code>Run Loop (target, *args)</code><br/>\n    Runs a loop either by count or by iterating over variable-value pairs.\n  </li>\n</ul>\n\n</details>\n\n<details>\n<summary><strong>\ud83d\udd39 Verifier</strong></summary>\n\n<ul>\n  <li>\n    <code>Assert Equality (output, expression)</code><br/>\n    Compares two values and checks if they are equal.\n  </li>\n  <li>\n    <code>Assert Images Vision (frame, images, element_status, rule)</code><br/>\n    Searches for the specified image templates within the frame using vision-based template matching.\n  </li>\n  <li>\n    <code>Assert Presence (elements, timeout=30, rule='any', event_name=None)</code><br/>\n    Verifies the presence of given elements using Appium or vision-based fallback logic.\n  </li>\n  <li>\n    <code>Assert Texts Vision (frame, texts, element_status, rule)</code><br/>\n    Searches for text in the given frame using OCR and updates element status.\n  </li>\n  <li>\n    <code>Is Element (element, element_state, timeout, event_name)</code><br/>\n    Checks if a given element exists.\n  </li>\n  <li>\n    <code>Validate Element (element, timeout=10, rule='all', event_name=None)</code><br/>\n    Validates if the given element is present on the screen using defined rule and timeout.\n  </li>\n  <li>\n    <code>Validate Screen (elements, timeout=30, rule='any', event_name=None)</code><br/>\n    Validates the presence of a set of elements on a screen using the defined rule.\n  </li>\n  <li>\n    <code>Vision Search (elements, timeout, rule)</code><br/>\n    Performs vision-based search to detect text or image elements in the screen.\n  </li>\n</ul>\n\n</details>\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## \ud83d\udcdc 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## \ud83c\udfaf 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## \ud83d\udcc4 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## \ud83d\udcde Support\n\nFor support, please open an issue on GitHub or contact us at [@malto101], [@davidamo9] or [lalit@mozark.ai] .\n\nHappy Testing! \ud83d\ude80\n",
    "bugtrack_url": null,
    "license": "Apache-2.0",
    "summary": "A flexible and modular test automation framework that can be used to automate any mobile application.",
    "version": "1.3.4",
    "project_urls": null,
    "split_keywords": [
        "test automation",
        " framework",
        " mobile automation"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "0527a41fa0d28267f0e28c041243c666e84335dd683fc44768cbbc706be307cb",
                "md5": "bce678ca0a760ae48e1a44f0495e8ff6",
                "sha256": "27746d8e72d075f6ae6c1bd86ce6b9788533c12736759c6fada0d09b14a457a4"
            },
            "downloads": -1,
            "filename": "optics_framework-1.3.4-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "bce678ca0a760ae48e1a44f0495e8ff6",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.12",
            "size": 170818,
            "upload_time": "2025-07-08T11:28:59",
            "upload_time_iso_8601": "2025-07-08T11:28:59.773176Z",
            "url": "https://files.pythonhosted.org/packages/05/27/a41fa0d28267f0e28c041243c666e84335dd683fc44768cbbc706be307cb/optics_framework-1.3.4-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7dfbf61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f",
                "md5": "103689733d486a77ec4b8e4469302d62",
                "sha256": "b079bc1e8536bb657e82199bd4a5312cbc3d403052038265b54a651cc0eda5c7"
            },
            "downloads": -1,
            "filename": "optics_framework-1.3.4.tar.gz",
            "has_sig": false,
            "md5_digest": "103689733d486a77ec4b8e4469302d62",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.12",
            "size": 133282,
            "upload_time": "2025-07-08T11:29:02",
            "upload_time_iso_8601": "2025-07-08T11:29:02.231303Z",
            "url": "https://files.pythonhosted.org/packages/7d/fb/f61e3d33b1a17467187829130a107fd9d19ba9b4f00743e5f2b1731ec53f/optics_framework-1.3.4.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-08 11:29:02",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "optics-framework"
}
        
Elapsed time: 1.69450s