# OpenHands End-to-End Tests This directory contains end-to-end tests for the OpenHands application. These tests use Playwright to interact with the OpenHands UI and verify that the application works correctly. ## Running the Tests ### Prerequisites - Python 3.12 or later - Poetry - Node.js - Playwright ### Environment Variables The following environment variables are required: - `GITHUB_TOKEN`: A GitHub token with access to the repositories you want to test - `LLM_MODEL`: The LLM model to use (e.g., "gpt-4o") - `LLM_API_KEY`: The API key for the LLM model Optional environment variables: - `LLM_BASE_URL`: The base URL for the LLM API (if using a custom endpoint) ### Configuration Options The E2E tests support several command-line options: - `--base-url`: Specify the base URL of the OpenHands instance under test (default: `http://localhost:12000`) - `--headless`: Run browser in headless mode (default: `true`) - `--no-headless`: Run browser in non-headless mode to watch the browser interactions - `--slow-mo`: Add delay between actions in milliseconds (default: `0`) ### Running Locally To run the full end-to-end test suite locally: ```bash cd tests/e2e poetry run pytest test_settings.py::test_github_token_configuration test_conversation.py::test_conversation_start -v ``` This runs all tests in sequence: 1. GitHub token configuration 2. Conversation start 3. Multi-conversation resume #### Specifying a Custom Base URL By default, the tests run against `http://localhost:12000`. You can specify a different OpenHands instance URL using the `--base-url` option: ```bash cd tests/e2e # Run against a remote instance poetry run pytest test_settings.py::test_github_token_configuration test_conversation.py::test_conversation_start -v --base-url=https://my-openhands-instance.com # Run against a CI instance poetry run pytest test_settings.py::test_github_token_configuration test_conversation.py::test_conversation_start -v --base-url=http://ci-instance:8080 # Run against localhost with a different port poetry run pytest test_settings.py::test_github_token_configuration test_conversation.py::test_conversation_start -v --base-url=http://localhost:3000 ``` ### Running Individual Tests You can run individual tests directly: ```bash cd tests/e2e # Run the GitHub token configuration test poetry run pytest test_settings.py::test_github_token_configuration -v # Run the conversation start test poetry run pytest test_conversation.py::test_conversation_start -v # Run the multi-conversation resume test poetry run pytest test_multi_conversation_resume.py::test_multi_conversation_resume -v # Run individual tests with custom base URL poetry run pytest test_settings.py::test_github_token_configuration -v --base-url=https://my-instance.com ``` ### Running with Visible Browser To run the tests with a visible browser (non-headless mode) so you can watch the browser interactions: ```bash cd tests/e2e poetry run pytest test_settings.py::test_github_token_configuration -v --no-headless --slow-mo=50 poetry run pytest test_conversation.py::test_conversation_start -v --no-headless --slow-mo=50 poetry run pytest test_multi_conversation_resume.py::test_multi_conversation_resume -v --no-headless --slow-mo=50 # Combine with custom base URL poetry run pytest test_settings.py::test_github_token_configuration -v --no-headless --slow-mo=50 --base-url=https://my-instance.com ``` ### GitHub Workflow The tests can also be run as part of a GitHub workflow. The workflow is triggered by: 1. Adding the "end-to-end" label to a pull request 2. Manually triggering the workflow from the GitHub Actions tab ## Test Descriptions ### GitHub Token Configuration Test The GitHub token configuration test (`test_github_token_configuration`) performs the following steps: 1. Navigates to the OpenHands application 2. Checks if the GitHub token is already configured: - If not configured, it navigates to the settings page and configures it - If already configured, it verifies the repository selection is available 3. Verifies that the GitHub token is saved and the repository selection is available ### Conversation Start Test The conversation start test (`test_conversation_start`) performs the following steps: 1. Navigates to the OpenHands application (assumes GitHub token is already configured) 2. Selects the "openhands-agent/OpenHands" repository 3. Clicks the "Launch" button 4. Waits for the conversation interface to load 5. Waits for the agent to initialize 6. Asks "How many lines are there in the main README.md file?" 7. Waits for and verifies the agent's response ### Multi-Conversation Resume Test The multi-conversation resume test (`test_multi_conversation_resume`) performs the following steps: 1. Navigates to the OpenHands application (assumes GitHub token is already configured) 2. Selects the "openhands-agent/OpenHands" repository 3. Clicks the "Launch" button 4. Waits for the conversation interface to load 5. Waits for the agent to initialize 6. Asks about the project name in the pyproject.toml file 7. Waits for and verifies the agent's response 8. Extracts the conversation ID and navigates away from the conversation 9. Resumes the same conversation by navigating via conversation list 10. Verifies that the conversation history is preserved 11. Asks a follow-up question that requires context from the first interaction 12. Verifies that the agent responds with context awareness, demonstrating conversation continuity ### Simple Browser Navigation Test A simple test (`test_simple_browser_navigation`) that just navigates to the OpenHands GitHub repository to verify the browser setup works correctly. ### Local Runtime Test A separate test (`test_headless_mode_with_dummy_agent_no_browser` in `test_local_runtime.py`) that tests the local runtime with a dummy agent in headless mode. ## Troubleshooting If the tests fail, check the following: 1. Make sure all required environment variables are set 2. Check the logs in `/tmp/openhands-e2e-test.log` and `/tmp/openhands-e2e-build.log` 3. Verify that the OpenHands application is running correctly 4. Check the Playwright test results in the `test-results` directory