-
Notifications
You must be signed in to change notification settings - Fork 8
Fix API Reference page not rendering properly #112
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
Copilot
wants to merge
2
commits into
main
Choose a base branch
from
copilot/fix-95
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,366 @@ | ||
| # API Reference | ||
|
|
||
| The Optics Framework provides a comprehensive set of APIs for test automation across different categories. This reference covers all available APIs, their methods, and usage examples. | ||
|
|
||
| ## Core API Modules | ||
|
|
||
| ### ActionKeyword | ||
|
|
||
| The `ActionKeyword` class provides high-level functionality for performing user actions on applications, including pressing elements, scrolling, swiping, and text input. | ||
|
|
||
| #### Methods | ||
|
|
||
| ##### Element Interaction | ||
|
|
||
| - **`press_element(element, event_name=None)`** | ||
| Presses/clicks the specified element using self-healing location strategies. | ||
| - `element`: Element identifier (XPath, image template, or OCR text) | ||
| - `event_name`: Optional event name for logging | ||
|
|
||
| - **`press_by_coordinates(coor_x, coor_y, repeat=1, event_name=None)`** | ||
| Presses at specific screen coordinates. | ||
| - `coor_x`, `coor_y`: Screen coordinates | ||
| - `repeat`: Number of times to repeat the action | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`press_by_percentage(percent_x, percent_y, repeat=1, event_name=None)`** | ||
| Presses at screen position defined by percentage of screen size. | ||
| - `percent_x`, `percent_y`: Percentage coordinates (0-100) | ||
| - `repeat`: Number of times to repeat | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`press_element_with_index(element, index=0, event_name=None)`** | ||
| Presses an element by its index when multiple matches are found. | ||
| - `element`: Element identifier | ||
| - `index`: Zero-based index of the element to press | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`detect_and_press(element, timeout, event_name=None)`** | ||
| Waits for element to appear and then presses it. | ||
| - `element`: Element identifier | ||
| - `timeout`: Maximum wait time in seconds | ||
| - `event_name`: Optional event name | ||
|
|
||
| ##### Form Controls | ||
|
|
||
| - **`press_checkbox(element, event_name=None)`** | ||
| Interacts with checkbox elements. | ||
| - `element`: Checkbox element identifier | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`press_radio_button(element, event_name=None)`** | ||
| Selects radio button elements. | ||
| - `element`: Radio button element identifier | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`select_dropdown_option(element, option, event_name=None)`** | ||
| Selects an option from a dropdown menu. | ||
| - `element`: Dropdown element identifier | ||
| - `option`: Option text to select | ||
| - `event_name`: Optional event name | ||
|
|
||
| ##### Scrolling and Swiping | ||
|
|
||
| - **`scroll(direction, event_name=None)`** | ||
| Performs scroll action in the specified direction. | ||
| - `direction`: Scroll direction ('up', 'down', 'left', 'right') | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`scroll_until_element_appears(element, direction, timeout, event_name=None)`** | ||
| Scrolls until the specified element becomes visible. | ||
| - `element`: Element to find | ||
| - `direction`: Scroll direction | ||
| - `timeout`: Maximum time to scroll | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`scroll_from_element(element, direction, scroll_length, event_name=None)`** | ||
| Scrolls from a specific element position. | ||
| - `element`: Starting element | ||
| - `direction`: Scroll direction | ||
| - `scroll_length`: Distance to scroll | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`swipe(coor_x, coor_y, direction='right', swipe_length=50, event_name=None)`** | ||
| Performs swipe gesture from coordinates. | ||
| - `coor_x`, `coor_y`: Starting coordinates | ||
| - `direction`: Swipe direction | ||
| - `swipe_length`: Swipe distance | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`swipe_until_element_appears(element, direction, timeout, event_name=None)`** | ||
| Swipes until element becomes visible. | ||
| - `element`: Element to find | ||
| - `direction`: Swipe direction | ||
| - `timeout`: Maximum time to swipe | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`swipe_from_element(element, direction, swipe_length, event_name=None)`** | ||
| Swipes from a specific element position. | ||
| - `element`: Starting element | ||
| - `direction`: Swipe direction | ||
| - `swipe_length`: Swipe distance | ||
| - `event_name`: Optional event name | ||
|
|
||
| ##### Text Input | ||
|
|
||
| - **`enter_text(element, text, event_name=None)`** | ||
| Enters text into the specified input element. | ||
| - `element`: Input element identifier | ||
| - `text`: Text to enter | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`enter_text_direct(text, event_name=None)`** | ||
| Enters text directly without targeting a specific element. | ||
| - `text`: Text to enter | ||
| - `event_name`: Optional event name | ||
|
|
||
| ### Verifier | ||
|
|
||
| The `Verifier` class provides methods to verify elements, screens, and data integrity. | ||
|
|
||
| #### Methods | ||
|
|
||
| - **`validate_element(element, timeout=10, rule="all", event_name=None)`** | ||
| Verifies the specified element exists. | ||
| - `element`: Element identifier (Image template, OCR template, or XPath) | ||
| - `timeout`: Time to wait for verification in seconds | ||
| - `rule`: Verification rule ("all" or "any") | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`is_element(element, element_state, timeout, event_name=None)`** | ||
| Checks if an element exists and matches the specified state. | ||
| - `element`: Element identifier | ||
| - `element_state`: Expected state of the element | ||
| - `timeout`: Maximum wait time | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`assert_presence(element, timeout, rule, event_name=None)`** | ||
| Asserts that elements are present using specified rules. | ||
| - `element`: Element or list of elements | ||
| - `timeout`: Time to wait | ||
| - `rule`: Rule for assertion ("all" or "any") | ||
| - `event_name`: Optional event name | ||
|
|
||
| ### FlowControl | ||
|
|
||
| The `FlowControl` class manages control flow operations including loops, conditions, and data handling. | ||
|
|
||
| #### Methods | ||
|
|
||
| - **`condition(*args)`** | ||
| Evaluates multiple conditions and executes corresponding modules if conditions are true. | ||
| - `*args`: Condition parameters | ||
|
|
||
| - **`evaluate(param1, param2)`** | ||
| Evaluates mathematical or logical expressions and stores results in variables. | ||
| - `param1`: First parameter for evaluation | ||
| - `param2`: Second parameter for evaluation | ||
|
|
||
| - **`read_data(input_element, file_path, index=None)`** | ||
| Reads data from CSV files, API URLs, or lists and assigns to variables. | ||
| - `input_element`: Variable to store the data | ||
| - `file_path`: Path to data source | ||
| - `index`: Optional index for specific data item | ||
|
|
||
| - **`run_loop(target, *args)`** | ||
| Runs loops either by count or by iterating over variable-value pairs. | ||
| - `target`: Loop target (module or count) | ||
| - `*args`: Loop parameters | ||
|
|
||
| ### AppManagement | ||
|
|
||
| The `AppManagement` class provides functionality for launching, terminating, and modifying app settings. | ||
|
|
||
| #### Methods | ||
|
|
||
| - **`launch_app(event_name=None)`** | ||
| Launches the specified application. | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`start_appium_session(event_name=None)`** | ||
| Starts an Appium session. | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`start_other_app(package_name, event_name=None)`** | ||
| Starts a different application by package name. | ||
| - `package_name`: Application package identifier | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`close_app(event_name=None)`** | ||
| Closes the current application. | ||
| - `event_name`: Optional event name | ||
|
|
||
| - **`terminate_app(event_name=None)`** | ||
| Terminates the application forcefully. | ||
| - `event_name`: Optional event name | ||
|
|
||
| ## REST API Endpoints | ||
|
|
||
| The Optics Framework also provides a REST API for remote automation control through the FastAPI server. | ||
|
|
||
| ### Session Management | ||
|
|
||
| #### POST `/v1/sessions/start` | ||
| Creates a new automation session. | ||
|
|
||
| **Request Body:** | ||
| ```json | ||
| { | ||
| "driver_sources": ["appium"], | ||
| "elements_sources": ["appium_find_element"], | ||
| "text_detection": ["easyocr"], | ||
| "image_detection": ["templatematch"], | ||
| "project_path": "/path/to/project", | ||
| "appium_url": "http://localhost:4723", | ||
| "appium_config": { | ||
| "platformName": "Android", | ||
| "deviceName": "emulator-5554" | ||
| } | ||
| } | ||
| ``` | ||
|
|
||
| **Response:** | ||
| ```json | ||
| { | ||
| "session_id": "uuid-string", | ||
| "status": "created" | ||
| } | ||
| ``` | ||
|
|
||
| #### DELETE `/v1/sessions/{session_id}/stop` | ||
| Terminates an automation session. | ||
|
|
||
| **Response:** | ||
| ```json | ||
| { | ||
| "status": "terminated" | ||
| } | ||
| ``` | ||
|
|
||
| ### Action Execution | ||
|
|
||
| #### POST `/v1/sessions/{session_id}/action` | ||
| Executes a keyword action within a session. | ||
|
|
||
| **Request Body:** | ||
| ```json | ||
| { | ||
| "mode": "keyword", | ||
| "keyword": "press_element", | ||
| "params": ["element_identifier"] | ||
| } | ||
| ``` | ||
|
|
||
| **Response:** | ||
| ```json | ||
| { | ||
| "execution_id": "uuid-string", | ||
| "status": "SUCCESS", | ||
| "data": {"result": "action_result"} | ||
| } | ||
| ``` | ||
|
|
||
| ### Data Retrieval | ||
|
|
||
| #### GET `/session/{session_id}/screenshot` | ||
| Captures a screenshot of the current screen. | ||
|
|
||
| #### GET `/session/{session_id}/elements` | ||
| Retrieves interactive elements from the current screen. | ||
|
|
||
| #### GET `/session/{session_id}/source` | ||
| Gets the page source of the current application state. | ||
|
|
||
| #### GET `/session/{session_id}/screen_elements` | ||
| Captures screenshot and gets all screen elements in one call. | ||
|
|
||
| ### Event Streaming | ||
|
|
||
| #### GET `/v1/sessions/{session_id}/events` | ||
| Streams real-time events from the automation session using Server-Sent Events (SSE). | ||
|
|
||
| ## Usage Examples | ||
|
|
||
| ### Basic Element Interaction | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is no way to use the user is supposed to |
||
| ```python | ||
| from optics_framework.api.action_keyword import ActionKeyword | ||
|
|
||
| # Initialize action keyword instance | ||
| action = ActionKeyword(builder) | ||
|
|
||
| # Press an element | ||
| action.press_element("login_button") | ||
|
|
||
| # Enter text in a field | ||
| action.enter_text("username_field", "my_username") | ||
|
|
||
| # Scroll until element appears | ||
| action.scroll_until_element_appears("submit_button", "down", 30) | ||
| ``` | ||
|
|
||
| ### Verification | ||
| ```python | ||
| from optics_framework.api.verifier import Verifier | ||
|
|
||
| # Initialize verifier | ||
| verifier = Verifier(builder) | ||
|
|
||
| # Validate element presence | ||
| verifier.validate_element("welcome_message", timeout=15) | ||
|
|
||
| # Check element state | ||
| verifier.is_element("checkbox", "checked", 10) | ||
| ``` | ||
|
|
||
| ### Flow Control | ||
| ```python | ||
| from optics_framework.api.flow_control import FlowControl | ||
|
|
||
| # Initialize flow control | ||
| flow = FlowControl(runner, modules) | ||
|
|
||
| # Read data from CSV | ||
| flow.read_data("user_data", "test_data.csv", 0) | ||
|
|
||
| # Run conditional logic | ||
| flow.condition("${user_data.active}", "equals", "true", "login_module") | ||
| ``` | ||
|
|
||
| ### App Management | ||
| ```python | ||
| from optics_framework.api.app_management import AppManagement | ||
|
|
||
| # Initialize app management | ||
| app_mgmt = AppManagement(builder) | ||
|
|
||
| # Launch application | ||
| app_mgmt.launch_app("test_start") | ||
|
|
||
| # Close application | ||
| app_mgmt.close_app("test_end") | ||
| ``` | ||
|
|
||
| ## Self-Healing Features | ||
|
|
||
| The ActionKeyword class includes self-healing capabilities through the `@with_self_healing` decorator. This feature: | ||
|
|
||
| - Automatically tries multiple location strategies for elements | ||
| - Captures screenshots for debugging when actions fail | ||
| - Provides fallback mechanisms when primary element location fails | ||
| - Logs detailed error information for troubleshooting | ||
|
|
||
| ## Error Handling | ||
|
|
||
| All API methods include comprehensive error handling and logging: | ||
|
|
||
| - Invalid element identifiers raise `ValueError` exceptions | ||
| - Timeout scenarios are logged with appropriate error messages | ||
| - Failed actions trigger fallback strategies when available | ||
| - All operations are logged for debugging and audit purposes | ||
|
|
||
| ## Integration Notes | ||
|
|
||
| - The framework supports multiple driver sources (Appium, screenshot-based) | ||
| - Element location strategies include XPath, image templates, and OCR text | ||
| - All methods support optional event naming for tracking and analytics | ||
| - The API is designed for both programmatic use and CSV-based test definitions | ||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ideally I would like to all API reference to also have a sample usage